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
reqCONNECT zahtev, uključujući odredišni autoritet i zaglavlja
clientSocketVeza nazad prema klijentu
headTunelski 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.

Povezani članci