NetworkStream.DataAvailable HTTP प्रतिक्रिया का अंत नहीं दर्शाता
अंत की शर्त के रूप में NetworkStream.DataAvailable के बजाय संदेश फ़्रेमिंग अपनाकर कटे हुए HTTP डाउनलोड रोकें।
NetworkStream.DataAvailable == false का अर्थ है कि तुरंत पढ़ने के लिए कोई बाइट तैयार नहीं है। इसका अर्थ यह नहीं है कि HTTP प्रतिक्रिया पूरी हो गई है। वहाँ रुकने वाला लूप पैकेटों के बीच अंतराल में पूरी तरह सामान्य SOCKS डाउनलोड काट सकता है।
SOCKS द्वारा TCP कनेक्शन स्थापित होने के बाद भी पूर्णता का नियम HTTP फ़्रेमिंग ही देता है:
- Content-Length वाला बॉडी घोषित सामग्री बाइटों के बाद समाप्त होता है।
- Chunked प्रतिक्रिया के लिए उसका अंतिम chunk और लागू trailer आवश्यक हैं।
- कनेक्शन-सीमित प्रतिक्रिया कनेक्शन के साथ समाप्त होती है।
- कुछ स्थितियों और HEAD के उत्तरों में बॉडी नहीं होती।
लागू नियम तय करने के लिए स्थिति और हेडर पढ़ें। केवल बंद होने की प्रतीक्षा करना सामान्य समाधान नहीं है, क्योंकि पूरी HTTP प्रतिक्रिया कनेक्शन खुला छोड़ सकती है। एक बफ़र की क्षमता भी प्रतिक्रिया की लंबाई से उतनी ही असंबंधित है।
HTTP क्लाइंट का फ़्रेमिंग कार्यान्वयन तब उपयोग करें जब वह चुने गए प्रॉक्सी परिवहन का समर्थन करता हो। संगत आधुनिक .NET रनटाइम पर HttpClient के मूल SOCKS समर्थन पर विचार करें। रॉ कार्यान्वयन को आंशिक हेडर और बॉडी पढ़ने के दौरान पार्सिंग स्थिति बनाए रखनी चाहिए और सफल पूर्णता को रद्दीकरण, टाइमआउट तथा अप्रत्याशित EOF से अलग पहचानना चाहिए। गैर-खाली पढ़ने के अनुरोध में शून्य बाइट पढ़ा जाना का अर्थ है कि स्ट्रीम समाप्त हो गई; यह इस बात से भिन्न है कि इस समय कतार में कोई बाइट नहीं है।
प्रॉक्सी समय अंतरालों को स्पष्ट कर सकता है, पर वह खाली प्राप्ति कतार को संदेश-अंत चिह्न में नहीं बदलता।