Za ssl::stream<tcp::socket> kroz običan HTTP proxy najprije koristite njegov sirovi transport, a zatim mu povjerite TLS prema cilju:

auto& transport = tlsStream.next_layer();
  1. Povežite taj transport s hostom i portom proxyja. Kada je dopušteni javni HTTPS cilj bez postavljenih proxy akreditive, lista HTTP proxyja nudi kandidate; provjerite dopušta li odabrani kandidat traženi tunel.
  2. Pošaljite CONNECT s authorityjem cilja, na primjer api.example:443, i raščlanite potpuna zaglavlja odgovora na običnom transportu. Uspješan 2xx otvara tunel; odbijanje ostaje odgovor HTTP proxyja.
  3. Postavite ime ciljnog hosta, potrebni SNI, korijene povjerenja i provjeru peera, zatim pokrenite handshake klijenta na tlsStream.
  4. Nakon uspješnog TLS-a koristite čitanje i pisanje kroz SSL tok za aplikaciju. Izravno čitanje nižeg sloja u tom trenutku zaobilazi TLS obradu.

Prenesite eventualni višak HTTP parsera u sljedeću fazu. Asio ima preopterećenja handshaka s bufferom; odbacivanje repa koji posjeduje parser može izgubiti bajtove već pročitane iz socketa.

Kod ovog jednostavnog tipa i next_layer i lowest_layer dosežu TCP. Više omotača ih može razlikovati, zato odaberite sučelje koje nosi stvarni žičani protokol proxyja. HTTPS proxy dodaje još jednu TLS fazu i nije dio ovog CONNECT niza u čistom tekstu.

Povezani članci