2013-05-17 54 views
8

Xin chào các nhà phát triển java đồng nghiệp. Tôi nhận được phản hồi với tiêu đề và cơ thể như dưới đây, nhưng khi tôi cố gắng để giải nén nó bằng cách sử dụng mã dưới đây, nó không thành công với ngoại lệ này:Giải nén phản hồi http được gzipped

 
java.io.IOException: Not in GZIP format 

đáp ứng:

 
HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Encoding: gzip 
Server: Jetty(6.1.x) 
▼  ═UMs¢0►=7┐ép?╙6-C╚$╢gΩ↓╟±╪₧∟zS╨╓╓♦$FÆ╒÷▀G┬╚╞8N≤╤Cf°►╦█╖╗o↨æJÄ+`:↓2 
♣»└√S▬L&?∙┬_)U╔|♣%ûíyk_à\,æ] hⁿ?▀xΓ∟o╜4♫ù\#MAHG?┤(Q¶╞⌡▌Ç?▼ô[7Fí¼↔φ☻I%╓╣Z♂?¿↨F;x|♦o/A╬♣╘≡∞─≤╝╘U∙♥0☺æ?|J%à{(éUmHµ %σl┴▼Ç9♣┌Ç?♫╡5╠yë~├╜♦íi♫╥╧ 
╬û?▓ε?╞┼→RtGqè₧ójWë♫╩∞j05├╞┘|>┘º∙↑j╪2┐|= ÷² 
eY\╛P?#5wÑqc╙τ♦▓½Θt£6q∩?┌4┼t♠↕=7æƒ╙?╟|♂;║)∩÷≈═^╛{v⌂┌∞◄>6ä╝| 

Mã số:

byte[] b= IOUtils.toByteArray(sock.getInputStream()); 

ByteArrayInputStream bais = new ByteArrayInputStream(b); 
GZIPInputStream gzis = new GZIPInputStream(bais); 
InputStreamReader reader = new InputStreamReader(gzis); 
BufferedReader in = new BufferedReader(reader); 

String readed; 
while ((readed = in.readLine()) != null) { 
    System.out.println("read: "+readed); 
} 

Vui lòng thông báo.

Cảm ơn,

Pradeep

+0

'sock' là gì? Nếu nó là một ổ cắm, bạn nên biết rằng các tiêu đề và một số công cụ khác không được gzipped. Chỉ có cơ thể phản ứng là. –

Trả lời

2

Phần header MIME không nằm trong định dạng GZIP, đó là trong văn bản đơn giản. Bạn phải đọc nó trước khi bạn có thể giải nén luồng.

Ngoài ra, tại sao không chỉ sử dụng này:

InputStream in = sock.getInputStream(); 
readHeader(in); 
InputStream zin = new GZIPInputStream(in); 
+0

bạn có thể cho tôi biết ý của bạn bằng cách đọc một tiêu đề, vui lòng đọcHeader (in); ? – Bill

+1

Tôi có nghĩa là khi bạn nhận được một tệp, bạn sẽ nhận được tiêu đề có nội dung như "Kiểu nội dung: văn bản/html" chứa siêu dữ liệu ở dạng văn bản thuần túy. Mỗi phần tử siêu dữ liệu được phân cách bằng dòng mới và toàn bộ tiêu đề kết thúc bằng 2 dòng mới, sau đó dữ liệu bắt đầu. http://en.wikipedia.org/wiki/MIME#MIME_headers –

0

Câu trả lời thứ hai của bmarguiles '.

Chỉ cơ thể (response-body trong RFC) được nén, vì vậy bạn chỉ cần giải nén các phần đó là sau khi \r\n\r\n.

Nói chung, bạn có thể cắt giảm một nửa phản hồi bằng CRLF kép đó và chỉ giải nén nửa sau.

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