Android AWS S3 TransferUtility静默地忽略ClientConfiguration中的代理设置

问题描述:

我正在使用适用于Android的AWS SDK将对象从S3下载到我的Android平板电脑。在尝试通过代理路由流量(现在我在本地网络上使用Charles Proxy作为测试平台)来限制S3下载的下载速度时,我使用ClientConfiguration.setProxyHost和setProxyPort,但S3 TransferUtility似乎忽略了设置并直接转到AWS S3而不是代理。Android AWS S3 TransferUtility静默地忽略ClientConfiguration中的代理设置

没有代理集的代码工作正常。对象成功下载。代理集的代码行为完全相同,并且代理不显示来自平板电脑的任何连接。

我已经向自己证明,该代理的工作原理是通过在Android平板Wifi设置(手动设置代理)中设置代理主机和端口,代理显示成功通过代理的AWS S3连接。首先,我认为AmazonS3Client完全忽略了我的ClientConfiguration,但我已经证明,当我将ClientConfiguration.setProtocol从HTTPS设置为HTTP时,AWS TransferUtility将从http更改为https作为AWS端点。

代码看起来像其他示例代码,用于设置我可以使用ClientConfiguration和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(); 

} 

// ...后来

TransferObserver observer = transferUtility.download(BuildConfig.S3_BUCKET, key, file); 

正如你可以看到我也试着设置,以便在amazonaws为:最详细的日志记录级别,以获得在代理没有失败一些知名度额外的日志显示。

任何有关AWS SDK为何忽略我的代理的建议,或者我如何设置日志记录以找出有关其失败位置的更多详细信息?

在此先感谢。

+0

什么SDK版本您使用的? –

+0

我使用aws-android-sdk-core和aws-android-sdk-s3 v2.3.8,尽管我试图将它撞到更新的版本(v2.4.0)而没有任何改变。我通过编写一个定制的HttpClient来强制解决方案,这个定制的HttpClient通过代理在execute方法中打开一个连接,但它重复了大部分现有的HttpClient类。我仍然在寻找更优雅的解决方案。 –

所以我发现的是,我可以实例化类com.amazonaws.http.ApacheHttpClient,它将使用包的保护HttpClientFactory配置在clientConfig代理集。

的AmazonS3Client的创建使用不同的构造函数中已经代理配置如下HttpClient的经过:

HttpClient httpClient = new ApacheHttpClient(clientConfig); 

s3Client = new AmazonS3Client(getCredentialsProvider(), clientConfig, httpClient); 
+0

这适用于AWS 2.3.3 – Sebastian