Uso de proxies em Dart/Flutter
Proxies em Dart/Flutter
Dart é uma linguagem de programação para aplicativos Flutter. O trabalho com proxies em Dart é feito através do HttpClient padrão e de bibliotecas populares (dio, http).
HttpClient padrão
Proxy HTTP
import 'dart:io';
void main() async {
final client = HttpClient();
// Configuração do proxy
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();
}
Com autenticação
import 'dart:io';
void main() async {
final client = HttpClient();
client.findProxy = (uri) {
return "PROXY proxy_ip:8080";
};
// Tratamento da autenticação do proxy
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();
}
Conexão direta (sem proxy)
client.findProxy = (uri) => "DIRECT";
Roteamento condicional
client.findProxy = (uri) {
if (uri.host.contains("target-site.com")) {
return "PROXY proxy_ip:8080";
}
return "DIRECT";
};
Biblioteca Dio
Dio é a biblioteca HTTP mais popular para Flutter.
Instalação
# pubspec.yaml
dependencies:
dio: ^5.4.0
dio_proxy_adapter: ^0.0.2 # para proxies
Proxy HTTP com Dio
import 'package:dio/dio.dart';
import 'dart:io';
void main() async {
final dio = Dio();
// Configuração do proxy via adaptador HttpClient
(dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () {
final client = HttpClient();
client.findProxy = (uri) {
return "PROXY proxy_ip:8080";
};
// Para certificados autoassinados (testes)
client.badCertificateCallback = (cert, host, port) => true;
return client;
};
final response = await dio.get("https://httpbin.org/ip");
print(response.data);
}
Com autenticação
(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;
};
Proxy SOCKS5
Via socks5_proxy
# pubspec.yaml
dependencies:
socks5_proxy: ^1.0.4
import 'dart:io';
import 'package:socks5_proxy/socks_client.dart';
void main() async {
// Criando um cliente SOCKS5
final proxy = SocksTCPClient.connect(
[ProxySettings(InternetAddress("proxy_ip"), 1080,
password: Password("username", "password"))],
InternetAddress("93.184.216.34"), // IP de destino
80,
);
// Use o socket para requisições HTTP
}
Via proxy do sistema com SOCKS
client.findProxy = (uri) {
return "SOCKS5 proxy_ip:1080";
};
Observação: o HttpClient padrão do Dart suporta apenas PROXY (HTTP) e DIRECT. Para SOCKS, são necessárias bibliotecas de terceiros.
Particularidades do Flutter
Configuração no Android
O Android exige a configuração do network_security_config.xml para trabalhar com proxies HTTP sem criptografia (cleartext):
<!-- 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>
Configuração no iOS
No iOS, os proxies funcionam através das configurações de sistema do URLSession. Um aplicativo Flutter usa automaticamente o proxy do sistema.
Variáveis de ambiente
No modo debug, os proxies podem ser definidos através de variáveis:
// Via argumentos de inicialização
// flutter run --dart-define=HTTP_PROXY=http://proxy_ip:8080
Rotação de proxies
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)];
};
// As requisições usarão proxies diferentes
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();
}
Tratamento de erros
try {
final request = await client.getUrl(uri);
final response = await request.close();
// processa a resposta
} 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");
}
Conclusão
Dart e Flutter oferecem ferramentas básicas, mas suficientes, para trabalhar com proxies HTTP. Para cenários avançados (SOCKS5, autenticação), use o Dio com um adaptador HttpClient personalizado. Ao desenvolver aplicativos Flutter, leve em conta as particularidades das plataformas Android e iOS.
