CONNECT-hanterare i Node.js måste bevara head-bufferten
Hantera Nodes CONNECT-socket och head-buffer vid gränsen mellan HTTP och tunnel, och bevara de byte som redan lästs förbi rubrikerna.
En Node HTTP-server hanterar en vanlig proxybegäran via sin request-callback. CONNECT tar en annan väg: servern sänder ut connect tillsammans med begäran, klientsocketen och en head-buffer.
Den händelsen är överlämningen mellan HTTP-tolkning och en tunnel. Det finns inget vanligt ServerResponse-objekt att fortsätta använda för den tunnlade trafiken.
| Argument | Vad den bär |
|---|---|
req | CONNECT-begäran, inklusive dess destinationsauktoritet och rubriker |
clientSocket | Anslutningen tillbaka till klienten |
head | Tunneldata som Node redan har läst förbi HTTP-rubrikerna, möjligen tomma |
Slutför HTTP-beslutet innan byte vidarebefordras
Validera den begärda värden och porten, tillämpa proxyns åtkomst- och autentiseringspolicy och upprätta uppströmsanslutningen. CONNECT identifierar en auktoritet som service.example:443; tolka den formen med IPv6-auktoriteter i åtanke i stället för att blint dela vid varje kolon.
När tunneln accepteras, skicka det lyckade HTTP-svaret följt av dess avslutande tomma rad. Vidarebefordra sedan eventuella head-byte uppströms innan du fortsätter med senare byte från klientsocketen. Att koppla en ny datalyssnare kan inte återställa en buffert som redan har levererats separat till hanteraren.
Nodes officiella tunnelexempel utför den överlämningen med serverSocket.write(head) innan de två strömriktningarna kopplas samman. Dess lilla exempel illustrerar övergången; en utrullad proxy behöver också begränsade anslutningsförsök, åtkomstkontroller och livscykelhantering.
Efter framgång tillhör byten tjänsteprotokollet
Ett lyckat CONNECT-svar förvandlar anslutningen till en byteström. Om målet är en HTTPS-webbplats sker dess TLS-utbyte inuti den strömmen. Bara tunnling kräver inte att proxyn utfärdar ett ersättningscertifikat för webbplatsen.
Innan CONNECT accepteras kan ett HTTP-fel förklara varför det avvisades. Efter godkännande skulle skrivning av en HTTP 500 i strömmen injicera byte i det tunnlade protokollet. Avsluta eller förstör i stället de relevanta anslutningarna vid senare fel.
Anslut båda riktningarna med strömhantering med mottrycksmedvetenhet, och avgör hur end-, error- och close-händelser avslutar motparten. Bevara den ursprungliga head-bufferten som en del av samma ägarmodell; det är applikationsdata, inte överflödiga HTTP-rubriker att kasta bort.