2012-03-07 2 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-- 

나는 다음과 같은 헤더가 전송되는 저지 GZIPContentEncodingFilter()를 사용하여 압축, 나는 "잘못된 구문"

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 헤더까지이 동일한 문제 (또는 매우 유사한 문제)가 발생하여 추적했습니다. Jersey 클라이언트에서 POST 할 엔티티 유형을 설정할 때 MultiPartMediaTypes.createFormData()을 사용하여이 문제를 해결할 수있었습니다. 이렇게하면 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 이렇게하면 서버와 클라이언트가 통신 방법 (예 : 압축)에 동의해야하므로 이렇게 할 수 없습니다. HTTP는 요청/응답으로 설계되었으며 서버는 클라이언트가 지원할 수있는 것을 반환 할 수 있습니다. 클라이언트는 "안녕하세요 서버,이 리소스가 필요하며 gzip을 지원하므로 가능한 경우 gzip을 반환 할 수 있습니다."라는 요청에 클라이언트가 보냅니다. :) 클라이언트가 gzip에서 몇 메가 바이트까지 서버로 보내는 상황을 상상해보십시오. 그러나 서버가이를 지원하지 않습니다.

Br, Petr

P. 다음 번엔 Jersey 포럼에 직접 텍스트를 게시하는 것이 좋습니다. ;)