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.

ArgumentasKą jis neša
reqCONNECT užklausa, įskaitant jos paskirties autoritetą ir antraštes
clientSocketRyšys atgal į klientą
headTunelio 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.

Susiję straipsniai