2012-03-07 23 views
1

Jerseyを使用するJavaアプリケーションからgzip ed multipart POSTをTomcatサーバーに送信しようとしています。マルチパートリクエストが圧縮されていないときは、正常に動作します。圧縮POSTSの他のタイプは、単一のエンティティXMLを送信するなど、正常に動作します。圧縮データを投稿するのはHTTP標準ではありませんが、Tomcatはある程度サポートしているようです。マルチパートメッセージでHTTP gzipエンコーディング

取り組んで非圧縮マルチポスト:

POST /myApp/rest/data HTTP/1.1 
Content-Type: multipart/mixed; boundary=Boundary_1_23237284_1331130438482 
Cookie: JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXX;Version=1;Path=/myApp/ 
MIME-Version: 1.0 
User-Agent: Java/1.6.0_26 
Host: localhost:8080 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
Connection: keep-alive 
Transfer-Encoding: chunked 

d3 
--Boundary_1_23237284_1331130438482 
Content-Type: application/octet-stream 
Content-Disposition: form-data; filename="uploadFile.war"; modification-date="Wed, 29 Feb 2012 18:01:38 GMT"; size=25343899; name="file" 

{binary data here} 
--Boundary_1_25179713_1331128929019 
Content-Type: application/xml 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myXMLEntity>stuff</myXMLEntity> 
--Boundary_1_25179713_1331128929019-- 

私は、以下のヘッダが送信されジャージー​​を使用して、それを圧縮して、私は「不正な構文」

POST /myApp/rest/data HTTP/1.1 
Content-Type: multipart/mixed 
Cookie: JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;Version=1;Path=/myApp/ 
Accept-Encoding: gzip 
Content-Encoding: gzip 
User-Agent: Java/1.6.0_26 
Host: localhost:8080 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
Connection: keep-alive 
Transfer-Encoding: chunked 

{binary data here} 
の説明に戻ってHTTP 400を取得すると

私がしようとしていることは可能ですか? Content-Typeは実際にmultipart/x-gzipを読み込む必要がありますか?私はそれが圧縮されると、境界のテキストがContent-Typeヘッダーの中に残されていることに気が付いています - これはまた問題ですか?

答えて

4

私はこの同じ問題(または非常に類似したもの)に走ったとGZIPContentEncodingFilterを使用しているときboundaryパラメータが欠落しているContent-Typeヘッダにそれを追跡しました。私はMultiPartMediaTypes.createFormData()を使用して、JerseyクライアントからPOSTしていたエンティティのタイプを設定することで回避することができました。これにより、boundaryパラメータがJerseyが自動的に設定するよりも前に設定されていることが確認されます。これは、要求エンティティの圧縮にGZIPContentEncodingFilterを使用すると遅すぎるようです。 multipart/mixedと同等の方法があります。

私が持っていないIDE便利これに似た何か:サーバーがGZIP圧縮された要求を処理することができる場合

// client is a Jersey Client object 
client.resource(uri).entity(multipartFormData, MultiPartMediaTypes.createFormData()).post(ClientResponse.class); 

言ったことすべてが、これはまだのみ動作します。

0

IMOサーバとクライアントが通信方法(例:ZIP圧縮)に同意する必要があるため、このようにすることはできません。 HTTPは要求/応答として設計されており、サーバーはクライアントがサポートできるものを返すことができます。 クライアントは「おいてサーバー、私はこのリソースが必要です。私はgzipをサポートしていますので、gzipを返すことができます。 :) クライアントがgzipで数メガバイトをサーバーに送信する状況を想像してください。ただし、サーバーはこれをサポートしていません。

Br、Petr

P.S.次回は、Jerseyフォーラムに直接テキストを投稿する方が良いでしょう。 ;)

関連する問題