Klienten ser 200 Connection Established, starter TLS og rapporterer straks vrøvl, hvor der burde være en TLS-record. Led efter et uafsluttet HTTP-svar, før du giver destinationens cipher-indstillinger skylden.

I en HTTP/1 CONNECT-udveksling er statuslinjen kun begyndelsen på svaret. Header-felter kan følge efter. Den tomme linje, der afslutter header-afsnittet, markerer skiftet til tunnelen efter et vellykket CONNECT-svar.

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

De bytes kan ankomme i én læsning, i flere læsninger eller i en læsning, der også indeholder efterfølgende bytes. TCP bevarer ikke serverens skrivegrænser.

Gør overdragelsen til en eksplicit parser-tilstand

  1. Indsaml og pars statuslinjen. Brug den numeriske status i stedet for en præcis engelsk reason phrase.
  2. Fortsæt, indtil den komplette terminator for header-afsnittet er ankommet. En vellykket statuslinje får ikke de resterende felter til at forsvinde.
  3. Ved et vellykket CONNECT-svar betragtes byten umiddelbart efter terminatoren som starten på tunneldata. Ved andre svar følges den relevante håndtering af HTTP-svar og godkendelse.
  4. Overfør forbindelsen og eventuelle ubrugte bytes gennem det bufferlagte I/O-interface, som den næste protokol understøtter.

Det sidste trin er vigtigt, selv med en god delimiter-søgning. En bufferlagret læser kan have forbrugt mere af socket'en, end parseren bad om. At starte TLS på den rå socket og samtidig opgive den læser kan efterlade bytes i læserens private buffer.

Brug en frist for opsætningen og en grænse for header-størrelsen. EOF før terminatoren er et ufuldstændigt proxy-svar, ikke en invitation til at vente for evigt eller prøve TLS alligevel.

Gennemtænk flere grænser

Forestil dig en læsning, der slutter efter Proxy-Agent:. Parseren mangler stadig flere HTTP-header-bytes. Forestil dig en anden, der slutter midt i den sidste CRLF-sekvens. Det er stadig ikke et komplet header-afsnit. Forestil dig nu et komplet vellykket header-afsnit efterfulgt af tunnelbytes i samme buffer: de ekstra bytes skal overleve overdragelsen.

Et 407 er et andet udfald. Det kræver godkendelseshåndtering; det tillader ikke et TLS ClientHello ind i en tunnel, der aldrig blev åbnet.

Foretræk en vedligeholdt connector, medmindre det er opgaven at implementere handshaket. Denne grænse gælder specifikt for den viste HTTP/1-udveksling. En HTTP/2-proxy bærer CONNECT på en stream med en anden framing.

Relaterede artikler