Node.js CONNECT apdorotuvai turi išsaugoti head buferį
Tvarkykite Node CONNECT lizdą ir head buferį ties HTTP ir tunelio riba, išsaugodami baitus, jau perskaitytus už antraščių.
Node HTTP serveris įprastą tarpinio serverio užklausą apdoroja per savo užklausos callback. CONNECT eina kitu keliu: serveris išduoda connect su užklausa, kliento lizdu ir head buferiu.
Tas įvykis yra perdavimas tarp HTTP analizės ir tunelio. Nėra įprasto ServerResponse objekto, kurį būtų galima toliau naudoti tunelio srautui.
| Argumentas | Ką jis neša |
|---|---|
req | CONNECT užklausa, įskaitant jos paskirties autoritetą ir antraštes |
clientSocket | Ryšys atgal į klientą |
head | Tunelio duomenys, kuriuos Node jau perskaitė už HTTP antraščių, galbūt tušti |
Užbaikite HTTP sprendimą prieš perduodami baitus
Patikrinkite prašomą hostą ir prievadą, pritaikykite tarpinio serverio prieigos ir autentifikavimo politiką ir užmegzkite aukštesniojo srauto ryšį. CONNECT identifikuoja autoritetą, pavyzdžiui, service.example:443; analizuokite šią formą atsižvelgdami į IPv6 autoritetus, o ne aklai skaidydami ties kiekvienu dvitaškiu.
Kai tunelis priimamas, nusiųskite sėkmingą HTTP atsakymą ir jį užbaigiančią tuščią eilutę. Tada persiųskite visus head baitus aukštyn prieš tęsdami su vėlesniais baitais iš kliento lizdo. Pridėjus naują duomenų klausytoją negalima atkurti buferio, kuris jau buvo atskirai perduotas apdorotuvui.
Oficialus Node tunelių pavyzdys atlieka tą perdavimą su serverSocket.write(head) prieš sujungdamas dvi srauto kryptis. Jo mažas pavyzdys iliustruoja perėjimą; įdiegtam tarpiniam serveriui taip pat reikia ribotų prisijungimo bandymų, prieigos kontrolės ir gyvavimo ciklo valdymo.
Po sėkmės baitai priklauso paslaugos protokolui
Sėkmingas CONNECT atsakymas paverčia ryšį baitų srautu. Jei tikslas yra HTTPS svetainė, jos TLS mainai vyksta to srauto viduje. Vien tik tuneliavimas nereikalauja, kad tarpinis serveris išduotų pakaitinį svetainės sertifikatą.
Prieš priimant CONNECT, HTTP klaida gali paaiškinti, kodėl buvo atsisakyta. Po priėmimo HTTP 500 įrašymas į srautą įšvirkštų baitus į tunelio protokolą. Vietoj to vėlesnių gedimų metu užbaikite arba sunaikinkite atitinkamus ryšius.
Sujunkite abi kryptis su atgalinį spaudimą suprantantis srauto tvarkymas ir nuspręskite, kaip end, error ir close įvykiai užbaigia partnerį. Išsaugokite pradinį head buferį kaip to paties nuosavybės modelio dalį; tai programos duomenys, o ne išmetamos perteklinės HTTP antraštės.