Pentru ssl::stream<tcp::socket> printr-un proxy HTTP obișnuit, folosește mai întâi transportul brut, apoi cere-i să facă TLS către destinație:

auto& transport = tlsStream.next_layer();
  1. Conectează acel transport la gazda și portul proxy-ului. Când destinația publică HTTPS este permisă și nu sunt configurate credențiale de proxy, lista de proxy HTTP oferă puncte finale candidate; verifică dacă punctul ales permite tunelul cerut.
  2. Trimite CONNECT cu authority-ul destinației, de exemplu api.example:443, și analizează antetele complete ale răspunsului pe transportul simplu. Un răspuns 2xx deschide tunelul; un refuz rămâne un răspuns de proxy HTTP.
  3. Configurează numele gazdei destinație, SNI-ul necesar, rădăcinile de încredere și verificarea peer-ului, apoi pornește handshake-ul clientului pe tlsStream.
  4. După ce TLS reușește, folosește citirile și scrierile prin fluxul SSL pentru aplicație. Citirea directă a stratului inferior în acel moment ocolește procesarea TLS.

Transportă surplusul parserului HTTP în etapa următoare. Asio are supraîncărcări de handshake cu buffer; aruncarea cozii deținute de parser poate pierde octeți deja citiți din socket.

În acest tip simplu, next_layer și lowest_layer ajung amândouă la TCP. Mai multe învelișuri le pot face diferite, așa că alege interfața care poartă protocolul real al proxy-ului. Un proxy HTTPS adaugă încă o etapă TLS și nu face parte din această secvență CONNECT în clar.

Articole similare