语境
我有一个桌面 JAVA 应用程序,用于将文件(blob)上传到谷歌应用程序 blobstore。直接连接到 Internet 时一切正常,但通过 HTTP 代理 (Squid) 进行身份验证时就不行了。
我正在使用 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());
}
}
);
从现在开始,这与不使用代理时工作的代码相同。
首先,我下载一个页面,在该页面中获取用于将文件发布到 blobstore 的 url:
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 来执行 GET,但它也卡住了。 - 我使用 Wireshark 检查发送到代理的数据包,我看到当使用
URL()
Wireshark 时,将对代理的调用识别为从代理执行 GET 的请求。但是当使用 httpClient 时,看起来请求没有很好地构建,因为 Wireshark 显示了一个数据包但无法识别内部请求。 - 然后我尝试使用构建POST
HttpURLConnection
,它通过代理,我从服务器得到答案,但看起来我没有很好地构建它,因为appengine找不到我发送的文件(但这将是另一个问题.. .)。
结论
有同样问题的人吗?任何想法?