Mali proxy omotač može raditi za HTTPS, a zatim se zaglaviti kada se ponovo upotrebi za protokol čiji server govori prvi. Sumnjiva linija je obično ona koja čeka da prijemni bafer završi sa \r\n\r\n.

TCP daje klijentu tok. Jedan prijemni poziv može vratiti pola HTTP linije stanja, potpun CONNECT odgovor ili taj odgovor odmah praćen tunelskim podacima. Nema garancije da se čitanje zaustavlja na kraju zaglavlja.

Pronađite granicu unutar bafera

Za HTTP/1.1 CONNECT razmenu, sakupljajte bajtove dok se završetak zaglavlja ne pojavi bilo gde u baferu. Podelite na njegovom prvom pojavljivanju. Raščlanite liniju stanja i zaglavlja iz prvog dela; sve posle granice sačuvajte odvojeno. Primenite ograničenje veličine zaglavlja i vremensko ograničenje tokom čekanja, a prazno čitanje soketa tretirajte kao zatvorenu vezu, a ne kao još jedan poziv na petlju.

Konačan uspešan 2xx odgovor prebacuje vezu u tunelski režim odmah posle tih zaglavlja. Bajtovi koji slede već su tunelski bajtovi. Nemojte ih odbaciti, nemojte čekati telo CONNECT odgovora i nemojte polje Content-Length tumačiti kao dozvolu da se potroši deo novog protokola. Informativni odgovori, ako postoje, moraju se obraditi pre tog konačnog odgovora.

Omotač mora da prenese svoje ostatke

Vraćanje samo osnovnog soketa gubi bajtove koje je raščlanjivač rukovanja već izvukao iz njega. Sledećem čitaocu potreban je baferisan tok koji prvo daje sačuvani rep, a zatim nastavlja čitanja sa soketa. Za protokol u kojem server govori prvi, gubitak tog početnog pozdrava može ostaviti obe strane da čekaju beskonačno.

Obrnuto, bajtovi iz neuspešnog CONNECT odgovora nisu tunelski pozdrav. 407 i dalje pripada proxy razmeni i zahteva obradu autentikacije; drugi neuspešan status zahteva odgovarajuću putanju greške.

Ovo je posebno važno pri prilagođavanju FTP ili SSH klijenta kroz HTTP proxy. Proxy takođe mora dozvoliti traženi odredišni port, a FTP može zahtevati dodatne podatkovne veze. Ispravno raščlanjivanje zaglavlja rešava prenos toka; ono ne može odobriti CONNECT niti obezbediti drugi kanal FTP-a.

Povezani članci