Node.js CONNECT өңдеушілері head буферін сақтауы керек
Node-тың CONNECT сокеті мен head буферін HTTP-ден туннельге өту шекарасында басқарып, тақырыпшалардан кейін оқылған байттарды сақтаңыз.
Node HTTP сервері қарапайым прокси сұранысын сұраныс callback арқылы өңдейді. CONNECT басқа жолмен жүреді: сервер connect оқиғасын сұраныспен, клиент сокетімен және head буферімен бірге шығарады.
Бұл оқиға 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 тақырыпшалары емес.