Клијент види 200 Connection Established, покрене TLS и одмах пријави бесмислице тамо где би требало да буде TLS запис. Тражите недовршен HTTP одговор пре него што оптужите поставке шифара одредишта.

У HTTP/1 CONNECT размени статусна линија је само почетак одговора. После ње могу следити поља заглавља. Празан ред који завршава део заглавља означава прелазак у тунел после успешног CONNECT одговора.

HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n

Ти бајтови могу стићи у једном читању, у неколико читања или у читању које садржи и следеће бајтове. TCP не чува границе писања сервера.

Учините примопредају експлицитним стањем парсера

  1. Прикупљајте и парсирајте статусну линију. Користите нумерички статус уместо тачне енглеске фразе разлога.
  2. Наставите док не стигне потпуни терминатор дела заглавља. Успешна статусна линија не чини преостала поља несталима.
  3. За успешан CONNECT одговор, бајт одмах након тог терминатора сматрајте почетком података тунела. За остале одговоре следите одговарајућу обраду HTTP одговора и аутентификације.
  4. Преносите везу и све неискоришћене бајтове кроз баферисани I/O интерфејс који подржава следећи протокол.

Последњи корак је важан чак и уз добру претрагу граничника. Баферисани читач је могао потрошити више сокета него што је парсер затражио. Покретање TLS-а на голом сокету уз напуштање тог читача може оставити бајтове у приватном баферу читача.

Користите рок за постављање и ограничење величине заглавља. EOF пре терминатора је непотпун одговор проксија, а не позив да чекате заувек или ипак покушате TLS.

Промислите неколико граница

Замислите читање које се завршава након Proxy-Agent:. Парсеру још требају додатни HTTP бајтови заглавља. Замислите друго које се завршава на половини завршне CRLF секвенце. То још није потпун део заглавља. А сада замислите потпун успешан део заглавља иза којег у истом баферу следе бајтови тунела: ти додатни бајтови морају преживети примопредају.

407 је другачији исход. Захтева обраду аутентификације; не дозвољава TLS ClientHello у тунел који никада није отворен.

Преферирајте одржавани конектор осим ако је имплементација руковању сама задатак. Ова граница је специфична за овде приказану HTTP/1 размену. HTTP/2 прокси носи CONNECT на стриму са другачијим уоквирењем.

Повезани чланци