Прокси в Dart/Flutter
Dart — язык программирования для Flutter-приложений. Работа с прокси в Dart осуществляется через стандартный HttpClient и популярные библиотеки (dio, http).
Стандартный HttpClient
HTTP прокси
import 'dart:io';
void main() async {
final client = HttpClient();
// Настройка прокси
client.findProxy = (uri) {
return "PROXY proxy_ip:8080";
};
final request = await client.getUrl(
Uri.parse("https://httpbin.org/ip")
);
final response = await request.close();
await response.transform(utf8.decoder).forEach(print);
client.close();
}
С аутентификацией
import 'dart:io';
void main() async {
final client = HttpClient();
client.findProxy = (uri) {
return "PROXY proxy_ip:8080";
};
// Обработка аутентификации прокси
client.authenticate = (uri, scheme, realm) async {
client.addProxyCredentials(
"proxy_ip",
8080,
"realm",
HttpClientBasicCredentials("username", "password")
);
return true;
};
final request = await client.getUrl(
Uri.parse("https://httpbin.org/ip")
);
final response = await request.close();
await response.transform(utf8.decoder).forEach(print);
client.close();
}
Прямое подключение (без прокси)
client.findProxy = (uri) => "DIRECT";
Условная маршрутизация
client.findProxy = (uri) {
if (uri.host.contains("target-site.com")) {
return "PROXY proxy_ip:8080";
}
return "DIRECT";
};
Библиотека dio
dio — самая популярная HTTP-библиотека для Flutter.
Установка
# pubspec.yaml
dependencies:
dio: ^5.4.0
dio_proxy_adapter: ^0.0.2 # для прокси
HTTP прокси с dio
import 'package:dio/dio.dart';
import 'dart:io';
void main() async {
final dio = Dio();
// Настройка прокси через HttpClient adapter
(dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () {
final client = HttpClient();
client.findProxy = (uri) {
return "PROXY proxy_ip:8080";
};
// Для самоподписанных сертификатов (тестирование)
client.badCertificateCallback = (cert, host, port) => true;
return client;
};
final response = await dio.get("https://httpbin.org/ip");
print(response.data);
}
С аутентификацией
(dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () {
final client = HttpClient();
client.findProxy = (uri) => "PROXY proxy_ip:8080";
client.addProxyCredentials(
"proxy_ip",
8080,
"",
HttpClientBasicCredentials("user", "pass")
);
return client;
};
SOCKS5 прокси
Через socks5_proxy
# pubspec.yaml
dependencies:
socks5_proxy: ^1.0.4
import 'dart:io';
import 'package:socks5_proxy/socks_client.dart';
void main() async {
// Создание SOCKS5 клиента
final proxy = SocksTCPClient.connect(
[ProxySettings(InternetAddress("proxy_ip"), 1080,
password: Password("username", "password"))],
InternetAddress("93.184.216.34"), // целевой IP
80,
);
// Используйте socket для HTTP-запросов
}
Через system proxy с SOCKS
client.findProxy = (uri) {
return "SOCKS5 proxy_ip:1080";
};
Примечание: стандартный HttpClient в Dart поддерживает только PROXY (HTTP) и DIRECT. Для SOCKS нужны сторонние библиотеки.
Flutter-специфика
Настройка для Android
Android требует настройки network_security_config.xml для работы с cleartext HTTP прокси:
<!-- android/app/src/main/res/xml/network_security_config.xml -->
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
Настройка для iOS
Для iOS прокси работает через системные настройки URLSession. Flutter-приложение автоматически использует системный прокси.
Переменные окружения
В debug-режиме можно задать прокси через переменные:
// Через аргументы запуска
// flutter run --dart-define=HTTP_PROXY=http://proxy_ip:8080
Ротация прокси
import 'dart:io';
import 'dart:math';
final proxies = [
"PROXY proxy1:8080",
"PROXY proxy2:8080",
"PROXY proxy3:8080",
];
final random = Random();
void main() async {
final client = HttpClient();
client.findProxy = (uri) {
return proxies[random.nextInt(proxies.length)];
};
// Запросы будут использовать разные прокси
for (var i = 0; i < 10; i++) {
final request = await client.getUrl(
Uri.parse("https://httpbin.org/ip")
);
final response = await request.close();
final body = await response.transform(utf8.decoder).join();
print("Request $i: $body");
}
client.close();
}
Обработка ошибок
try {
final request = await client.getUrl(uri);
final response = await request.close();
// обработка ответа
} on SocketException catch (e) {
print("Connection error: $e");
} on HttpException catch (e) {
print("HTTP error: $e");
} on HandshakeException catch (e) {
print("TLS/SSL error: $e");
} catch (e) {
print("Unexpected error: $e");
}
Заключение
Dart и Flutter предоставляют базовые, но достаточные инструменты для работы с HTTP-прокси. Для продвинутых сценариев (SOCKS5, аутентификация) используйте dio с кастомным HttpClient adapter. При разработке Flutter-приложений учитывайте платформенные особенности Android и iOS.