क्लाइंट 200 Connection Established देखता है, TLS शुरू करता है और तुरंत वहाँ बेतुकी बातें बताता है जहाँ TLS रिकॉर्ड होना चाहिए। गंतव्य की सिफ़र सेटिंग्स को दोष देने से पहले अधूरा HTTP प्रतिसाद खोजें।

HTTP/1 CONNECT के आदान-प्रदान में स्टेटस लाइन प्रतिसाद की केवल शुरुआत है। उसके बाद हेडर फ़ील्ड आ सकते हैं। सफल CONNECT प्रतिसाद के बाद हेडर खंड को समाप्त करने वाली खाली पंक्ति टनल में बदलाव दर्शाती है।

HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n

ये बाइट एक पढ़ाई में, कई पढ़ाइयों में, या ऐसी पढ़ाई में आ सकते हैं जिसमें आगे के बाइट भी हों। TCP सर्वर की लेखन सीमाएँ सुरक्षित नहीं रखता।

हैंडऑफ़ को स्पष्ट पार्सर स्थिति बनाएं

  1. स्टेटस लाइन एकत्र करें और पार्स करें। सटीक अंग्रेज़ी reason phrase के बजाय संख्यात्मक स्टेटस इस्तेमाल करें।
  2. तब तक जारी रखें जब तक हेडर खंड का पूरा टर्मिनेटर न आ जाए। सफल स्टेटस लाइन बाकी फ़ील्ड गायब नहीं करती।
  3. सफल CONNECT प्रतिसाद में उस टर्मिनेटर के ठीक बाद वाले बाइट को टनल डेटा की शुरुआत मानें। अन्य प्रतिसादों में उपयुक्त HTTP प्रतिसाद और प्रमाणीकरण प्रक्रिया अपनाएं।
  4. कनेक्शन और बिना उपयोग हुए बाइट अगले प्रोटोकॉल द्वारा समर्थित बफ़र वाले I/O इंटरफ़ेस से स्थानांतरित करें।

अच्छी डिलिमिटर खोज होने पर भी अंतिम चरण महत्वपूर्ण है। बफ़र वाला रीडर पार्सर की माँग से अधिक सॉकेट खपत कर चुका हो सकता है। नंगे सॉकेट पर TLS शुरू करके उस रीडर को छोड़ देना बाइट को रीडर के निजी बफ़र में फँसा सकता है।

सेटअप के लिए समय-सीमा और हेडर आकार की सीमा इस्तेमाल करें। टर्मिनेटर से पहले EOF एक अधूरा प्रॉक्सी प्रतिसाद है, अनंत काल प्रतीक्षा करने या फिर भी TLS आज़माने का निमंत्रण नहीं।

कई सीमाओं पर विचार करें

मान लें कोई पढ़ाई Proxy-Agent: के बाद खत्म होती है। पार्सर को अभी और HTTP हेडर बाइट चाहिए। मान लें दूसरी पढ़ाई अंतिम CRLF क्रम के बीच में खत्म होती है। वह अभी पूरा हेडर खंड नहीं है। अब मान लें पूरा सफल हेडर खंड है और उसी बफ़र में उसके बाद टनल बाइट आते हैं: वे अतिरिक्त बाइट हैंडऑफ़ में बचने चाहिए।

407 अलग परिणाम है। उसे प्रमाणीकरण प्रक्रिया चाहिए; वह कभी न खुली टनल में TLS ClientHello भेजने की अनुमति नहीं देता।

जब तक हैंडशेक लागू करना ही काम न हो, रखरखाव वाला कनेक्टर चुनें। यह सीमा यहाँ दिखाए गए HTTP/1 आदान-प्रदान तक ही है। HTTP/2 प्रॉक्सी CONNECT को अलग फ़्रेमिंग वाली स्ट्रीम पर ले जाता है।

संबंधित लेख