Node.js CONNECT rukovaoci moraju sačuvati head bafer
Upravljajte Node CONNECT socketom i head baferom na granici HTTP i tunela, čuvajući bajtove koji su već pročitani nakon zaglavlja.
Node HTTP server obrađuje običan proxy zahtjev kroz svoj callback za zahtjev. CONNECT ide drugim putem: server emituje connect sa zahtjevom, 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 tunelirane tokove.
| Argument | Šta nosi |
|---|---|
req | CONNECT zahtjev, uključujući odredišni autoritet i zaglavlja |
clientSocket | Veza natrag prema klijentu |
head | Tunelski podaci koje je Node već pročitao nakon HTTP zaglavlja, moguće prazni |
Završite HTTP odluku prije prosljeđivanja bajtova
Provjerite traženi host i port, primijenite proxy politiku pristupa i autentifikacije i uspostavite vezu prema uzvodnom serveru. CONNECT identifikuje autoritet poput service.example:443; parsirajte taj oblik imajući na umu IPv6 autoritete, umjesto da slijepo dijelite na svakoj dvotočki.
Kada se tunel prihvati, pošaljite uspješan HTTP odgovor praćen njegovim završnim praznim redom. Zatim proslijedite sve head bajtove uzvodno prije nego 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 primjer tuneliranja obavlja tu primopredaju s serverSocket.write(head) prije povezivanja dva smjera toka. Njegov mali primjer ilustruje tranziciju; implementirani proxy također zahtijeva ograničene pokušaje povezivanja, kontrole pristupa i upravljanje životnim ciklusom.
Nakon uspjeha, bajtovi pripadaju protokolu usluge
Uspješan CONNECT odgovor pretvara vezu u tok bajtova. Ako je cilj HTTPS web lokacija, njena TLS razmjena putuje unutar tog toka. Samo tuneliranje ne zahtijeva da proxy izda zamjenski certifikat web lokacije.
Prije prihvatanja CONNECT, HTTP greška može objasniti zašto je odbijen. Nakon prihvatanja, upisivanje HTTP 500 u tok bi ubacio bajtove u tunelirani protokol. Umjesto toga, prekinite ili uništite odgovarajuće veze pri kasnijim neuspjesima.
Povežite oba smjera s rukovanje tokom svjesno povratnog pritiska, i odlučite kako end, error i close događaji prekidaju partnera. Sačuvajte početni head bafer kao dio istog modela vlasništva; to su aplikacijski podaci, a ne višak HTTP zaglavlja za odbacivanje.