2010-04-07 27 views
6

Tôi đang giải quyết một số vấn đề với một trong các dịch vụ nguồn dữ liệu của mình. Như nó nói trong tiêu đề phản hồi HTTP nó đang chạy trên Apache-Coyote/1.1. Server cung cấp cho phản ứng với Transfer-Encoding: chunked, đây mẫu phản ứng:Tomcat gzip trong khi vấn đề chunked

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 

Và vấn đề là khi tôi đang yêu cầu máy chủ để gửi yêu cầu đã giải nén nó thường không được gửi trả lời đầy đủ. Tôi nhận được phản ứng, thấy rằng đoạn cuối cùng nhận được, nhưng sau đó sau khi giải nén tôi thấy rằng phản ứng là một phần. Tôi chưa bao giờ thấy hành vi như vậy với gzip bị tắt trong tiêu đề yêu cầu.

Vì vậy, câu hỏi của tôi là: vấn đề tomcat thường gặp phải không? có lẽ một trong số đó là mod đang nén? Hoặc có lẽ nó có thể là một số loại vấn đề proxy? Tôi không thể nói về các phiên bản của tomcat hoặc những gì gzip mod họ sử dụng, nhưng cảm thấy tự do để yêu cầu, tôi sẽ cố gắng yêu cầu nhà cung cấp dịch vụ của tôi.

Cảm ơn.

+0

Khách hàng/thư viện nào bạn đang sử dụng để đưa ra yêu cầu? – Asaph

+0

Bạn có thể đăng tiêu đề yêu cầu của mình không? – Asaph

+0

Tôi đang sử dụng triển khai HTTP một phần của riêng mình như tôi đã nói nó hoạt động tốt mà không có mã hóa gzip và trong hầu hết các trường hợp hoạt động tốt cho gzipped, nhưng giống như 30% phản hồi gzipped là crap sau khi giải mã! Yêu cầu của tôi như: POST http://example.com/Service HTTP/1.1 Content-Length: 1081 Content-Encoding: gzip Accept-Encoding: gzip Host: example.com User-Agent: Mozilla/4.0 (tương thích; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705) Cấp phép: Cơ bản UENDN0IySjpTb3KxdWE3YjJq Hành động SOAP: http://example.com/Service // và đây là của tôi yêu cầu nén .. – hoodoos

Trả lời

2

Do độ dài nội dung của phản hồi gzipped là không thể đoán trước và có thể tốn kém và chậm để nén hoàn toàn bộ nhớ trước, sau đó tính toán độ dài và sau đó truyền phản hồi gzipped từ bộ nhớ, máy chủ web trung bình sẽ gửi chúng theo khối Transfer-Encoding:chunkedmà không cần một tiêu đề Content-Length.

Vì đây là một ứng dụng khách HTTP được phát triển tự động, có vẻ như nó không xử lý đúng yêu cầu chunked. Bạn phải xác định tiêu đề phản hồi Transfer-Encoding và nếu nó bằng chunked, thì bạn phải phân tích cú pháp đó dưới dạng luồng chunked.

Bạn có thể tìm hiểu từ các liên kết thông số HTTP nói trên và từ Wikipedia cách phân tích cú pháp luồng chunked. Mỗi đoạn bao gồm một tiêu đề biểu thị độ dài đoạn trong hệ thập lục phân, sau đó một CRLF, sau đó là nội dung đoạn thực tế, sau đó là một CRLF. Điều này được lặp lại cho đến khi một đoạn có tiêu đề biểu thị độ dài đoạn là 0. Bạn cần phải giải nén các khối riêng biệt và sau đó dán chúng lại với nhau.

Để lưu tất cả công việc mã hóa tẻ nhạt (cũng có thể cho phần còn lại của máy khách HTTP trong nhà), tôi khuyên bạn nên xem Apache HttpComponents Client.

+0

Nó hoạt động hoàn hảo với các trang web khác, và với dịch vụ này nếu tôi tắt gzipping. Tôi thực sự cài đặt tomcat bản thân mình trên máy tính của tôi và nó không cung cấp nội dung đôi khi quá. Tôi sẽ rất vui khi nghĩ rằng đó là vấn đề của tôi, nhưng nếu tôi sử dụng .net wrapper để gọi các phương thức của dịch vụ này (không thực hiện http của tôi) nó cũng không nhận được phản hồi XML đầy đủ đôi khi giống như khách hàng của tôi. Bạn có quen thuộc với tomcat? – hoodoos

+0

Làm thế nào bạn có chắc chắn rằng vấn đề là trong Tomcat và không phải trong ứng dụng phía máy chủ chạy trên Tomcat?Nếu chúng ta nên xem xét hướng này vì nguyên nhân, thì tôi sẽ kiểm tra nếu không có bất kỳ mã Java (servlet) nào gzips thủ công đầu ra bằng cách sử dụng 'GzipOutputStream' và nếu như vậy, sau đó kiểm tra xem nó có gọi đúng' close() 'hay không trên outputstream. – BalusC

+0

thực sự, nó đã thực sự mã MY làm khối loại bỏ :) lạ tôi đã không expirience với máy chủ web khác sau đó tomcat! tôi sẽ xem xét thêm để tìm sự khác biệt thực sự. – hoodoos

Các vấn đề liên quan