環境
ファイル (ブロブ) を Google アプリのブロブストアにアップロードするために使用するデスクトップ JAVA アプリケーションがあります。インターネットへの直接接続ではすべて正常に動作しますが、認証を使用して 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());
}
}
);
これ以降、これはプロキシを使用しない場合に機能するのと同じコードです。
まず、ブロブストアにファイルを投稿するために使用する 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 );
テスト
私はいくつかのことを試してきましたが、何もうまくいきませんでした:
- 最初は、問題は GET を使用して POST を使用していると思っていましたが、
URL()
使用して GET を実行しようとしHttpClient
たところ、スタックしてしまいました。 - Wireshark を使用してプロキシに送信されたパケットを確認したところ、Wireshark を使用すると、プロキシ
URL()
への呼び出しがプロキシからの GET を実行する要求として認識されることがわかりました。しかし、httpClient を使用すると、Wireshark はパケットを表示しますが、内部の要求を認識しないため、要求が適切に構築されていないように見えます。 - 次に、使用して POST を構築しよう
HttpURLConnection
としましたが、プロキシを通過し、サーバーから回答を取得しましたが、送信したファイルが appengine で見つからないため、うまく構築できていないようです (ただし、これは別の質問になります.. .)。
結論
同じ問題を抱えている人はいますか?何か案が?