Zachovajte údaje vo vyrovnávacej pamäti po odpovedi HTTP CONNECT
Vyhnite sa zaseknutému handshakeu HTTP CONNECT nájdením hranice hlavičiek odpovede a zachovaním bajtov, ktoré prichádzajú za ňou.
Malý obal proxy môže fungovať pre HTTPS a potom sa zaseknúť, keď sa znova použije pre protokol, ktorého server hovorí prvý. Podozrivý riadok je často ten, ktorý čaká, kým sa prijímacia vyrovnávacia pamäť skončí sekvenciou \r\n\r\n.
TCP dáva klientovi prúd. Jedno prijímacie volanie môže vrátiť polovicu riadku stavu HTTP, úplnú odpoveď CONNECT alebo tú odpoveď okamžite nasledovanú údajmi tunela. Neexistuje prísľub, že čítanie sa zastaví na konci hlavičiek.
Nájdite hranicu vo vnútri vyrovnávacej pamäte
Pri výmene HTTP/1.1 CONNECT zhromažďujte bajty, kým sa ukončovací znak hlavičiek neobjaví kdekoľvek vo vyrovnávacej pamäti. Rozdeľte na jeho prvom výskyte. Analyzujte riadok stavu a hlavičky z prvej časti; všetko po hranici uchovajte oddelene. Pri čakaní uplatnite limit veľkosti hlavičiek a časový limit a prázdne čítanie zo socketu považujte za uzavreté spojenie, nie za ďalšie pozvanie do slučky.
Posledná úspešná odpoveď 2xx prepne spojenie do tunelového režimu hneď po týchto hlavičkách. Bajty, ktoré nasledujú, sú už tunelové bajty. Nezahadzujte ich, nečakajte telo odpovede CONNECT a neinterpretujte pole Content-Length ako povolenie spotrebovať časť nového protokolu. Informačné odpovede, ak existujú, treba spracovať pred touto konečnou odpoveďou.
Obal musí odovzdať svoje zvyšky
Vrátenie iba podkladového socketu stráca bajty, ktoré z neho parser handshakeu už vytiahol. Nasledujúci čitateľ potrebuje bufferovaný prúd, ktorý najprv vydá uložený chvost a potom obnoví čítanie zo socketu. Pri protokole, kde server hovorí prvý, strata tohto úvodného pozdravu môže nechať obe strany čakať donekonečna.
Naopak, bajty z neúspešnej odpovede CONNECT nie sú tunelový pozdrav. 407 stále patrí k výmene s proxy a vyžaduje spracovanie autentifikácie; iný neúspešný stav vyžaduje vhodnú chybovú cestu.
To je dôležité najmä pri prispôsobovaní klienta FTP alebo SSH cez proxy HTTP. Proxy musí tiež povoliť požadovaný cieľový port a FTP môže potrebovať ďalšie dátové spojenia. Správne parsovanie hlavičiek rieši odovzdanie prúdu; nemôže udeliť povolenie CONNECT ani poskytnúť druhý kanál FTP.