Estoy usando AWS SDK para Android para descargar objetos de S3 a mi tableta Android. En un intento de enrutar el tráfico a través de un proxy (en este momento estoy usando Charles Proxy en mi red local como banco de pruebas) para acelerar la velocidad de descarga de las descargas de S3, estoy usando ClientConfiguration.setProxyHost y setProxyPort pero S3 TransferUtility parece estar ignorando la configuración y yendo directamente a AWS S3, no al proxy.
El código sin el conjunto de proxy funciona bien. Los objetos se descargan correctamente. El código con el conjunto de proxy se comporta exactamente igual y el proxy no muestra ninguna conexión desde la tableta.
Me he probado a mí mismo que el proxy funciona configurando el host y el puerto del proxy en la configuración Wifi de la tableta Android (configurando el proxy manualmente) y el proxy muestra las conexiones de AWS S3 que viajan a través del proxy con éxito.
Al principio, pensé que AmazonS3Client estaba ignorando mi ClientConfiguration por completo, pero probé que cuando establecí ClientConfiguration.setProtocol de HTTPS a HTTP, AWS TransferUtility cambia de http a https como el punto de enlace de AWS.
El código se parece a cualquier otro código de muestra para configurar el proxy que puedo encontrar usando ClientConfiguration y TransferUtility.
ClientConfiguration getClientConfiguration() { return new ClientConfiguration() .withMaxConnections(2) .withProxyHost("192.168.1.137") .withProxyPort(8888) .withConnectionTimeout(30 * 1000) // Wait 30 seconds to make a connection .withSocketTimeout(0); // Keep open connections open indefinitely (we have very large downloads) } public S3Controller(Context context) { java.util.logging.Logger.getLogger("com.amazonaws").setLevel(java.util.logging.Level.FINEST); applicationContext = context.getApplicationContext(); clientConfig = getClientConfiguration(); s3Client = new AmazonS3Client(getCredentials(), clientConfig); transferUtility = new TransferUtility(s3Client, applicationContext); pendingTransfers = new PendingTransferQueue(); }// ... luego
TransferObserver observer = transferUtility.download(BuildConfig.S3_BUCKET, key, file);Como puede ver, también intenté configurar el nivel de registro de amazonaws en FINEST para obtener cierta visibilidad sobre dónde falla el proxy sin que aparezca ningún registro adicional.
¿Alguna sugerencia sobre por qué AWS SDK está ignorando mi proxy o cómo puedo configurar el registro para obtener más detalles sobre dónde está fallando?
Gracias por adelantado.
Entonces, lo que encontré es que puedo instanciar la clase com.amazonaws.http.ApacheHttpClient y usará el paquete HttpClientFactory protegido que configura el conjunto de proxy en clientConfig.
La creación de AmazonS3Client utiliza un constructor diferente para pasar el HttpClient que tiene el proxy configurado de la siguiente manera:
HttpClient httpClient = new ApacheHttpClient(clientConfig); s3Client = new AmazonS3Client(getCredentialsProvider(), clientConfig, httpClient);