Node HTTP serveris apstrādā parastu starpniekservera pieprasījumu, izmantojot pieprasījuma callback. CONNECT iet citu ceļu: serveris izdod connect kopā ar pieprasījumu, klienta ligzdu un head buferi.

Šis notikums ir nodošana starp HTTP parsēšanu un tuneli. Nav parasta ServerResponse objekta, ko turpināt izmantot tuneļa trafikam.

ArgumentsKo tas nes
reqCONNECT pieprasījums, tostarp tā galamērķa autoritāte un galvenes
clientSocketSavienojums atpakaļ pie klienta
headTuneļa dati, ko Node jau nolasījis aiz HTTP galvenēm, iespējams, tukši

Pabeidziet HTTP lēmumu pirms baitu pārsūtīšanas

Validējiet pieprasīto resursdatoru un portu, piemērojiet starpniekservera piekļuves un autentifikācijas politiku un izveidojiet augšupstraumes savienojumu. CONNECT identificē autoritāti, piemēram, service.example:443; parsējiet šo formu, ņemot vērā IPv6 autoritātes, nevis akli sadalot pie katras kols.

Kad tunelis tiek pieņemts, nosūtiet veiksmīgo HTTP atbildi un tai sekojošo noslēdzošo tukšo rindu. Pēc tam pārsūtiet jebkuras head baites augšup, pirms turpināt ar vēlākajām baitēm no klienta ligzdas. Jauna datu klausītāja pievienošana nevar atgūt buferi, kas jau ir atsevišķi nodots apstrādātājam.

Node oficiālais tuneļošanas piemērs veic šo nodošanu ar serverSocket.write(head) pirms abu straumes virzienu savienošanas. Tā mazais piemērs ilustrē pāreju; izvietotam starpniekserverim nepieciešami arī ierobežoti savienojuma mēģinājumi, piekļuves kontroles un dzīves cikla pārvaldība.

Pēc panākumiem baites pieder pakalpojuma protokolam

Veiksmīga CONNECT atbilde pārvērš savienojumu baitstraumē. Ja mērķis ir HTTPS vietne, tās TLS apmaiņa notiek šīs straumes ietvaros. Vienkārša tuneļošana neprasa, lai starpniekserveris izdotu aizvietojošu vietnes sertifikātu.

Pirms CONNECT pieņemšanas HTTP kļūda var izskaidrot atteikuma iemeslu. Pēc pieņemšanas HTTP 500 rakstīšana straumē ievadītu baites tuneļa protokolā. Tā vietā vēlāku kļūmju gadījumā pārtrauciet vai iznīciniet attiecīgos savienojumus.

Savienojiet abus virzienus ar pretspiedienu apzināta straumes apstrāde un izlemiet, kā end, error un close notikumi pārtrauc partneri. Saglabājiet sākotnējo head buferi kā daļu no tā paša īpašumtiesību modeļa; tie ir lietojumprogrammas dati, nevis izmetamas liekās HTTP galvenes.

Saistītie raksti