Išsaugokite buferio duomenis po HTTP CONNECT atsakymo
Išvenkite užstrigusio HTTP CONNECT rankos paspaudimo radę atsakymo antraščių ribą ir išsaugodami baitus, kurie atkeliauja po jos.
Maža proxy apvalkalo programa gali veikti su HTTPS, o paskui užstrigti, kai naudojama protokolui, kurio serveris kalba pirmas. Įtartina eilutė dažnai yra ta, kuri laukia, kol priėmimo buferis pasibaigs seka \r\n\r\n.
TCP suteikia klientui srautą. Vienas priėmimo kvietimas gali grąžinti pusę HTTP būsenos eilutės, visą CONNECT atsakymą arba tą atsakymą iškart po jo einančiais tunelio duomenimis. Nėra pažado, kad skaitymas sustos antraščių pabaigoje.
Raskite ribą buferio viduje
HTTP/1.1 CONNECT mainams kaupkite baitus, kol antraščių pabaigos žymė pasirodys bet kurioje buferio vietoje. Skirkite jos pirmojo pasirodymo vietoje. Išanalizuokite būsenos eilutę ir antraštes iš pirmos dalies; viską po ribos saugokite atskirai. Laukdami taikykite antraščių dydžio ribą ir laiko limitą, o tuščią lizdo skaitymą laikykite uždara jungtimi, o ne dar vienu kvietimu suktis cikle.
Galutinis sėkmingas 2xx atsakymas iškart po tų antraščių perjungia jungtį į tunelio režimą. Po jo einantys baitai jau yra tunelio baitai. Neišmeskite jų, nelaukite CONNECT atsakymo kūno ir netraktuokite Content-Length lauko kaip leidimo sunaudoti dalį naujojo protokolo. Informaciniai atsakymai, jei jų yra, turi būti apdoroti prieš tą galutinį atsakymą.
Apvalkalas turi perduoti savo likučius
Grąžinus tik pagrindinį lizdą, prarandami baitai, kuriuos rankos paspaudimo analizatorius jau ištraukė iš jo. Kitam skaitytojui reikia buferinio srauto, kuris pirmiausia pateikia išsaugotą uodegą, o paskui atnaujina lizdo skaitymus. Serverio-pirmo protokole praradus tą pradinį pasveikinimą abi pusės gali laukti be galo.
Ir atvirkščiai, nepavykusio CONNECT atsakymo baitai nėra tunelio pasveikinimas. 407 vis dar priklauso proxy mainams ir reikalauja autentifikacijos apdorojimo; kita nesėkminga būsena reikalauja tinkamo klaidos kelio.
Tai ypač svarbu pritaikant FTP ar SSH klientą per HTTP proxy. Proxy taip pat turi leisti prašomą paskirties portą, o FTP gali prireikti papildomų duomenų jungčių. Teisingas antraščių analizavimas išsprendžia srauto perdavimą; jis negali suteikti CONNECT leidimo ar užtikrinti antrojo FTP kanalo.