Node.js CONNECT rukovaoci moraju sačuvati head bafer
Upravljajte Node CONNECT socketom i head baferom na granici HTTP-a i tunela, čuvajući bajtove koji su već pročitani nakon zaglavlja.
Node HTTP server obrađuje običan proxy zahtev kroz svoj callback za zahtev. CONNECT ide drugim putem: server emituje connect sa zahtevom, klijentskim socketom i head baferom.
Taj događaj je primopredaja između HTTP parsiranja i tunela. Ne postoji običan ServerResponse objekat koji bi se mogao nastaviti koristiti za tunelirani saobraćaj.
| Argument | Šta nosi |
|---|---|
req | CONNECT zahtev, uključujući odredišni autoritet i zaglavlja |
clientSocket | Veza nazad prema klijentu |
head | Tunelski podaci koje je Node već pročitao nakon HTTP zaglavlja, moguće prazni |
Završite HTTP odluku pre prosleđivanja bajtova
Proverite traženi host i port, primenite politiku pristupa i autentifikacije proxyja i uspostavite vezu prema uzvodnom serveru. CONNECT identifikuje autoritet poput service.example:443; parsirajte taj oblik imajući na umu IPv6 autoritete, umesto da slepo delite na svakoj dvotočki.
Kada se tunel prihvati, pošaljite uspešan HTTP odgovor praćen njegovim završnim praznim redom. Zatim prosledite sve head bajtove uzvodno pre nego što nastavite sa kasnijim bajtovima iz klijentskog socketa. Priključivanje novog data listenera ne može povratiti bafer koji je već zasebno dostavljen rukovaocu.
Nodeov zvanični primer tuneliranja obavlja tu primopredaju sa serverSocket.write(head) pre povezivanja dva smera toka. Njegov mali primer ilustruje tranziciju; implementirani proxy takođe zahteva ograničene pokušaje povezivanja, kontrole pristupa i upravljanje životnim ciklusom.
Nakon uspeha, bajtovi pripadaju protokolu usluge
Uspešan CONNECT odgovor pretvara vezu u tok bajtova. Ako je cilj HTTPS veb-lokacija, njena TLS razmena putuje unutar tog toka. Samo tuneliranje ne zahteva da proxy izda zamenski sertifikat veb-lokacije.
Pre prihvatanja CONNECT, HTTP greška može objasniti zašto je odbijen. Nakon prihvatanja, upisivanje HTTP 500 u tok bi ubacilo bajtove u tunelirani protokol. Umesto toga, prekinite ili uništite odgovarajuće veze pri kasnijim neuspesima.
Povežite oba smera sa rukovanje tokom svesno povratnog pritiska, i odlučite kako end, error i close događaji prekidaju partnera. Sačuvajte početni head bafer kao deo istog modela vlasništva; to su aplikacijski podaci, a ne višak HTTP zaglavlja za odbacivanje.