Для 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 у адкрытым тэксце.

Падобныя артыкулы