Pričekajte prazan red nakon CONNECT
Pročitajte cijeli HTTP/1 CONNECT odgovor prije nego socket predate TLS-u, čak i kad statusni redak stigne prvi.
Klijent vidi 200 Connection Established, pokrene TLS i odmah prijavi besmislice tamo gdje bi trebao biti TLS zapis. Tražite nedovršen HTTP odgovor prije nego optužite postavke šifri odredišta.
U HTTP/1 CONNECT razmjeni statusni redak je samo početak odgovora. Nakon njega mogu slijediti polja zaglavlja. Prazan red koji završava dio zaglavlja označava prijelaz u tunel nakon uspješnog CONNECT odgovora.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
Ti bajtovi mogu stići u jednom čitanju, u nekoliko čitanja ili u čitanju koje sadrži i sljedeće bajtove. TCP ne čuva granice pisanja poslužitelja.
Učinite primopredaju eksplicitnim stanjem parsera
- Prikupljajte i parsirajte statusni redak. Koristite numerički status umjesto točne engleske reason phrase.
- Nastavite dok ne stigne potpuni terminator dijela zaglavlja. Uspješan statusni redak ne čini preostala polja nestalima.
- Za uspješan CONNECT odgovor, bajt odmah nakon tog terminatora smatrajte početkom podataka tunela. Za ostale odgovore slijedite odgovarajuću obradu HTTP odgovora i autentifikacije.
- Prenesite vezu i sve nepotrošene bajtove kroz međuspremnjeno I/O sučelje koje podržava sljedeći protokol.
Posljednji je korak važan čak i uz dobru pretragu graničnika. Međuspremnjeni čitač mogao je potrošiti više socketa nego što je parser zatražio. Pokretanje TLS-a na golom socketu uz napuštanje tog čitača može ostaviti bajtove u privatnom međuspremniku čitača.
Koristite rok za postavljanje i ograničenje veličine zaglavlja. EOF prije terminatora je nepotpun proxy odgovor, a ne poziv da čekate zauvijek ili ipak pokušate TLS.
Promislite nekoliko granica
Zamislite čitanje koje završava nakon Proxy-Agent:. Parseru još trebaju dodatni HTTP bajtovi zaglavlja. Zamislite drugo koje završava na pola završne CRLF sekvence. To još nije potpun dio zaglavlja. A sada zamislite potpun uspješan dio zaglavlja iza kojeg u istom međuspremniku slijede bajtovi tunela: ti dodatni bajtovi moraju preživjeti primopredaju.
407 je drugačiji ishod. Zahtijeva obradu autentifikacije; ne dopušta TLS ClientHello u tunel koji nikada nije otvoren.
Preferirajte održavani konektor osim ako je implementacija rukovanja zadatak. Ova je granica specifična za ovdje prikazanu HTTP/1 razmjenu. HTTP/2 proxy nosi CONNECT na streamu s drugačijim uokvirenjem.