2010-03-19 12 views
8

Bir GZIPed HTTP Yanıtını GZIPInputStream kullanarak açmaya çalışıyorum. java.util.zip.ZipException: invalid bit length repeatJava'da GZIPed HTTP Yanıtını Aç

Benim HTTP İstek Başlığı: Ben akışı okumaya çalışırken Ancak hep aynı istisna var HTTP Yanıt başlığının sonunda

GET www.myurl.com HTTP/1.0\r\n 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2) Gecko/20100115 Firefox/3.6\r\n 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n 
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\r\n 
Accept-Encoding: gzip,deflate\r\n 
Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n 
Keep-Alive: 115\r\n 
Connection: keep-alive\r\n 
X-Requested-With: XMLHttpRequest\r\n 
Cookie: Some Cookies\r\n\r\n 

, ben gziped tepki ardından path=/Content-Encoding: gzip olsun .

GÜNCELLEME:

Ben sıkıştırmayı 2 benzerleri kodları çalıştı aşağıdaki kodları olarak,

GZIPInputStream gzip = new GZIPInputStream (new ByteArrayInputStream (tBytes)); 

StringBuffer szBuffer = new StringBuffer(); 

byte tByte [] = new byte [1024]; 

while (true) 
{ 
    int iLength = gzip.read (tByte, 0, 1024); // <-- Error comes here 

    if (iLength < 0) 
     break; 

    szBuffer.append (new String (tByte, 0, iLength)); 
} 

tBytes = (the string after 'path=/Content-Encoding: gzip').getBytes(); Ve bu forum üzerinde bu bir:

InputStream  gzipStream = new GZIPInputStream (new ByteArrayInputStream (tBytes)); 
Reader   decoder = new InputStreamReader (gzipStream, "UTF-8");//<- I tried ISO-8859-1 and get the same exception 
BufferedReader buffered = new BufferedReader (decoder); 

sanırım Bu bir kodlama hatasıdır.

Saygılarımızla,

bill0ute

cevap

9

Sen kullandığınız tBytes burada gzip akış kurmanın nasıl ulaştığını göstermeyiz:

GZIPInputStream gzip = new GZIPInputStream (new ByteArrayInputStream (tBytes)); 

açıklamalardan biri size olmasıdır HTTP yanıtının tamamı tBytes'da dahil. Bunun yerine, yalnızca HTTP üstbilgilerinden sonraki içerik olmalıdır.

Başka bir açıklama, yanıtın chunked olmasıdır.

düzenleme: Verileri içerik kodlama satırından sonra ileti gövdesi olarak alıyorsunuz. Ancak, HTTP 1.1 belirtimine göre, başlık alanları belirli bir sırada gelmez, bu yüzden bu çok tehlikelidir.

İsteği (bölüm 5):

olarak HTTP specification bu bölümünde açıklandığı, bir istek ya da yanıtın ileti gövdesi ilk boş satırda sonra belirli bir başlık alanı peşine değil, ve Yanıt (bölüm 6) iletileri, aktarım öğelerini ( iletisinin yükü) için RFC 822 [9] genel ileti biçimini kullanır. mesaj Her iki tür bir başlangıç ​​çizgi, sıfır veya daha fazla başlık alanları (aynı zamanda "başlıkları" olarak da bilinir), boş hat oluşmaktadır (yani CRLF önceki bir şey olmayan bir çizgi) başlığının sonunu belirten alanları ve muhtemelen bir ileti gövdesi.

Hala tBytes oluşturmak, ancak bu noktada ben yanlışlıkla sen sıkıştırmasını deneyin verilerde boş satır dahil düşünüyorum tam olarak nasıl göstermek değil. Mesaj gövdesi, boş satırın CRLF karakterlerinden sonra başlar.

Sana ileti gövdesini çıkarmak için yerine httpclient kütüphane kullanmanızı önerebilir miyim?

+0

Merhaba Wim. Cevabınız için teşekkürler. İletiyi tBytes'i nasıl aldığımı açıklamak için güncelledim. Bir Content-Length başlığı olduğu için yanıtın parçalanmış olduğunu düşünmüyorum. Ama emin değilim. bill0ute – bill0ute

+0

Merhaba Wim. HttpClient paketini kullanmaya çalışıyorum ama Java Doc bulamıyorum. Sadece örnekleri aldım. Bana bir sokete bağlanma ve bir getiri isteği göndermek için küçük bir örnek verebilir misiniz? Eğer isteyeceksiniz Senin durumunda http://hc.apache.org/httpclient-3.x/tutorial.html: Teşekkürler – bill0ute

+0

öğretici bir göz atın, bu HTTP GET için yanıt gövdesini almak için basit bir örnek process 'responseBody' gibi şimdi 'tBytes' işlemek. –

1

Eh burada görebilirsiniz sorun vardır;

int iLength = gzip.read (tByte, 0, 1024); 

Bunu düzeltmek için aşağıdakileri kullanın;

 byte[] buff = new byte[1024]; 
byte[] emptyBuff = new byte[1024]; 
          StringBuffer unGzipRes = new StringBuffer(); 

          int byteCount = 0; 
          while ((byteCount = gzip.read(buff, 0, 1024)) > 0) { 
           // only append the buff elements that 
           // contains data 
           unGzipRes.append(new String(Arrays.copyOf(
             buff, byteCount), "utf-8")); 

           // empty the buff for re-usability and 
           // prevent dirty data attached at the 
           // end of the buff 
           System.arraycopy(emptyBuff, 0, buff, 0, 
             1024); 
          }