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

  1. Prikupljajte i parsirajte statusni redak. Koristite numerički status umjesto točne engleske reason phrase.
  2. Nastavite dok ne stigne potpuni terminator dijela zaglavlja. Uspješan statusni redak ne čini preostala polja nestalima.
  3. 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.
  4. 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.

Povezani članci