Ta vare på bufra data etter eit HTTP CONNECT-svar
Unngå eit fastlåst HTTP CONNECT-handtrykk ved å finne grensa for svarhovuda og ta vare på byta som kjem etter henne.
Ein liten proxy-innpakning kan fungere for HTTPS og deretter henge når han vert brukt om att for ein protokoll der tenaren snakkar først. Den mistenkelege linja er ofte den som ventar på at mottaksbufferen endar med \r\n\r\n.
TCP gjev klienten ein straum. Eitt mottakskall kan returnere halve HTTP-statuslinja, eit fullstendig CONNECT-svar, eller det svaret straks etterfølgt av tunneldatа. Det finst inga lovnad om at ei lesing stoppar ved slutten av hovuda.
Finn grensa inne i bufferen
For ein HTTP/1.1 CONNECT-utveksling, samle byte til hovudavsluttinga dukkar opp kvar som helst i bufferen. Del ved den første førekomsten. Analyser statuslinja og hovuda frå den første delen; ta vare på alt etter grensa separat. Set ei grense for hovudstorleik og ein tidsfrist medan du ventar, og handsam ei tom socket-lesing som ei lukka tilkopling i staden for ei ny innbyding til å løkke.
Eit siste vellukka 2xx-svar set tilkoplinga i tunnelmodus straks etter desse hovuda. Byta som følgjer er alt tunnelbyte. Ikkje kast dei, ikkje vent på ein CONNECT-svarkropp, og ikkje tolk eit Content-Length-felt som løyve til å bruke ein del av den nye protokollen. Informasjonssvar, om dei finst, må handsamast før det siste svaret.
Innpakninga må gje restane sine vidare
Å berre returnere den underliggjande socketen misser byta som handtrykksparsaren alt har trekt ut av han. Neste lesar treng ein bufra straum som gjev den lagra halen først og deretter held fram med socket-lesingar. For ein tenar-først-protokoll kan tapet av den første helsinga la begge sider vente i det uendelege.
Omvendt er byte frå eit mislukka CONNECT-svar ikkje ei tunnelhelsing. Ein 407 høyrer framleis til proxy-utvekslinga og krev handsaming av autentisering; ein annan mislukka status krev ein høveleg feilveg.
Dette er særleg viktig når ein tilpassar ein FTP- eller SSH-klient gjennom ein HTTP-proxy. Proxyen må òg tillate den førespurde målporten, og FTP kan trenge fleire datatilkoplingar. Rettsk hovudparsing løyser straumoverleveringa; ho kan ikkje gje CONNECT-løyve eller skaffe den andre FTP-kanalen.