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 हेडर होइन।