Сачекајте празан ред након CONNECT
Прочитајте цео HTTP/1 CONNECT одговор пре него што сокет предате TLS-у, чак и када статусна линија стигне прва.
Клијент види 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 не чува границе писања сервера.
Учините примопредају експлицитним стањем парсера
- Прикупљајте и парсирајте статусну линију. Користите нумерички статус уместо тачне енглеске фразе разлога.
- Наставите док не стигне потпуни терминатор дела заглавља. Успешна статусна линија не чини преостала поља несталима.
- За успешан CONNECT одговор, бајт одмах након тог терминатора сматрајте почетком података тунела. За остале одговоре следите одговарајућу обраду HTTP одговора и аутентификације.
- Преносите везу и све неискоришћене бајтове кроз баферисани I/O интерфејс који подржава следећи протокол.
Последњи корак је важан чак и уз добру претрагу граничника. Баферисани читач је могао потрошити више сокета него што је парсер затражио. Покретање TLS-а на голом сокету уз напуштање тог читача може оставити бајтове у приватном баферу читача.
Користите рок за постављање и ограничење величине заглавља. EOF пре терминатора је непотпун одговор проксија, а не позив да чекате заувек или ипак покушате TLS.
Промислите неколико граница
Замислите читање које се завршава након Proxy-Agent:. Парсеру још требају додатни HTTP бајтови заглавља. Замислите друго које се завршава на половини завршне CRLF секвенце. То још није потпун део заглавља. А сада замислите потпун успешан део заглавља иза којег у истом баферу следе бајтови тунела: ти додатни бајтови морају преживети примопредају.
407 је другачији исход. Захтева обраду аутентификације; не дозвољава TLS ClientHello у тунел који никада није отворен.
Преферирајте одржавани конектор осим ако је имплементација руковању сама задатак. Ова граница је специфична за овде приказану HTTP/1 размену. HTTP/2 прокси носи CONNECT на стриму са другачијим уоквирењем.