2013-05-17 6 views
8

Salve colleghi sviluppatori java. Ricevo una risposta con intestazioni e il corpo come sotto, ma quando provo a decomprimere usando il codice seguente, non riesce con questa eccezione:Decomprimendo una risposta http gzipata

 
java.io.IOException: Not in GZIP format 

Risposta:

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

Codice:

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); 
} 

Si prega di avvisare.

Grazie,

Pradeep

+0

cos'è il 'calzino'? Se si tratta di un socket, è necessario sapere che le intestazioni e alcune altre cose non sono compressi con gzip. È solo il corpo della risposta. –

risposta

2

L'intestazione MIME non è nel formato gzip, è in formato testo. Devi leggerlo prima di poter decomprimere il flusso.

Inoltre, perché non basta usare questo:

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

puoi dirmi cosa intendi leggendo un'intestazione per favore readHeader (in); ? – Bill

+1

Voglio dire che quando ottieni un file otterrai un'intestazione che dice cose come "Content-type: text/html" che contiene metadati in testo normale. Ogni elemento di metadati è separato da una nuova riga e l'intera intestazione termina con 2 righe nuove, quindi i dati iniziano. http://en.wikipedia.org/wiki/MIME#MIME_headers –

0

I second bmarguiles 'answer.

Solo il corpo (response-body nella RFC) è compresso, in modo che solo bisogno di decomprimere la parte che è dopo il \r\n\r\n.

In generale, è possibile ridurre la risposta a metà da quel doppio CRLF e decomprimere solo la seconda metà.