2010-04-07 6 views
6

내 데이터 소스 서비스 중 일부 문제가 만료되었습니다. HTTP 응답 헤더에서 Apache-Coyote/1.1에서 실행 중이라고 나와 있습니다. 청크 분할, 여기에 샘플 응답 : 나는 종종 전체 응답을하지 전송 gzip으로 압축 된 요청을 보낼 서버를 요청하고있을 때청크 발행시 Tomcat gzip

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Content-Type: text/xml;charset=utf-8 
Transfer-Encoding: chunked 
Content-Encoding: gzip 
Date: Tue, 30 Mar 2010 06:13:52 GMT 

그리고 문제가 서버는 전송 인코딩과 응답을 제공합니다. 응답을 받으면 마지막 덩어리가 수신되는 것을 확인합니다. 그러나 뽑지 않은 후에 응답은 부분적입니다. 요청 헤더에서 gzip을 꺼서 이러한 동작을 보지 못했습니다.

제 질문은 : 일반적인 바람둥이 문제입니까? 어쩌면 그것 중 하나는 압축을하고있는 모드인가? 아니면 프록시 문제 일 수도 있습니다. 나는 바람둥이의 버전이나 그들이 사용하는 gzip mod에 대해 말할 수는 없지만 자유롭게 물어 보면 서비스 제공자에게 물어볼 것입니다.

감사합니다.

+0

요청하는 데 사용하는 클라이언트/라이브러리는 무엇입니까? – Asaph

+0

요청 헤더를 게시 할 수 있습니까? – Asaph

+0

나는 gzip 인코딩없이 잘 작동한다고 말했고, 대부분의 경우 gzipped에 대해 잘 작동한다고하지만, 부분적으로 HTTP 구현을 사용하고 있습니다. gzipped 응답의 30 %는 압축 후 쓰레기처럼 보입니다! 내 요청과 같은 : POST http://example.com/Service HTTP/1.1 콘텐츠 길이 : 1081 콘텐츠 인코딩 : gzip을 수락 - 인코딩 : gzip을 호스트 : example.com 사용자 에이전트 : 모질라/4.0 (호환 가능, MSIE 6.0, Windows NT 5.1, .NET CLR 1.1.4322, .NET CLR 1.0.3705) 인증 : 기본 UENDN0IySjpTB3KxdWE3YjJq SOAPAction : http://example.com/Service // 여기 있습니다. 압축 된 요청 .. – hoodoos

답변

2

gzipped 응답의 콘텐츠 길이는 예측할 수 없기 때문에 비싸고 메모리에서 먼저 완전히 압축해야하므로 길이를 계산 한 다음 gzipped 응답을 메모리에서 스트리밍하기 때문에 평균 웹 서버는 다음을 사용하여 청크로 전송합니다 Transfer-Encoding:chunked a Content-Length 헤더 없음.

자체 개발 한 HTTP 클라이언트이기 때문에 마치 청크 요청을 올바르게 처리하지 않는 것처럼 들립니다. Transfer-Encoding 응답 헤더를 결정해야하며 chunked과 같으면 청크 스트림으로 구문 분석해야합니다.

위에서 언급 한 HTTP 사양 링크 및 Wikipedia에서 청크 스트림을 구문 분석하는 방법을 알 수 있습니다. 각 청크는 16 진수의 청크 길이를 나타내는 헤더, 그 다음 CRLF, 실제 청크 컨텐츠, 그리고 CRLF로 구성됩니다. 이것은 청크 길이가 0 인 것을 나타내는 헤더가있는 청크까지 반복됩니다. 청크를 개별적으로 풀고 풀로 붙일 필요가 있습니다.

지루한 코딩 작업 (자국의 HTTP 클라이언트의 잔여 사용자도있을 수 있음)을 모두 저장하려면 Apache HttpComponents Client을 사용하는 것이 좋습니다.

+0

다른 사이트와 완벽하게 작동하며 gzipping을 해제하면이 서비스와 함께 작동합니다. 실제로 Tomcat을 제 작업기에 직접 설치했으며 때로는 내용을 전달하지 못합니다. 그게 내 문제라고 생각하면 행복 할거야 .net 래퍼를 사용하여이 서비스의 메소드 (내 http 구현이 아닌)를 호출하면 내 클라이언트처럼 전체 XML 응답을받지 못한다. 바람둥이에 익숙하니? – hoodoos

+0

문제가 Tomcat에 있고 Tomcat에서 실행중인 서버 측 응용 프로그램에없는 것은 확실합니까?우리가이 방향으로 그 원인을 조사해야한다면'GzipOutputStream'을 사용하여 출력을 수동으로 gzip하는 자바 (서블릿) 코드가 없는지 확인하고, 그렇다면'close()'를 제대로 호출하는지 확인해야합니다. outputstream에. – BalusC

+0

실제로, 그것은 내 코드가 덩어리 제거를하고 있었다 :) 이상한 나는 다른 웹 서버와 그 다음 바람둥이와의 expirience를하지 않았다! 나는 차이를 실제로 발견하기 위해 더 살펴볼 것입니다. – hoodoos