Așteptați linia goală după CONNECT
Citiți răspunsul HTTP/1 CONNECT complet înainte de a preda socketul către TLS, chiar când linia de stare sosește prima.
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
- Colectați și analizați linia de stare. Folosiți starea numerică în locul unei expresii englezești exacte a motivului.
- 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ă.
- 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.
- 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.