2017-04-13 79 views
0

我正在使用適用於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類。我仍然在尋找更優雅的解決方案。 –

回答

1

所以我發現的是,我可以實例化類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