Node.js CONNECT हँडलरने head बफर जतन केला पाहिजे
HTTP ते टनेल या सीमेवर Node चा CONNECT सॉकेट आणि head बफर हाताळा, हेडरच्या पुढे आधीच वाचलेले बाइट जतन करून.
Node HTTP सर्व्हर सामान्य प्रॉक्सी विनंती त्याच्या request callback द्वारे हाताळतो. CONNECT वेगळा मार्ग घेतो: सर्व्हर विनंती, क्लायंट सॉकेट आणि head बफरसह connect उत्सर्जित करतो.
ती घटना HTTP पार्सिंग आणि टनेल यांच्यातील हस्तांतरण आहे. टनेल केलेल्या रहदारीसाठी वापरणे सुरू ठेवण्यासारखा सामान्य ServerResponse ऑब्जेक्ट नाही.
| युक्तिवाद | ते काय वाहते |
|---|---|
req | CONNECT विनंती, तिचा गंतव्य अधिकार आणि हेडरसह |
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 हेडर नाहीत.