Per ssl::stream<tcp::socket> attraverso un normale proxy HTTP, usate il suo trasporto grezzo prima di chiedergli di eseguire TLS verso la destinazione:

auto& transport = tlsStream.next_layer();
  1. Collegate quel trasporto all'host e alla porta del proxy. Per una destinazione HTTPS pubblica consentita senza credenziali proxy configurate, l'elenco di proxy HTTP offre endpoint candidati; verificate che il candidato consenta il tunnel richiesto.
  2. Inviate CONNECT indicando l'authority della destinazione, ad esempio api.example:443, e analizzate le intestazioni complete della risposta sul trasporto grezzo. Un 2xx riuscito apre il tunnel; un rifiuto resta una risposta del proxy HTTP.
  3. Configurate il nome host della destinazione, lo SNI richiesto, le radici di fiducia e la verifica del peer, poi avviate l'handshake del client su tlsStream.
  4. Dopo il successo di TLS, usate letture e scritture dello stream SSL per l'applicazione. Leggere lo strato successivo direttamente in quel momento aggira l'elaborazione TLS.

Portate qualsiasi residuo del parser HTTP allo stadio successivo. Asio ha overload di handshake con buffer; scartare una coda di proprietà del parser può perdere byte già letti dal socket.

Con questo tipo semplice, next_layer e lowest_layer raggiungono entrambi TCP. Più wrapper possono renderli diversi, quindi scegliete l'interfaccia che trasporta il protocollo wire reale del proxy. Un proxy HTTPS aggiunge un altro stadio TLS e resta fuori da questa sequenza CONNECT in testo semplice.

Articoli correlati