Klient uvidí 200 Connection Established, spustí TLS a okamžite hlási nezmysly tam, kde má byť záznam TLS. Hľadajte nedokončenú odpoveď HTTP, kým obviníte nastavenia šifier cieľa.

Pri výmene HTTP/1 CONNECT je stavový riadok len začiatok odpovede. Nasledovať môžu polia hlavičky. Prázdny riadok ukončujúci sekciu hlavičky označuje prechod do tunela po úspešnej odpovedi CONNECT.

HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n

Tieto bajty môžu prísť v jednom čítaní, vo viacerých čítaniach alebo v čítaní, ktoré obsahuje aj ďalšie bajty. TCP nezachováva hranice zápisu servera.

Urobte z odovzdania explicitný stav parsera

  1. Zbierajte a parsujte stavový riadok. Používajte číselný stav namiesto presnej anglickej frázy dôvodu.
  2. Pokračujte, kým nepríde úplný terminátor sekcie hlavičky. Úspešný stavový riadok nenechá zostávajúce polia zmiznúť.
  3. Pri úspešnej odpovedi CONNECT považujte bajt hneď za týmto terminátorom za začiatok dát tunela. Pri ostatných odpovediach postupujte podľa príslušného spracovania odpovede HTTP a autentizácie.
  4. Odovzdajte spojenie a všetky nespotrebované bajty cez bufferované I/O rozhranie, ktoré podporuje nasledujúci protokol.

Posledný krok je dôležitý aj pri dobrom hľadaní oddeľovača. Bufferovaný čitateľ mohol zo socketu spotrebovať viac, než parser požadoval. Spustenie TLS na holom sockete a opustenie tohto čitateľa môže nechať bajty uviaznuté v súkromnom bufferi čitateľa.

Použite lehotu na nadviazanie a limit veľkosti hlavičky. EOF pred terminátorom je neúplná odpoveď proxy, nie pozvanie čakať večne alebo TLS aj tak skúsiť.

Premyslite niekoľko hraníc

Predstavte si čítanie, ktoré skončí po Proxy-Agent:. Parser stále potrebuje ďalšie bajty hlavičky HTTP. Predstavte si iné, ktoré skončí uprostred poslednej sekvencie CRLF. To stále nie je úplná sekcia hlavičky. A teraz si predstavte úplnú úspešnú sekciu hlavičky, za ktorou v tom istom bufferi nasledujú bajty tunela: tieto bajty navyše musia odovzdanie prežiť.

407 je iný výsledok. Vyžaduje spracovanie autentizácie; neoprávňuje TLS ClientHello do tunela, ktorý nebol nikdy otvorený.

Uprednostnite udržiavaný konektor, ak nie je úlohou implementovať handshake. Táto hranica je špecifická pre tu ukázanú výmenu HTTP/1. Proxy HTTP/2 nesie CONNECT na streame s iným rámovaním.

Súvisiace články