Klienten ser 200 Connection Established, starter TLS og melder straks tull der det skulle stått en TLS-record. Se etter et ufullstendig HTTP-svar før du skylder på målsettings cipher-innstillinger.

I en HTTP/1 CONNECT-utveksling er statuslinjen bare starten på svaret. Etter den kan header-felt følge. Den tomme linjen som avslutter header-delen, markerer skiftet inn i tunnelen etter et vellykket CONNECT-svar.

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

Disse bytene kan ankomme i én lesing, flere lesinger, eller i en lesing som også inneholder påfølgende byter. TCP bevarer ikke skrivegrensene til serveren.

Gjør overleveringen til en tydelig parser-tilstand

  1. Samle og parse statuslinjen. Bruk den numeriske statusen framfor en nøyaktig engelsk reason phrase.
  2. Fortsett til hele terminatoren for header-delen er ankommet. En vellykket statuslinje får ikke de gjenstående feltene til å forsvinne.
  3. Ved et vellykket CONNECT-svar regnes byten like etter terminatoren som starten på tunneldatene. Ved andre svar følger du riktig behandling av HTTP-svar og autentisering.
  4. Overfør forbindelsen og eventuelle ubrukte byter gjennom det bufrede I/O-grensesnittet som neste protokoll støtter.

Det siste trinnet betyr noe selv med et godt søk etter skilletegnet. En bufret leser kan ha brukt mer av socketen enn parseren ba om. Å starte TLS på den bare socketen samtidig som den leseren forlates, kan etterlate byter i leserens private buffer.

Bruk en frist for oppsettet og en grense for header-størrelsen. EOF før terminatoren er et ufullstendig proxy-svar, ikke en invitasjon til å vente i det uendelige eller prøve TLS likevel.

Tenk gjennom flere grenser

Tenk deg en lesing som slutter etter Proxy-Agent:. Parseren trenger fortsatt flere HTTP-header-byter. Tenk deg en annen som slutter midt i den siste CRLF-sekvensen. Det er fortsatt ikke en komplett header-del. Tenk deg nå en komplett vellykket header-del etterfulgt av tunnelbyter i samme buffer: disse ekstra bytene må overleve overleveringen.

407 er et annet utfall. Det krever autentiseringsbehandling; det tillater ikke en TLS ClientHello inn i en tunnel som aldri ble åpnet.

Foretrekk en vedlikeholdt connector med mindre selve håndtrykket er oppgaven. Denne grensen gjelder spesifikt HTTP/1-utvekslingen som vises her. En HTTP/2-proxy bærer CONNECT på en strøm med annen innramming.

Relaterte artikler