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

  1. Prikupljajte i parsirajte statusnu liniju. Koristite numerički status umesto tačne engleske reason phrase.
  2. Nastavite dok ne stigne potpuni terminator dela zaglavlja. Uspešna statusna linija ne čini preostala polja nestalima.
  3. 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.
  4. 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.

Povezani članci