Klientas pamato 200 Connection Established, pradeda TLS ir iš karto praneša nesąmones ten, kur turėtų būti TLS įrašas. Ieškokite nebaigto HTTP atsakymo, prieš kaltindami paskirties šifravimo nustatymus.

HTTP/1 CONNECT mainuose būsenos eilutė yra tik atsakymo pradžia. Po jos gali eiti antraštės laukai. Tuščia eilutė, užbaigianti antraštės skyrių, žymi perėjimą į tunelį po sėkmingo CONNECT atsakymo.

HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n

Šie baitai gali atkeliauti vienu skaitymu, keliais skaitymais arba skaitymu, kuriame yra ir tolesni baitai. TCP neišsaugo serverio rašymo ribų.

Padarykite perdavimą aiškia parserio būsena

  1. Surinkite ir išanalizuokite būsenos eilutę. Naudokite skaitinę būseną, o ne tikslią anglišką priežasties frazę.
  2. Tęskite, kol ateis visas antraštės skyriaus pabaigos žymeklis. Sėkminga būsenos eilutė nepanaikina likusių laukų.
  3. Sėkmingo CONNECT atsakymo atveju baitą iškart po to žymeklio laikykite tunelio duomenų pradžia. Kitų atsakymų atveju laikykitės atitinkamo HTTP atsakymo ir autentifikavimo apdorojimo.
  4. Perduokite ryšį ir visus nepanaudotus baitus per kito protokolo palaikomą buferinę I/O sąsają.

Paskutinis žingsnis svarbus net ir gerai ieškant skirtuko. Buferinis skaitytuvas galėjo sunaudoti daugiau socket'o, nei parseris paprašė. Paleidus TLS ant pliko socket'o ir palikus tą skaitytuvą, baitai gali likti skaitytuvo privačiame buferyje.

Naudokite nustatymo terminą ir antraštės dydžio ribą. EOF prieš pabaigos žymeklį yra nebaigtas proxy atsakymas, o ne kvietimas laukti amžinai ar vis tiek bandyti TLS.

Apsvarstykite kelias ribas

Įsivaizduokite skaitymą, kuris baigiasi po Proxy-Agent:. Parseriui dar reikia HTTP antraštės baitų. Įsivaizduokite kitą, kuris baigiasi pusiaukelėje paskutinės CRLF sekos. Tai dar ne visas antraštės skyrius. Dabar įsivaizduokite visą sėkmingą antraštės skyrių, po kurio tame pačiame buferyje eina tunelio baitai: tie papildomi baitai turi išgyventi perdavimą.

407 yra kitokia baigtis. Jam reikia autentifikavimo apdorojimo; jis neleidžia TLS ClientHello patekti į tunelį, kuris niekada nebuvo atidarytas.

Pirmenybę teikite prižiūrimam jungikliui, nebent paties rankos paspaudimo įgyvendinimas yra užduotis. Ši riba būdinga čia parodytiems HTTP/1 mainams. HTTP/2 proxy perduoda CONNECT sraute su kitokia kadravimo struktūra.

Susiję straipsniai