Clientul vede 200 Connection Established, pornește TLS și raportează imediat prostii acolo unde ar trebui să existe o înregistrare TLS. Căutați un răspuns HTTP neterminat înainte de a da vina pe setările de cifrare ale destinației.

Într-un schimb HTTP/1 CONNECT, linia de stare este doar începutul răspunsului. Pot urma câmpuri de antet. Linia goală care încheie secțiunea de antet marchează trecerea la tunel după un răspuns CONNECT reușit.

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

Acești octeți pot sosi într-o singură citire, în mai multe citiri sau într-o citire care conține și octeții următori. TCP nu păstrează granițele de scriere ale serverului.

Faceți predarea o stare explicită a parserului

  1. Colectați și analizați linia de stare. Folosiți starea numerică în locul unei expresii englezești exacte a motivului.
  2. Continuați până când a sosit terminatorul complet al secțiunii de antet. O linie de stare reușită nu face câmpurile rămase să dispară.
  3. La un răspuns CONNECT reușit, considerați octetul imediat după acel terminator drept începutul datelor tunelului. La alte răspunsuri, urmați tratarea corespunzătoare a răspunsului HTTP și a autentificării.
  4. Transferați conexiunea și octeții neconsumați prin interfața I/O cu tampon pe care o acceptă protocolul următor.

Ultimul pas contează chiar și cu o căutare bună a delimitatorului. Un cititor cu tampon poate să fi consumat mai mult din socket decât a cerut parserul. Pornirea TLS pe socketul gol în timp ce acel cititor este abandonat poate lăsa octeți blocați în tamponul privat al cititorului.

Folosiți un termen limită pentru configurare și o limită de dimensiune a antetului. Un EOF înainte de terminator este un răspuns de proxy incomplet, nu o invitație de a aștepta la nesfârșit sau de a încerca TLS oricum.

Gândiți-vă la mai multe limite

Imaginați-vă o citire care se termină după Proxy-Agent:. Parserul mai are nevoie de octeți de antet HTTP. Imaginați-vă alta care se termină la jumătatea secvenței CRLF finale. Aceea încă nu este o secțiune de antet completă. Acum imaginați-vă o secțiune de antet completă și reușită urmată de octeți de tunel în același tampon: acei octeți în plus trebuie să supraviețuiască predării.

407 este un alt rezultat. Necesită tratarea autentificării; nu autorizează un TLS ClientHello într-un tunel care nu a fost niciodată deschis.

Preferați un conector întreținut, dacă implementarea strângerii de mână nu este sarcina. Această limită este specifică schimbului HTTP/1 arătat aici. Un proxy HTTP/2 transportă CONNECT pe un flux cu altă încadrare.

Articole similare