2012-03-18 14 views
11

मैंने पायथन में क्लाइंट/सर्वर आर्किटेक्चर बनाया है, मैं क्लाइंट से HTTP अनुरोध लेता हूं जो मेरे कोड के माध्यम से किसी अन्य HTTP सर्वर का अनुरोध करके परोसा जाता है।पाइथन में HTTP प्रतिक्रिया में लौटाए गए gzip संपीड़ित डेटा को डीकोड कैसे करें?

जब मुझे तीसरे सर्वर से प्रतिक्रिया मिलती है तो मैं gzip संपीड़ित डेटा को डीकोड करने में सक्षम नहीं हूं, मैंने पहले \r\n का उपयोग करके अलग-अलग वर्ण के रूप में प्रतिक्रिया डेटा विभाजित किया जिसने मुझे सूची में अंतिम आइटम के रूप में डेटा प्राप्त किया, फिर मैंने कोशिश की

zlib.decompress(data[-1]) 

लेकिन यह मुझे गलत शीर्षकों की त्रुटि दे रहा है। मुझे इस समस्या के साथ कैसे जाना चाहिए?

कोड

client_reply = '' 
       while 1: 
        chunk = server2.recv(512) 
        if len(chunk) : 
         client.send(chunk) 
         client_reply += chunk 
        else: 
         break 
       client_split = client_reply.split("\r\n") 
       print client_split[-1].decode('zlib') 

मैं डेटा है कि ग्राहक और 2 सर्वर के बीच स्थानांतरित कर दिया गया है पढ़ना चाहते हैं।

+1

हमें कोड दिखाएं! क्या आप सुनिश्चित हैं कि डेटा को अनुचित रूप से एन्कोड/डीकोड नहीं किया गया है (यानी इसे बाइनरी डेटा के रूप में माना जाना चाहिए)? – Cameron

+0

यह हो सकता है कि आपका डेटा एकाधिक हिस्सों में विभाजित हो और आपको सही लंबाई प्राप्त करने के लिए शीर्षलेख को पार्स करने की आवश्यकता हो। Gzipped शीर्षलेख की लंबाई –

+0

है यदि संपीड़ित डेटा को "\ r \ n" में मिला है, और आप इसे तोड़ते हैं और सभी संकुचित डेटा के बजाय इसका केवल एक हिस्सा डीकोड करते हैं? मैं सर्वर में "\ r \ n" को खोजने की कोशिश करता हूं इससे पहले कि आप इसे सत्यापित करने के लिए भेज दें। –

उत्तर

1

https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html के अनुसार शीर्षलेख और शरीर को केवल खाली सीआरएलएफ वर्ण वाले खाली रेखा से अलग किया जाता है। दो आइटम, हेडर और शरीर के साथ परिणाम सरणी जा रहा है - आप

client_split = client_reply.split("\r\n\r\n",1) 
print client_split[1].decode('zlib') 

की कोशिश कर सकते विभाजन खाली पंक्ति पाता है और अतिरिक्त पैरामीटर विभाजन की संख्या को सीमित। लेकिन आपके कोड और वास्तविक स्ट्रिंग को विभाजित करने के बारे में और जानने के बिना कुछ भी सिफारिश करना मुश्किल है।

4

उदाहरण के लिए zlib.decompress(string, wbits, bufsize) का उपयोग करते समय wbits निर्दिष्ट करें उदाहरण के लिए "समस्या निवारण" का अंत देखें।

समस्या निवारण

आ कर्ल आदेश है कि एक अज्ञात "सामग्री-एन्कोडिंग" के साथ एक बाइट दूरी प्रतिक्रिया टिप्पणी डाउनलोड करता है (के साथ शुरू की सुविधा देता है: हम पहले से जानते हैं कि यह संकुचित बात किसी प्रकार का, deflate शायद gzip है mabye):

export URL="https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2016-18/segments/1461860106452.21/warc/CC-MAIN-20160428161506-00007-ip-10-239-7-51.ec2.internal.warc.gz" 
curl -r 266472196-266527075 $URL | gzip -dc | tee hello.txt 
निम्नलिखित प्रतिक्रिया हेडर के साथ

:

HTTP/1.1 206 Partial Content 
x-amz-id-2: IzdPq3DAPfitkgdXhEwzBSwkxwJRx9ICtfxnnruPCLSMvueRA8j7a05hKr++Na6s 
x-amz-request-id: 14B89CED698E0954 
Date: Sat, 06 Aug 2016 01:26:03 GMT 
Last-Modified: Sat, 07 May 2016 08:39:18 GMT 
ETag: "144a93586a13abf27cb9b82b10a87787" 
Accept-Ranges: bytes 
Content-Range: bytes 266472196-266527075/711047506 
Content-Type: application/octet-stream 
Content-Length: 54880 
Server: AmazonS3 
तो बात करने के लिए

curl -r 266472196-266472208 $URL | xxd

हेक्स उत्पादन:

0000000: 1f8b 0800 0000 0000 0000 ecbd eb 

हम क्या हम हेक्स मान के साथ साथ काम कर रहे के कुछ मूल बातें देख सकते हैं

पहले 10 बाइट्स की हेक्स उत्पादन प्रदर्शित करने देता है।

मोटे तौर पर एक संशोधन समय (0000 0000) के बिना अपनी शायद एक gzip (1f8b) हवा निकालना का उपयोग कर (0800) जिसका अर्थ है, या किसी भी अतिरिक्त निशानी नहीं लगाई (00), एक FAT32 प्रणाली (00) का उपयोग कर।

कृपया अनुभाग 2.3/2.3 देखें।1: https://tools.ietf.org/html/rfc1952#section-2.3.1

तो अजगर पर

:

>>> import requests 
>>> url = 'https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2016-18/segments/1461860106452.21/warc/CC-MAIN-20160428161506-00006-ip-10-239-7-51.ec2.internal.warc.gz' 
>>> response = requests.get(url, params={"range":"bytes=257173173-257248267"}) 
>>> unknown_compressed_data = response.content 

नोटिस कुछ भी समान ?:

>>> unknown_compressed_data[:10] 
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00' 

और सिर्फ (documentation) के आधार पर यादृच्छिक पर कोशिश करते हैं विसंपीड़न करने पर:

>>> import zlib 

"zlib.error: त्रुटि -2 जबकि प्रीपा अंगूठी डेटा को संपीड़ित: असंगत धारा राज्य ":

>>> zlib.decompress(unknown_compressed_data, -31) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
zlib.error: Error -2 while preparing to decompress data: inconsistent stream state 

" त्रुटि -3 डेटा decompressing जबकि: गलत हेडर की जांच ":

>>> zlib.decompress(unknown_compressed_data) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
zlib.error: Error -3 while decompressing data: incorrect header check 

" zlib.error: त्रुटि -3 जबकि decompressing डेटा: अवैध दूरी बहुत दूर वापस ":

>>> zlib.decompress(unknown_compressed_data, 30) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
zlib.error: Error -3 while decompressing data: invalid distance too far back 

संभव रों olution:

>>> zlib.decompress(unknown_compressed_data, 31) 
'WARC/1.0\r\nWARC-Type: response\r\nWARC-Date: 2016-04-28T20:14:16Z\r\nWARC-Record-ID: <urn:uu 
+0

बहुत बढ़िया। यह मेरे लिए काम किया। – bibbsey

संबंधित मुद्दे