Uso de Proxies en Dart/Flutter
Proxies en Dart/Flutter
Dart es un lenguaje de programación para aplicaciones Flutter. Trabajar con proxies en Dart se realiza a través del HttpClient estándar y bibliotecas populares (dio, http).
HttpClient Estándar
Proxy HTTP
import 'dart:io';
void main() async {
final client = HttpClient();
// Configuración del 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();
}
Con Autenticación
import 'dart:io';
void main() async {
final client = HttpClient();
client.findProxy = (uri) {
return "PROXY proxy_ip:8080";
};
// Manejo de la autenticación del 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();
}
Conexión Directa (Sin Proxy)
client.findProxy = (uri) => "DIRECT";
Enrutamiento Condicional
client.findProxy = (uri) {
if (uri.host.contains("target-site.com")) {
return "PROXY proxy_ip:8080";
}
return "DIRECT";
};
Biblioteca Dio
Dio es la biblioteca HTTP más popular para Flutter.
Instalación
# pubspec.yaml
dependencies:
dio: ^5.4.0
dio_proxy_adapter: ^0.0.2 # para proxies
Proxy HTTP con Dio
import 'package:dio/dio.dart';
import 'dart:io';
void main() async {
final dio = Dio();
// Configuración del proxy a través del adaptador HttpClient
(dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () {
final client = HttpClient();
client.findProxy = (uri) {
return "PROXY proxy_ip:8080";
};
// Para certificados autofirmados (pruebas)
client.badCertificateCallback = (cert, host, port) => true;
return client;
};
final response = await dio.get("https://httpbin.org/ip");
print(response.data);
}
Con Autenticación
(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
Vía socks5_proxy
# pubspec.yaml
dependencies:
socks5_proxy: ^1.0.4
import 'dart:io';
import 'package:socks5_proxy/socks_client.dart';
void main() async {
// Creando un cliente SOCKS5
final proxy = SocksTCPClient.connect(
[ProxySettings(InternetAddress("proxy_ip"), 1080,
password: Password("username", "password"))],
InternetAddress("93.184.216.34"), // IP de destino
80,
);
// Usar el socket para solicitudes HTTP
}
Vía Proxy del Sistema con SOCKS
client.findProxy = (uri) {
return "SOCKS5 proxy_ip:1080";
};
Nota: El HttpClient estándar en Dart solo soporta PROXY (HTTP) y DIRECT. Para SOCKS, se requieren bibliotecas de terceros.
Especificidades de Flutter
Configuración de Android
Android requiere la configuración de network_security_config.xml para trabajar con proxies HTTP de texto claro:
<!-- 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>
Configuración de iOS
Para iOS, los proxies funcionan a través de la configuración del sistema URLSession. Una aplicación Flutter utiliza automáticamente el proxy del sistema.
Variables de Entorno
En modo de depuración, los proxies se pueden configurar mediante variables:
// Vía argumentos de lanzamiento
// flutter run --dart-define=HTTP_PROXY=http://proxy_ip:8080
Rotación 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)];
};
// Las solicitudes usarán diferentes proxies
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();
}
Manejo de Errores
try {
final request = await client.getUrl(uri);
final response = await request.close();
// manejar respuesta
} on SocketException catch (e) {
print("Error de conexión: $e");
} on HttpException catch (e) {
print("Error HTTP: $e");
} on HandshakeException catch (e) {
print("Error TLS/SSL: $e");
} catch (e) {
print("Error inesperado: $e");
}
Conclusión
Dart y Flutter proporcionan herramientas básicas pero suficientes para trabajar con proxies HTTP. Para escenarios avanzados (SOCKS5, autenticación), utiliza Dio con un adaptador HttpClient personalizado. Al desarrollar aplicaciones Flutter, considera las características específicas de la plataforma Android e iOS.