2011-03-12 11 views
25

मैं अपने वेबसर्वर को एक HTTP प्रतिक्रिया को सही ढंग से gzip करने की कोशिश कर रहा हूं जो खंड एन्कोडिंग है।चंकित एन्कोडिंग प्रतिक्रिया के gzip संपीड़न?

गैर gzip प्रतिक्रिया की मेरी समझ है कि यह इस तरह दिखता है है:

<the response headers> 

और उसके बाद प्रत्येक हिस्सा के लिए,

<chunk length in hex>\r\n<chunk>\r\n 

और अंत में, एक शून्य लंबाई हिस्सा:

0\r\n\r\n 

मैंने gzip संपीड़न काम करने की कोशिश की है और मैं कुछ मदद का उपयोग कर सकता हूं यह पता लगाने के लिए कि एसी क्या होना चाहिए वापस लौटाया जा सकता है। यह प्रलेखन का तात्पर्य है कि पूरे प्रतिक्रिया, gzipped किया जाना चाहिए के रूप में प्रत्येक हिस्सा gzipping करने का विरोध किया:

HTTP servers sometimes use compression (gzip) or deflate methods to optimize transmission. 
Chunked transfer encoding can be used to delimit parts of the compressed object. 
In this case the chunks are not individually compressed. Instead, the complete payload 
is compressed and the output of the compression process is chunk encoded. 

मैं पूरी बात gzip और प्रतिक्रिया वापस भी chunked बिना करने की कोशिश की, और यह काम नहीं किया। मैंने सामग्री-एन्कोडिंग हेडर को "gzip" पर सेट करने का प्रयास किया। क्या कोई बता सकता है कि उपरोक्त योजना में भागों के gzipping का समर्थन करने के लिए क्या परिवर्तन किए जाने चाहिए? धन्यवाद।

उत्तर

19

आप सामग्री gzip, और उसके बाद ही chunked एन्कोडिंग लागू होते हैं:

"जब से" chunked "है केवल हस्तांतरण-कोडिंग HTTP/1.1 प्राप्तकर्ताओं द्वारा समझा जा करने के लिए आवश्यक है, यह संदेशों परिसीमन में एक महत्वपूर्ण भूमिका निभाता एक निरंतर कनेक्शन पर। जब भी एक अनुरोध में एक पेलोड बॉडी पर ट्रांसफर-कोडिंग लागू होती है, तो अंतिम ट्रांसफर-कोडिंग लागू होनी चाहिए "चंकित"। यदि एक स्थानांतरण पोडोड बॉडी पर स्थानांतरण-कोडिंग लागू होती है, तो या तो अंतिम स्थानांतरण -कोडिंग लागू होना चाहिए "खंडित" होना चाहिए या संदेश को बंद करके संदेश को समाप्त कर दिया जाना चाहिए। जब ​​"खंडित" स्थानांतरण-कोडिंग का उपयोग किया जाता है, तो यह संदेश-निकाय बनाने के लिए लागू अंतिम स्थानांतरण-कोडिंग होना चाहिए। "खंडित" स्थानांतरण-कोडिंग को संदेश-शरीर में एक से अधिक बार लागू नहीं किया जाना चाहिए। "

(HTTPbis Part1, Section 6.2.1)

+0

ठीक वही है जो उसने कहा कि वह कर रहा है, है ना? – sosiouxme

+1

इसमें पहली वाक्य वास्तव में भ्रमित है। मुझे लगता है कि इसे बदला जाना चाहिए ..... आप प्रत्येक चंक के शरीर को चकित करते हैं (मैंने इसे अभी लागू किया है और यह एक आकर्षण की तरह काम करता है)। आप पूरी सामग्री को gzip नहीं करते हैं तो चंकित एन्कोडिंग लागू करें। आप प्रत्येक शरीर को gzip और संकुचित बाइट सरणी आकार के रूप में खंड आकार चिह्नित करें। –

1

शायद आप वास्तव में एक उचित gzipped प्रतिक्रिया नहीं भेज रहे हैं।

zlib में window bits से 31 को सेट करने का प्रयास करें। और deflateInit2() का उपयोग करें।

+1

यह कार्यान्वयन के बारे में कुछ धारणा करता है।क्या होगा, एक संपीड़ित फ़ाइल को वापस करने के लिए, उसने फ़ाइल को ज़िप करने के लिए "gzip" कमांड का उपयोग किया और सामग्री-एन्कोडिंग सेट करते समय इसे वापस कर दिया: gzip header? क्या उसके पास एक ही आउटपुट है? – sosiouxme

+0

HTTP मानक वास्तव में जरूरी है कि ** zlib ** लाइब्रेरी का उपयोग किया जाए। 'Gzip' कमांड अधिक हेडर आउटपुट करेगा लेकिन यह zlib के साथ संगत होना चाहिए जिसका उपयोग अधिकांश अन्य HTTP क्लाइंट/सर्वरों में किया जाता है। – unixman83

+0

यह अधिक संभावना है कि पोस्टर 'सामग्री-लंबाई' शीर्षलेख सेट नहीं कर रहा है या चंकित प्रतिक्रिया को अनुचित रूप से भेज रहा है। या हेडर के बाद एक पिछली नई लाइन की तरह बुनियादी कुछ भूल रहा है। – unixman83

24

मामले में अन्य उत्तर पर्याप्त स्पष्ट नहीं थे:

सबसे पहले आप zlib के साथ शरीर gzip (यह एक धारा में किया जा सकता है ताकि आप पूरी बात की जरूरत नहीं है एक बार में स्मृति में, जो चंकिंग का पूरा बिंदु है)।

तो फिर तुम कि संपीड़ित शरीर मात्रा में (शायद gzip धारा द्वारा प्रदान की लोगों हिस्सा हेडर के साथ घोषित करने के लिए कितना समय है,) सामग्री-एन्कोडिंग के साथ भेजने के लिए,: gzip और स्थानांतरण-एन्कोडिंग: chunked हेडर (और कोई सामग्री-लंबाई शीर्षलेख नहीं)।

यदि आप संपीड़न के लिए gzip या zcat या ऐसी कुछ उपयोगिता का उपयोग कर रहे हैं, तो यह शायद काम नहीं करेगा। Zlib होने की जरूरत है। यदि आप भाग बना रहे हैं और फिर उन्हें संपीड़ित कर रहे हैं, तो निश्चित रूप से काम नहीं करेगा। अगर आपको लगता है कि आप यह सही कर रहे हैं और यह काम नहीं कर रहा है, तो आप पैकेट ट्रेस लेने और उस पर आधारित प्रश्न पूछने और आपके द्वारा प्राप्त किए जा रहे किसी भी त्रुटि संदेश का प्रयास कर सकते हैं।

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