2013-02-05 18 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

相关问题