Sačuvajte baferisane podatke nakon HTTP CONNECT odgovora
Izbjegnite zaglavljenu HTTP CONNECT rukovalicu tako što ćete pronaći granicu zaglavlja odgovora i sačuvati bajtove koji dolaze nakon nje.
Mali proxy omotač može raditi za HTTPS, a zatim se zaglaviti kada se ponovo koristi za protokol u kojem server govori prvi. Sumnjiva linija je često ona koja čeka da se prijemni bafer završi sa \r\n\r\n.
TCP daje klijentu tok. Jedan prijemni poziv može vratiti pola HTTP statusne linije, potpun CONNECT odgovor ili taj odgovor praćen odmah podacima tunela. Nema obećanja da će se čitanje zaustaviti na kraju zaglavlja.
Pronađite granicu unutar bafera
Za HTTP/1.1 CONNECT razmjenu, skupljajte bajtove dok se terminator zaglavlja ne pojavi bilo gdje u baferu. Podijelite na prvom pojavljivanju. Parsirajte statusnu liniju i zaglavlja iz prvog dijela; sve nakon granice zadržite odvojeno. Primijenite ograničenje veličine zaglavlja i vremensko ograničenje dok čekate, a prazno čitanje soketa tretirajte kao zatvorenu vezu, a ne kao novi poziv na petlju.
Konačni uspješni 2xx odgovor prebacuje vezu u tunelski režim odmah nakon tih zaglavlja. Njegovi prateći bajtovi su već tunelski bajtovi. Ne odbacujte ih, ne čekajte tijelo CONNECT odgovora i ne tumačite polje Content-Length kao dozvolu da potrošite dio novog protokola. Informativni odgovori, ako postoje, moraju se obraditi prije tog konačnog odgovora.
Omotač mora proslijediti svoje ostatke
Vraćanje samo osnovnog soketa gubi sve bajtove koje je parser rukovanja već izvukao iz njega. Sljedećem čitaču treba baferisani tok koji prvo daje sačuvani rep, a zatim nastavlja čitanje soketa. Za protokol u kojem server govori prvi, gubitak tog početnog pozdrava može ostaviti obje strane da čekaju beskonačno.
Nasuprot tome, bajtovi iz neuspjelog CONNECT odgovora nisu tunelski pozdrav. 407 i dalje pripada proxy razmjeni i zahtijeva obradu autentifikacije; drugi neuspješni status zahtijeva odgovarajuću putanju greške.
To je posebno važno kada prilagođavate FTP ili SSH klijenta kroz HTTP proxy. Proxy također mora dopustiti traženi odredišni port, a FTP može trebati dodatne podatkovne veze. Ispravno parsiranje zaglavlja rješava primopredaju toka; ono ne može dati CONNECT dozvolu niti osigurati drugi FTP kanal.