2010-03-19 16 views
8

मैं GZIPInputStream का उपयोग करके एक GZIPed HTTP प्रतिक्रिया को असंप्रेषित करने का प्रयास कर रहा हूं। हालांकि मैं हमेशा एक ही अपवाद है जब मैं धारा पढ़ने की कोशिश: java.util.zip.ZipException: invalid bit length repeatजावा में GZIPed HTTP प्रतिक्रिया को असंप्रेषित करें

मेरे HTTP अनुरोध हेडर: HTTP प्रतिक्रिया हेडर के अंत में

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 

, मैं path=/Content-Encoding: gzip मिलता है, gziped प्रतिक्रिया के बाद ।

मैंने कोशिश की 2 समानता कोड को विस्तारित करने में:

अद्यतन: निम्नलिखित कोड में, tBytes = (the string after 'path=/Content-Encoding: gzip').getBytes();

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

और यह एक है कि मैं इस मंच पर मिल:

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

मुझे लगता है कि यह एक एन्कोडिंग त्रुटि है।

सादर,

bill0ute

उत्तर

9

आप नहीं दिखा है आप कैसे tBytes जिसका उपयोग आप यहाँ gzip धारा स्थापित करने के लिए मिलता है:

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

एक स्पष्टीकरण है कि आप कर रहे हैं tBytes में संपूर्ण HTTP प्रतिक्रिया सहित। इसके बजाय, यह केवल HTTP शीर्षलेख के बाद सामग्री होना चाहिए।

एक और स्पष्टीकरण यह है कि प्रतिक्रिया chunked है।

संपादित करें: आप सामग्री-एन्कोडिंग लाइन के बाद संदेश निकाय के रूप में डेटा ले रहे हैं। हालांकि, HTTP 1.1 विनिर्देश के अनुसार हेडर फ़ील्ड किसी भी विशेष क्रम में नहीं आते हैं, इसलिए यह बहुत खतरनाक है।

अनुरोध (अनुभाग 5):

रूप HTTP specification के इस हिस्से में बताया गया है, एक अनुरोध या प्रतिक्रिया के संदेश के मुख्य भाग पहले खाली पंक्ति के बाद एक विशेष हेडर फ़ील्ड के बाद नहीं आती है लेकिन और प्रतिक्रिया (सेक्शन 6) संदेश जेएफसी आरएफसी 822 [9] के संदेश प्रारूप इकाइयों को स्थानांतरित करने के लिए उपयोग करते हैं ( संदेश का पेलोड)। दोनों प्रकार के संदेश में एक स्टार्ट-लाइन, शून्य या अधिक शीर्षलेख फ़ील्ड (जिसे "हेडर" भी कहा जाता है), एक खाली रेखा (यानी, लाइन सीआरएलएफ से पहले कुछ भी नहीं है) हेडर के अंत को इंगित करती है फ़ील्ड, और संभवतः एक संदेश-शरीर।

तुम अब भी नहीं दिखा है कि कैसे वास्तव में आप tBytes रचना है, लेकिन इस बिंदु पर मैं तुम्हें ग़लती से डेटा है कि आप को संपीड़ित करने की कोशिश में खाली पंक्ति शामिल कर रहे हैं लगता है। संदेश निकाय खाली रेखा के सीआरएलएफ पात्रों के बाद शुरू होता है।

क्या मैं सुझाव दे सकता हूं कि आप संदेश निकालने के बजाय httpclient लाइब्रेरी का उपयोग करें?

+0

हाय विम। आपके उत्तर के लिए धन्यवाद। मैंने यह संदेश बताने के लिए संदेश अपडेट किया है कि मुझे टीबीइट्स कैसे प्राप्त होते हैं। मुझे नहीं लगता कि प्रतिक्रिया खराब हो गई है क्योंकि सामग्री-लंबाई शीर्षलेख है। लेकिन मुझे यकीन नहीं। बिल 0्यूट – bill0ute

+0

हाय विम। मैं HttpClient पैकेज का उपयोग करने की कोशिश कर रहा हूं लेकिन मुझे जावा डॉक नहीं मिल रहा है। मुझे केवल उदाहरण मिलते हैं। क्या आप मुझे सॉकेट से कनेक्ट करने का एक छोटा सा उदाहरण दे सकते हैं और अनुरोध प्राप्त कर सकते हैं? धन्यवाद – bill0ute

+0

ट्यूटोरियल पर एक नज़र डालें, HTTP GET के लिए प्रतिक्रिया निकाय प्राप्त करने के लिए यह एक साधारण उदाहरण है: http://hc.apache.org/httpclient-3.x/tutorial.html अपने मामले में आप चाहेंगे प्रक्रिया 'प्रतिक्रिया बॉडी' की तरह अब आप 'tyytes' को संसाधित करते हैं। –

1

वैसे समस्या है जो मैं यहां देख सकता हूं;

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

इसे ठीक करने के लिए निम्नलिखित का उपयोग करें;

 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); 
          } 
संबंधित मुद्दे