2008-12-03 10 views
7

मैं आईआईएस वेब सर्वर से HTTP कनेक्शन बना रहा हूं और ट्रांसफर-एन्कोडिंग का उपयोग करके एन्कोड किए गए डेटा के साथ एक POST अनुरोध भेज रहा हूं: खंडित। जब मैं ऐसा करता हूं, तो आईआईएस बस कनेक्शन को बंद करता है, बिना त्रुटि संदेश या स्थिति कोड। HTTP 1.1 spec के अनुसार,आईआईएस क्यों चंक ट्रांसफर एन्कोडिंग का समर्थन नहीं करता है?

सभी HTTP/1.1 आवेदन प्राप्त और डिकोड करने के लिए सक्षम होना चाहिए "chunked" हस्तांतरण-कोडिंग

तो मुझे समझ नहीं आता क्यों यह (क) कि निपटने नहीं कर रहा है एन्कोडिंग और (बी) यह एक स्टेटस कोड वापस नहीं भेज रहा है। अगर मैं स्थानांतरण-एन्कोडिंग की बजाय सामग्री-लंबाई भेजने के अनुरोध को बदलता हूं, तो क्वेरी सफल होती है, लेकिन यह हमेशा संभव नहीं होती है।

जब मैं अपाचे के खिलाफ एक ही चीज़ का प्रयास करता हूं, तो मुझे "411 लंबाई आवश्यक" स्थिति मिलती है और एक संदेश "खंडित स्थानांतरण-एन्कोडिंग वर्जित" होता है।

ये सर्वर इस एन्कोडिंग का समर्थन क्यों नहीं करते हैं?

उत्तर

4

मेरी समझ यह है कि खंडित एन्कोडिंग केवल HTTP प्रतिक्रिया में उपयोग की जा सकती है। एक खंडित अनुरोध निकाय के पास 1.0 सर्वर के साथ असंगत होने की संपत्ति होगी, और किसी भी मामले में, उपयोगकर्ता-एजेंट को यह जानने का कोई तरीका नहीं होगा कि सर्वर 1.0 सर्वर था जब तक कि वह अनुरोध पहले ही नहीं भेजता था।

लेकिन मैं सहमत हूं कि यह दस्तावेज़ीकरण से अस्पष्ट है।

+3

क्लाइंट दूसरों के बीच एक हेड अनुरोध भेजकर सर्वर से पूछताछ कर सकता है।आरएफसी 2616 पढ़ना, सेक्शन 3.6 बताता है कि हस्तांतरण-एन्कोडिंग हेडर प्राप्त करते समय सर्वर को 501 प्रतिक्रिया भेजनी होगी जो समझ में नहीं आता है। धारा 3.6.1 का कहना है कि सभी HTTP 1.1 अनुप्रयोगों को खंडित स्थानांतरण-कोडिंग प्राप्त करने और डीकोड करने में सक्षम होना चाहिए। तो यह मेरे लिए स्पष्ट लगता है - क्लाइंट-टू-सर्वर संचार को तोड़ दिया जा सकता है। एक सामान्य परिदृश्य फ़ाइल अपलोड है। – Cheeso

+1

मूल पोस्टर का उल्लेख नहीं किया गया है कि वे किस आईआईएस का उपयोग कर रहे हैं, लेकिन आईआईएस 7 निश्चित रूप से इनकमिंग चंक किए गए डेटा का समर्थन करता है - मुझे सी ++ एप्लिकेशन को आईआईएस 7 में बिना किसी समस्या के चुने गए डेटा के रूप में अनुरोध भेजना है –

+1

मुझे लगता है कि आप गलत हैं । सर्वर और ग्राहकों को चंकित समर्थन करना चाहिए (इसका मतलब यह नहीं है कि वे हालांकि करते हैं)। आपका तर्क यह है कि असंगतता परिणाम वैध नहीं होगा, क्योंकि http1.1 का समर्थन करने वाले किसी भी क्लाइंट को यह भी समझना चाहिए कि http1.0 सर्वर से कैसे बात करें। देखें: http://www.jmarshall.com/easy/http/#http1.1s3 और: http://www.atnan.com/2008/8/8/transfer-encoding-chunked-chunky-http और: http : //www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6 (धारा 3.6.1 भी) –

-1

मेरा एकमात्र अनुमान है कि उन्होंने सुरक्षा के लिए चिंताओं से इसे लागू नहीं किया है। एक बेवकूफ समाधान में कई चंकित स्थानांतरण शुरू करके एक डॉस हमला स्थापित करना आसान होगा जो कभी खत्म नहीं होता है। और एक जटिल समाधान जो डॉस हमले के लिए जिम्मेदार हो सकता है शायद प्रयास के लायक नहीं है।

पाठ्यक्रम मैं अपाचे या आईआईएस के लिए नहीं बोल सकता का

, आप सीधे हालांकि अपाचे टीम से संपर्क करने में सक्षम हो सकता है: http://httpd.apache.org/bug_report.html

मैं MarkR कि मैं हमेशा chunked एन्कोडिंग सोचा केवल एक प्रतिक्रिया के रूप में इस्तेमाल किया जा सकता है के साथ सहमत हैं, लेकिन दस्तावेज़ीकरण सुनिश्चित करता है कि यह ध्वनि या अनुरोध में उपयोग किया जा सकता है।

+2

ग्राहक चंकित एन्कोडिंग का उपयोग कर सकते हैं। आरएफसी 2616 द्वारा इसकी अनुमति है। उदाहरण के लिए यह फ़ाइल अपलोड परिदृश्य में उपयोगी है। – Cheeso

+1

आप बिना किसी डंक किए गए एन्कोडिंग के एक समान डॉस हमले की स्थापना कर सकते हैं। सामग्री की लंबाई 1 का दावा करें, लेकिन शरीर को कभी नहीं भेजें। किया हुआ। मुझे लगता है कि खंडित के साथ अंतर यह है कि इसे सामग्री-लंबाई शीर्षलेख की आवश्यकता नहीं होती है, इसलिए आप कनेक्शन को बंद करके समाप्त होने वाले डेटा की अज्ञात लंबाई स्ट्रीम कर सकते हैं। आईआईएस अधिकतम मुद्दों की लंबाई और अनुरोध समय समाप्ति के साथ इन मुद्दों के खिलाफ सुरक्षा करता है। – MarkPflug

7

अपने ग्राहक को देखें।

आईआईएस & चुपके स्थानांतरण-एन्कोडिंग का उपयोग करके अपाचे समर्थन POST अनुरोध। आप curl utility का उपयोग कर इस की पुष्टि कर सकते हैं:

curl <upload-url> --form "[email protected]<local_file>" --header "Transfer-Encoding: chunked" 

सत्यापित करें हस्तांतरण Wireshark

2

का उपयोग कर यह दोनों तरीकों से चला जाता है chunked है। फोटोबकेट में एक छवि 2 एमबी ++ अपलोड करने और इसे रिकॉर्ड करने का प्रयास करें। उनके अपलोडर अपलोड उनके अपाचे सर्वर पर चिपके हुए हैं।

-1

यह आदेश मेरे लिए बचाव के लिए आया था!

C: \ Windows \ System32 \ Inetsrv \ appcmd.exe config -section सेट: httpCompression
- [name = 'gzip'] staticCompressionLevel:। 9 - [name = 'gzip'] dynamicCompressionLevel:। 4

मेरा दिन बचाया ... उम्मीद है कि यह मेरे जैसे किसी की मदद करेगी!

+0

मुझे नहीं लगता कि संपीड़न को सक्षम किए गए अनुरोधों को संभालने के साथ क्या करना है। Downvoted। –