CONNECT-handlers van Node.js moeten de head-buffer behouden
Behandel de CONNECT-socket en head-buffer van Node op de grens van HTTP naar tunnel, en behoud de bytes die al voorbij de headers zijn gelezen.
Een Node HTTP-server verwerkt een gewoon proxyverzoek via zijn request-callback. CONNECT neemt een andere route: de server zendt connect uit met het verzoek, de clientsocket en een head-buffer.
Die gebeurtenis is de overdracht tussen HTTP-parsing en een tunnel. Er is geen gewoon ServerResponse-object om voor het getunnelde verkeer te blijven gebruiken.
| Argument | Wat het draagt |
|---|---|
req | Het CONNECT-verzoek, inclusief de bestemmingsautoriteit en headers |
clientSocket | De verbinding terug naar de client |
head | Tunnelgegevens die Node al voorbij de HTTP-headers heeft gelezen, mogelijk leeg |
Rond de HTTP-beslissing af voordat bytes worden doorgegeven
Valideer de gevraagde host en poort, pas het toegangs- en authenticatiebeleid van de proxy toe en breng de upstream-verbinding tot stand. CONNECT identificeert een autoriteit zoals service.example:443; parse die vorm met IPv6-autoriteiten in gedachten in plaats van blind op elke dubbele punt te splitsen.
Wanneer de tunnel wordt geaccepteerd, stuur de succesvolle HTTP-respons gevolgd door de afsluitende lege regel. Stuur daarna eventuele head-bytes upstream voordat je doorgaat met latere bytes van de clientsocket. Het koppelen van een nieuwe dataluisteraar kan een buffer die al apart aan de handler is geleverd niet terughalen.
Het officiële tunnelvoorbeeld van Node voert die overdracht uit met serverSocket.write(head) voordat de twee stroomrichtingen worden verbonden. Het kleine voorbeeld illustreert de overgang; een uitgerolde proxy heeft ook begrensde verbindingspogingen, toegangscontroles en levenscyclusbeheer nodig.
Na succes behoren de bytes tot het serviceprotocol
Een succesvolle CONNECT-respons verandert de verbinding in een bytestroom. Als het doel een HTTPS-site is, reist de TLS-uitwisseling binnen die stroom. Alleen tunnelnen vereist niet dat de proxy een vervangend websitecertificaat uitgeeft.
Vóór acceptatie van CONNECT kan een HTTP-fout uitleggen waarom het is geweigerd. Na acceptatie zou het schrijven van een HTTP 500 in de stroom bytes in het getunnelde protocol injecteren. Beëindig of vernietig in plaats daarvan de juiste verbindingen bij latere fouten.
Verbind beide richtingen met stroomafhandeling met tegendrukbewustzijn, en bepaal hoe end-, error- en close-gebeurtenissen de peer beëindigen. Behoud de eerste head-buffer als onderdeel van hetzelfde eigendomsmodel; het zijn applicatiegegevens, geen overtollige HTTP-headers om weg te gooien.