Klienten ser 200 Connection Established, startar TLS och rapporterar genast nonsens där en TLS-post borde finnas. Leta efter ett oavslutat HTTP-svar innan du skyller på målets chifferinställningar.

I ett HTTP/1 CONNECT-utbyte är statusraden bara början på svaret. Headerfält kan följa. Den tomma rad som avslutar headerdelen markerar övergången till tunneln efter ett lyckat CONNECT-svar.

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

De byten kan anlända i en läsning, i flera läsningar eller i en läsning som också innehåller nästa byten. TCP bevarar inte serverns skrivgränser.

Gör överlämningen till ett explicit parsertillstånd

  1. Samla in och parsa statusraden. Använd den numeriska statusen i stället för en exakt engelsk orsaksfras.
  2. Fortsätt tills den fullständiga terminatorn för headerdelen har anlänt. En lyckad statusrad får inte de återstående fälten att försvinna.
  3. Vid ett lyckat CONNECT-svar räknas byten direkt efter terminatorn som början på tunneldatan. Vid andra svar följer du rätt hantering av HTTP-svar och autentisering.
  4. Överför anslutningen och eventuella oanvända byten via det buffrade I/O-gränssnitt som nästa protokoll stöder.

Det sista steget spelar roll även med en bra avgränsarsökning. En buffrad läsare kan ha förbrukat mer av socketen än parsern bad om. Att starta TLS på den nakna socketen samtidigt som den läsaren överges kan lämna byten i läsarens privata buffert.

Använd en tidsfrist för uppkopplingen och en gräns för headerstorleken. EOF före terminatorn är ett ofullständigt proxy-svar, inte en inbjudan att vänta för evigt eller prova TLS ändå.

Resonera igenom flera gränser

Föreställ dig en läsning som slutar efter Proxy-Agent:. Parsern behöver fortfarande fler HTTP-headerbyten. Föreställ dig en annan som slutar mitt i den sista CRLF-sekvensen. Det är fortfarande inte en komplett headerdel. Föreställ dig nu en komplett lyckad headerdel följd av tunnelbyten i samma buffert: de extra byten måste överleva överlämningen.

407 är ett annat utfall. Det kräver autentiseringshantering; det tillåter ingen TLS ClientHello in i en tunnel som aldrig öppnades.

Föredra en underhållen connector om det inte är uppgiften att implementera handskakningen. Den här gränsen gäller specifikt för HTTP/1-utbytet som visas här. En HTTP/2-proxy bär CONNECT på en ström med annan inframning.

Relaterade artiklar