Vent på den tomme linjen etter CONNECT
Les hele HTTP/1 CONNECT-svaret før du overlater socketen til TLS, selv når statuslinjen kommer først.
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
- Samle inn og pars statuslinjen. Bruk den numeriske statusen i stedet for en nøyaktig engelsk reason phrase.
- Fortsett til den komplette terminatoren for header-avsnittet har kommet. En vellykket statuslinje får ikke de resterende feltene til å forsvinne.
- 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.
- 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.