带有多部分消息的HTTP gzip编码

时间:2012-03-07 15:54:29

标签: java apache http tomcat jersey

我正在尝试使用Jersey从Java应用程序向Tomcat服务器发送gzip ed multipart POST。当多部分请求未被压缩时,它完全正常。其他类型的压缩POSTS工作正常,例如发送单个实体XML。我(相信)发布压缩数据不是HTTP标准,但似乎Tomcat在某种程度上支持它。

工作未压缩的多部分帖子:

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--

当我使用Jersey GZIPContentEncodingFilter()压缩它时,会发送以下标题,然后我返回一个带有“语法不正确”描述的HTTP 400

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}

我正在尝试做什么? Content-Type实际上应该阅读multipart/x-gzip吗?我注意到当它被压缩时,边界文本被排除在Content-Type标题之外 - 这也是一个问题吗?

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题(或非常相似的问题),并在使用Content-Type时将其跟踪到boundary标头缺少GZIPContentEncodingFilter参数。在设置我从Jersey客户端POST的实体的类型时,我能够使用MultiPartMediaTypes.createFormData()来解决它。这样做可以确保boundary参数的设置早于Jersey会自动设置它,这在使用GZIPContentEncodingFilter压缩请求实体时似乎为时已晚。 multipart/mixed有一个等效的方法。

我没有IDE,但有类似的东西:

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

所有这一切,只有当您的服务器能够处理GZIP压缩请求时,这仍然有效。

答案 1 :(得分:0)

IMO你不能那样做,因为服务器和客户端需要就如何沟通达成一致(例如zip压缩)。 HTTP被设计为请求/响应,服务器可以返回客户端可以支持的内容。 客户端发出请求,说“嘿服务器,我需要这个资源,我支持gzip,所以如果可以,你可以返回gzip”。 :) 想象一下您的客户端以gzip的形式向服务器发送几兆字节的情况,但服务器不支持此功能。

Br,Petr

P.S。下次在泽西论坛直接发布文本会更好。 ;)