2013-02-05 16 views
2

語境

我有我用它來上傳文件(斑點)的谷歌應用程序Blob存儲桌面Java應用程序時被卡住。 一切工作正常與直接連接到互聯網,但它不通過HTTP代理(Squid)與身份驗證連接時。JAVA - 使用的HttpClient來發布文件,谷歌通過HTTP代理(SQUID)的應用程序調用execute

我使用的是httpClient 4.2.3,我沒有收到任何錯誤或響應。撥打httpClient.execute(post)時,它會卡住。

代碼

我添加這些行來處理代理身份驗證和它的工作原理以及使用URL時,得到一個頁面:

System.setProperty("http.proxyUser", username); 
    System.setProperty("http.proxyPassword", password);  

我想這些還有:

Authenticator.setDefault(
     new Authenticator() { 
      @Override 
      public PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(
        username, password.toCharArray()); 
      } 
     } 
    ); 

從現在開始,這是與不使用代理時相同的代碼。

首先我下載一個網頁,我得到的URL中使用的文件發佈到Blob存儲區:

URL url = new URL("http://www.example.com/get-upload-url.jsp");   
    String urlWhereToPost=IOUtils.toString(url.openStream()); 

    DefaultHttpClient client = new DefaultHttpClient(); 

在這裏,我們準備多職:

HttpPost post 
      = new HttpPost(urlWhereToPost.trim()); 
    MultipartEntity entity 
      = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

    entity.addPart("key" 
        , new FileBody(new File(jpgFilePath) 
        , "image/jpeg") 
        ); 

    post.setEntity((HttpEntity)entity); 

它是當調用execute時什麼也沒有發生(並且它永遠不會到達下一條指令):

HttpResponse execute = client.execute(post); 

測試

我一直在嘗試一些東西,但沒有奏效:

  • 一開始我還以爲這個問題是使用POST因爲GET工作正常使用URL() 但我試着用HttpClient執行GET和它卡住以及。
  • 我用Wireshark檢查發送到代理的數據包,我看到使用URL()時Wireshark將代理的調用識別爲從代理執行GET的請求。但是當使用httpClient時,它看起來好像請求沒有很好地構建,因爲Wireshark顯示了一個數據包,但不能識別內部請求。
  • 然後我嘗試使用HttpURLConnection來構建POST,它通過代理獲取並從服務器獲得答案,但它看起來像我沒有很好地構建它,因爲appengine沒有找到我發送的文件(但這會是另一個問題...)。

結論

任何有同樣的問題?任何想法?

回答

1

您的代理設置用於Java系統類。 Apache HttpClient應該以不同的方式進行配置。 此鏈接可以幫助:Proxy authentication

+0

對,我試過這個配置,以及和我與你鏈接的代碼再次嘗試,但結果是一樣的,要求 的HttpResponse響應= httpclient.execute(targetHost當它被卡住,httpget); – centellenc

相關問題