Для ssl::stream<tcp::socket> через звичайний HTTP-проксі спершу використовуйте його необроблений транспорт, а потім доручіть йому TLS до призначення:

auto& transport = tlsStream.next_layer();
  1. Підключіть цей транспорт до хоста й порту проксі. Якщо цільовий публічний HTTPS-вузол дозволено, а облікові дані проксі не задано, список HTTP-проксі пропонує відповідні кінцеві точки; переконайтеся, що вибраний проксі дозволяє потрібний тунель.
  2. Надішліть CONNECT із зазначенням authority призначення, наприклад api.example:443, і розберіть повні заголовки відповіді на звичайному транспорті. Успішна відповідь 2xx відкриває тунель; відмова залишається відповіддю HTTP-проксі.
  3. Налаштуйте ім'я хоста призначення, потрібний SNI, довірені корені та перевірку вузла, потім запустіть рукостискання клієнта на tlsStream.
  4. Після успішного TLS використовуйте для читання й запису застосунку SSL-потік. Пряме читання нижчого шару на цьому етапі обходить обробку TLS.

Перенесіть залишок буфера HTTP-парсера на наступний етап. В Asio є перевантаження рукостискання з буфером; відкидання хвоста, яким володіє парсер, може втратити байти, уже прочитані із сокета.

У цьому простому типі next_layer і lowest_layer обидва ведуть до TCP. Із більшою кількістю обгорток вони можуть різнитися, тому вибирайте інтерфейс, який несе фактичний протокол проксі. HTTPS-проксі додає ще один етап TLS і не входить до цієї послідовності CONNECT у відкритому вигляді.

Схожі статті