En Node HTTP-server behandler en vanlig proxyforespørsel via request-callbacken. CONNECT tar en annen vei: serveren sender connect sammen med forespørselen, klientsocketen og en head-buffer.

Denne hendelsen er overleveringen mellom HTTP-parsing og en tunnel. Det er ikke noe vanlig ServerResponse-objekt som kan brukes videre for den tunnelerte trafikken.

ArgumentHva den bærer
reqCONNECT-forespørselen, med destinasjonsautoritet og headere
clientSocketForbindelsen tilbake til klienten
headTunneldata som Node allerede har lest forbi HTTP-headerne, muligens tomme

Fullfør HTTP-avgjørelsen før byte videresendes

Valider verten og porten som er forespurt, anvend proxyens tilgangs- og autentiseringspolicy, og etabler oppstrømsforbindelsen. CONNECT identifiserer en autoritet som service.example:443; pars formen med IPv6-autoriteter i mente i stedet for å splitte blindt ved hvert kolon.

Når tunnelen godtas, send det vellykkede HTTP-svaret etterfulgt av den avsluttende tomme linjen. Videresend deretter eventuelle head-byte oppstrøms før du fortsetter med senere byte fra klientsocketen. Å feste en ny data-lytter kan ikke gjenopprette en buffer som allerede er levert separat til behandleren.

Nodes offisielle tunneleringseksempel utfører denne overleveringen med serverSocket.write(head) før de to strømretningene kobles sammen. Det lille eksempelet illustrerer overgangen; en utplassert proxy trenger også avgrensede tilkoblingsforsøk, tilgangskontroller og livssyklushåndtering.

Etter suksess tilhører bytene tjenesteprotokollen

Et vellykket CONNECT-svar gjør forbindelsen om til en bytestrøm. Hvis målet er et HTTPS-nettsted, foregår TLS-utvekslingen inne i denne strømmen. Bare å tunnelere den krever ikke at proxyen utsteder et erstatningssertifikat for nettstedet.

Før CONNECT godtas, kan en HTTP-feil forklare hvorfor den ble avvist. Etter godtakelse vil skriving av HTTP 500 i strømmen injisere byte i den tunnelerte protokollen. Avslutt eller ødelegg i stedet de aktuelle forbindelsene ved senere feil.

Koble begge retninger med strømhåndtering med mottrykksbevissthet, og avgjør hvordan end-, error- og close-hendelser avslutter motparten. Bevar den opprinnelige head-bufferen som en del av samme eierskapsmodell; det er applikasjonsdata, ikke overflødige HTTP-headere som skal kastes.

Relaterte artikler