Počkajte na prázdny riadok za CONNECT
Prečítajte celú odpoveď HTTP/1 CONNECT, kým socket odovzdáte TLS, aj keď stavový riadok príde prvý.
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
- Zbierajte a parsujte stavový riadok. Používajte číselný stav namiesto presnej anglickej frázy dôvodu.
- Pokračujte, kým nepríde úplný terminátor sekcie hlavičky. Úspešný stavový riadok nenechá zostávajúce polia zmiznúť.
- 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.
- 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.