プログラムは、いくつかのファイルを取得して処理し、ZipOutputStream を介して送信し、(通常はかなり大きな) zip ファイルをサーバーにアップロードするように設計されたアプレットです。Apache HttpClient 4.2.1 (および補助ライブラリ) を使用しています。投稿リクエストが特権スペースで実行されています。私が抱えている問題は、Apache/2.2.16 (Win32) がリクエストを拒否することです。Apache エラー ログに「チャンクされた Transfer-Encoding は禁止されています」というエラーが表示されます。
Wireshark を使用して接続をキャプチャすると、リクエストは次のようになります。
POST /data/FileUpload.php?userId=21 HTTP/1.1
Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=PjgV56PRG1T0eeWZNfM3Gumc8v0p8j
Host: 192.168.2.16:8000
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.2.1 (java 1.5)
10be
--PjgV56PRG1T0eeWZNfM3Gumc8v0p8j
Content-Disposition: form-data; name="ZipFile"; filename="JavaUploaderZipStream.zip"
Content-Type: application/zip
Content-Transfer-Encoding: binary
このリクエストを実行するコードは次のとおりです。
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpClient httpclient = new DefaultHttpClient(params);
HttpPost httpPost = new HttpPost(url);
ZipCompressionInputStream zipStream = new ZipCompressionInputStream(fileList);
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.STRICT);
InputStreamBody uploadPart = new InputStreamBody(zipStream, "application/zip", "JavaUploaderZipStream.zip");
reqEntity.addPart("ZipFile", uploadPart);
httpPost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httpPost);
try {
HttpEntity responseEntity = response.getEntity();
EntityUtils.consume(responseEntity);
} finally {
httpPost.releaseConnection();
}
私が知る限り、Apache 2.2 はチャンク データを受け入れるはずです。それを拒否するスイッチは見当たりません。HTTP/1.1 接続を受け付けているようです。なぜそれが私が試みたものを完全に拒否するのか、私は途方に暮れています。