CONNECT-behandlere i Node.js må bevare head-bufferen
Håndter Nodes CONNECT-socket og head-buffer ved grensen mellom HTTP og tunnel, og bevar bytene som allerede er lest utover headerne.
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.
| Argument | Hva den bærer |
|---|---|
req | CONNECT-forespørselen, med destinasjonsautoritet og headere |
clientSocket | Forbindelsen tilbake til klienten |
head | Tunneldata 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.