Un server HTTP Node gestionează o cerere proxy obișnuită prin callbackul său de cerere. CONNECT urmează altă cale: serverul emite connect împreună cu cererea, socketul clientului și un buffer head.

Acest eveniment este predarea dintre analiza HTTP și un tunel. Nu există un obiect ServerResponse obișnuit care să poată fi folosit în continuare pentru traficul tunelat.

ArgumentCe transportă
reqCererea CONNECT, inclusiv autoritatea sa de destinație și antetele
clientSocketConexiunea înapoi către client
headDatele tunelului pe care Node le-a citit deja dincolo de antetele HTTP, posibil goale

Terminați decizia HTTP înainte de a retransmite octeți

Validați gazda și portul solicitate, aplicați politica de acces și autentificare a proxy-ului și stabiliți conexiunea upstream. CONNECT identifică o autoritate precum service.example:443; analizați acea formă ținând cont de autoritățile IPv6 în loc să împărțiți orbește la fiecare două puncte.

Când tunelul este acceptat, trimiteți răspunsul HTTP de succes urmat de linia goală care îl încheie. Apoi transmiteți orice octeți head către upstream înainte de a continua cu octeții următori din socketul clientului. Atașarea unui nou ascultător de date nu poate recupera un buffer deja livrat separat handler-ului.

Exemplul oficial de tunelare din Node efectuează acea predare cu serverSocket.write(head) înainte de a conecta cele două direcții ale fluxului. Micul său exemplu ilustrează tranziția; un proxy implementat are nevoie și de încercări de conectare limitate, controale de acces și gestionarea ciclului de viață.

După succes, octeții aparțin protocolului serviciului

Un răspuns CONNECT de succes transformă conexiunea într-un flux de octeți. Dacă ținta este un site HTTPS, schimbul său TLS are loc în interiorul acelui flux. Doar tunelarea nu impune ca proxy-ul să emită un certificat de site de înlocuire.

Înainte de acceptarea CONNECT, o eroare HTTP poate explica motivul refuzului. După acceptare, scrierea unui HTTP 500 în flux ar injecta octeți în protocolul tunelat. În schimb, încheiați sau distrugeți conexiunile corespunzătoare la eșecurile ulterioare.

Conectați ambele direcții cu gestionarea fluxului conștientă de contrapresiune și decideți cum evenimentele end, error și close încheie partenerul. Păstrați bufferul head inițial ca parte a aceluiași model de proprietate; sunt date ale aplicației, nu antete HTTP în surplus de aruncat.

Articole similare