Node HTTP सर्वर सामान्य प्रॉक्सी अनुरोध को अपने request callback के ज़रिए संभालता है। CONNECT दूसरा रास्ता लेता है: सर्वर अनुरोध, क्लाइंट सॉकेट और head बफ़र के साथ connect उत्सर्जित करता है।

वह घटना HTTP पार्सिंग और टनल के बीच का हस्तांतरण है। टनल किए गए ट्रैफ़िक के लिए उपयोग जारी रखने योग्य कोई सामान्य ServerResponse ऑब्जेक्ट नहीं है।

तर्कयह क्या ले जाता है
reqCONNECT अनुरोध, जिसमें उसका गंतव्य प्राधिकार और हेडर शामिल हैं
clientSocketक्लाइंट तक वापस जाने वाला कनेक्शन
headटनल डेटा जो Node पहले ही HTTP हेडर के आगे पढ़ चुका है, संभवतः खाली

बाइट रिले करने से पहले HTTP निर्णय पूरा करें

अनुरोधित होस्ट और पोर्ट को सत्यापित करें, प्रॉक्सी की पहुँच और प्रमाणीकरण नीति लागू करें और अपस्ट्रीम कनेक्शन स्थापित करें। CONNECT service.example:443 जैसे प्राधिकार की पहचान करता है; उस रूप को हर कोलन पर अंधाधुंध विभाजित करने के बजाय IPv6 प्राधिकारों को ध्यान में रखते हुए पार्स करें।

टनल स्वीकार होने पर, सफल HTTP प्रतिक्रिया और उसकी समाप्ति वाली खाली पंक्ति भेजें। फिर क्लाइंट सॉकेट से आने वाले बाद के बाइट के साथ आगे बढ़ने से पहले किसी भी head बाइट को अपस्ट्रीम भेजें। नया डेटा श्रोता जोड़कर हैंडलर को अलग से दिया जा चुका बफ़र वापस नहीं पाया जा सकता।

Node का आधिकारिक टनलिंग उदाहरण दोनों स्ट्रीम दिशाओं को जोड़ने से पहले serverSocket.write(head) के साथ वह हस्तांतरण करता है। इसका छोटा उदाहरण संक्रमण दर्शाता है; तैनात प्रॉक्सी को सीमित कनेक्शन प्रयास, पहुँच नियंत्रण और जीवनचक्र प्रबंधन भी चाहिए।

सफलता के बाद, बाइट सेवा प्रोटोकॉल के हैं

सफल CONNECT प्रतिक्रिया कनेक्शन को बाइट स्ट्रीम में बदल देती है। यदि लक्ष्य HTTPS साइट है, तो उसका TLS आदान-प्रदान उसी स्ट्रीम के भीतर होता है। केवल टनल करने के लिए प्रॉक्सी को प्रतिस्थापन वेबसाइट प्रमाणपत्र जारी करने की आवश्यकता नहीं होती।

CONNECT स्वीकार करने से पहले, HTTP त्रुटि बता सकती है कि इनकार क्यों हुआ। स्वीकृति के बाद, स्ट्रीम में HTTP 500 लिखना टनल प्रोटोकॉल में बाइट इंजेक्ट करेगा। इसके बजाय बाद की विफलताओं पर उपयुक्त कनेक्शन समाप्त या नष्ट करें।

दोनों दिशाओं को बैकप्रेशर-जागरूक स्ट्रीम प्रबंधन से जोड़ें, और तय करें कि end, error और close घटनाएँ साथी को कैसे समाप्त करती हैं। प्रारंभिक head बफ़र को उसी स्वामित्व मॉडल के भाग के रूप में रखें; यह अनुप्रयोग डेटा है, फेंकने योग्य अतिरिक्त HTTP हेडर नहीं।

संबंधित लेख