2012-07-07 18 views
11

मेरे पास एक छोटा सा प्रोग्राम http अनुरोध भेजता है और टीसीपी प्रोटोकॉल के साथ प्रतिक्रिया प्राप्त करता है।सामग्री-लंबाई के बिना http अनुरोध की प्रतिक्रिया प्राप्त करना?

मेरा अनुरोध प्रारूप;

GET/HTTP/1.0 
Host: somewebsite.com 
{two new line} 

मैं सॉकेट (ग # में NetworkStream और StreamReader उपयोग करते हुए) जब तक मैं सामग्री-लंबाई हेडर को खोजने से लाइन द्वारा प्रतिक्रिया लाइन पढ़ें। मैं लंबाई को स्टोर करता हूं, फिर खाली रेखा ढूंढने तक पढ़ना जारी रखता हूं। फिर लंबाई के साथ एक बफर बनाएँ और बाकी प्रतिक्रिया प्राप्त करें।

लेकिन कुछ reponses में सामग्री-लंबाई शीर्षलेख नहीं है। तो मेरा दृष्टिकोण विफल रहता है। अगर मुझे नहीं पता कि मुझे कितना बाइट प्राप्त करना चाहिए, जब मुझे रोकना चाहिए?

उत्तर

15

HTTP/1.0 में? जब धारा बंद हो जाती है।

HTTP/1.1 में? chunked encoding के साथ।

4

relevant part of HTTP spec देखें। आपके विशिष्ट मामले में, यदि सर्वर सामग्री की लंबाई वापस नहीं देता है, तो प्रतिक्रिया को खत्म करने पर स्ट्रीम को बंद करना होगा। आपके लिए (क्लाइंट के रूप में) जानने के लिए कोई अन्य विश्वसनीय तरीका नहीं है। HTTP संस्करण के बावजूद। @ जुलिएयन चंक एन्कोडिंग वास्तव में HTTP/1.1 में एक चालाक अपग्रेड है लेकिन स्ट्रीमिंग के लिए विशिष्ट है और ऐसा कोई कारण नहीं है कि एक "सादा" वेबसर्वर इसे लागू करेगा। यह एक सर्वर है जो प्रतिक्रिया शुरू करने से पहले सामग्री की लंबाई जानता है। और मुझे लगता है कि ओपी के पास सर्वर नियंत्रण में नहीं है, अन्यथा वह अनुपलब्ध HTTP शीर्षलेखों पर ऑब्जेक्ट नहीं करेगा।

लेकिन यदि आप सामग्री लंबाई शीर्षलेख प्राप्त करते हैं, तो भी आप must not unreservedly trust it। सर्वर कार्यान्वयन केवल मनुष्यों को भी गिरने योग्य हैं। इसे "सबसे संभावित" प्रतिक्रिया के रूप में लें, एक आकार बदलने योग्य बफर के प्रारंभिक मूल्य। आपको अभी भी कम से कम (खराब मामले) को संभालने के लिए तैयार होना चाहिए।

+7

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

+0

मैं नम्रतापूर्वक स्पष्टीकरण के लिए पूछ रहा हूं कि अगली प्रतिक्रिया को एक अद्वितीय सॉकेट पर कैसे पढ़ा जा सकता है, जब क्लाइंट ने अभी तक मौजूदा पार्सिंग को समाप्त नहीं किया है, इसलिए इसे पहले से ही अगले अनुरोध को बहुत ही असंभव रूप से भेजा गया है। मैं डाउनवोट बेहतर समझ सकता हूं। अन्यथा मुझे इस मामले पर कोई महत्वपूर्ण असहमति नहीं दिखाई दे रही है। जब आप घोषित सामग्री की लंबाई तक पढ़ते हैं तो आपको क्या करना होगा और सॉकेट पढ़ने से आपको पता चलता है कि 2 और बाइट शेष हैं? हकीकत में, "बेवकूफ टूटा हुआ सर्वर, मैं अब आपसे बात नहीं करूंगा" उतना ही लागू नहीं होता जितना अच्छा प्रोग्रामर चाहेंगे। –

+0

vtmarvin: ग्राहक पाइपलाइनिंग का उपयोग कर सकता है। –

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