Node HTTP сервері қарапайым прокси сұранысын сұраныс callback арқылы өңдейді. CONNECT басқа жолмен жүреді: сервер connect оқиғасын сұраныспен, клиент сокетімен және head буферімен бірге шығарады.

Бұл оқиға HTTP талдауы мен туннель арасындағы тапсыру болып табылады. Туннельден өткен трафик үшін пайдалануды жалғастыруға болатын қарапайым ServerResponse нысаны жоқ.

АргументОл нені тасымалдайды
reqCONNECT сұранысы, оның мақсатты өкілеттігі мен тақырыпшаларын қоса
clientSocketКлиентке қайтатын қосылым
headNode 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 тақырыпшалары емес.

Қатысты мақалалар