Sačekajte prazan red nakon CONNECT
Pročitajte ceo HTTP/1 CONNECT odgovor pre nego što socket predate TLS-u, čak i kada statusna linija stigne prva.
Klijent vidi 200 Connection Established, pokrene TLS i odmah prijavi besmislice tamo gde bi trebao biti TLS zapis. Tražite nedovršen HTTP odgovor pre nego što optužite postavke šifri odredišta.
U HTTP/1 CONNECT razmeni statusna linija je samo početak odgovora. Posle nje mogu slediti polja zaglavlja. Prazan red koji završava deo zaglavlja označava prelazak u tunel posle uspeš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 sledeće bajtove. TCP ne čuva granice pisanja servera.
Učinite primopredaju eksplicitnim stanjem parsera
- Prikupljajte i parsirajte statusnu liniju. Koristite numerički status umesto tačne engleske reason phrase.
- Nastavite dok ne stigne potpuni terminator dela zaglavlja. Uspešna statusna linija ne čini preostala polja nestalima.
- Za uspešan CONNECT odgovor, bajt odmah nakon tog terminatora smatrajte početkom podataka tunela. Za ostale odgovore sledite odgovarajuću obradu HTTP odgovora i autentifikacije.
- Prenesite vezu i sve nepotrošene bajtove kroz baferisani I/O interfejs koji podržava sledeći protokol.
Poslednji korak je važan čak i uz dobru pretragu graničnika. Baferisani čitač je mogao 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 baferu čitača.
Koristite rok za postavljanje i ograničenje veličine zaglavlja. EOF pre terminatora je nepotpun proxy odgovor, a ne poziv da čekate zauvek 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 deo zaglavlja. A sada zamislite potpun uspešan deo zaglavlja iza kojeg u istom baferu slede bajtovi tunela: ti dodatni bajtovi moraju preživeti primopredaju.
407 je drugačiji ishod. Zahteva obradu autentifikacije; ne dopušta TLS ClientHello u tunel koji nikada nije otvoren.
Preferirajte održavani konektor osim ako je implementacija rukovanja zadatak. Ova granica je specifična za ovde prikazanu HTTP/1 razmenu. HTTP/2 proxy nosi CONNECT na streamu s drugačijim uokvirenjem.