Klienten ser 200 Connection Established, starter TLS og rapporterer straks tull der det skulle vært en TLS-record. Se etter et ufullført HTTP-svar før du gir cipher-innstillingene til målet skylden.

I en HTTP/1 CONNECT-utveksling er statuslinjen bare begynnelsen på svaret. Header-felt kan følge. Den tomme linjen som avslutter header-avsnittet markerer overgangen til tunnelen etter et vellykket CONNECT-svar.

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

Disse bytene kan komme i én lesing, i flere lesinger eller i en lesing som også inneholder de neste bytene. TCP bevarer ikke serverens skrivegrenser.

Gjør overleveringen til en eksplisitt parser-tilstand

  1. Samle inn og pars statuslinjen. Bruk den numeriske statusen i stedet for en nøyaktig engelsk reason phrase.
  2. Fortsett til den komplette terminatoren for header-avsnittet har kommet. En vellykket statuslinje får ikke de resterende feltene til å forsvinne.
  3. Ved et vellykket CONNECT-svar regnes byten rett etter terminatoren som starten på tunneldatene. Ved andre svar følger du riktig håndtering 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 er viktig selv med et godt delimitersøk. En bufret leser kan ha brukt mer av socketen enn parseren ba om. Å starte TLS på den bare socketen mens 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 evig eller prøve TLS likevel.

Tenk gjennom flere grenser

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

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

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

Relaterte artikler