Saglabājiet buferētos datus pēc HTTP CONNECT atbildes
Izvairieties no iesprūdušas HTTP CONNECT darba sākšanas, atrodot atbildes galveņu robežu un saglabājot baitus, kas pienāk pēc tās.
Neliels starpniekservera ietvars var strādāt ar HTTPS un pēc tam iesprūst, kad to atkārtoti izmanto protokolam, kura serveris runā pirmais. Aizdomīgā rinda parasti ir tā, kas gaida, kamēr uztveršanas buferis beidzas ar \r\n\r\n.
TCP nodrošina klientam straumi. Viens uztveršanas izsaukums var atgriezt pusi HTTP statusa rindas, pilnu CONNECT atbildi vai šo atbildi tūlīt sekojošiem tuneļa datiem. Nav solījuma, ka lasīšana apstāsies galveņu beigās.
Atrodiet robežu bufera iekšpusē
HTTP/1.1 CONNECT apmaiņā uzkrājiet baitus, līdz galveņu beigu marķieris parādās jebkurā bufera vietā. Sadaliet tā pirmajā parādīšanās vietā. Parsējiet statusa rindu un galvenes no pirmās daļas; visu pēc robežas glabājiet atsevišķi. Gaidot piemērojiet galveņu izmēra ierobežojumu un taimautu, un tukšu ligzdas lasījumu uzskatiet par aizvērtu savienojumu, nevis vēl vienu uzaicinājumu cilpot.
Pēdējā veiksmīgā 2xx atbilde pārslēdz savienojumu tuneļa režīmā tūlīt pēc šīm galvenēm. Tiem sekojošie baiti jau ir tuneļa baiti. Neizmetiet tos, negaidiet CONNECT atbildes pamattekstu un neinterpretējiet Content-Length lauku kā atļauju patērēt daļu no jaunā protokola. Informatīvās atbildes, ja tādas ir, jāapstrādā pirms šīs pēdējās atbildes.
Ietvaram ir jānodod tā pārpalikumi
Atgriežot tikai pamatā esošo ligzdu, tiek zaudēti baiti, ko darba sākšanas parsētājs jau ir izvilcis no tās. Nākamajam lasītājam ir vajadzīga buferēta straume, kas vispirms atdod saglabāto asti un pēc tam atsāk ligzdas lasīšanu. Servera-pirmā protokolā šī sākotnējā sveiciena zaudēšana var likt abām pusēm gaidīt bezgalīgi.
Savukārt neveiksmīgas CONNECT atbildes baiti nav tuneļa sveiciens. 407 joprojām pieder starpniekservera apmaiņai un prasa autentifikācijas apstrādi; citam neveiksmīgam statusam nepieciešams atbilstošs kļūdas ceļš.
Tas ir īpaši svarīgi, pielāgojot FTP vai SSH klientu caur HTTP starpniekserveri. Starpniekserverim arī jāatļauj pieprasītā galamērķa porta izmantošana, un FTP var būt vajadzīgi papildu datu savienojumi. Pareiza galveņu parsēšana atrisina straumes nodošanu; tā nevar piešķirt CONNECT atļauju vai nodrošināt FTP otro kanālu.