Oota tühja rida pärast CONNECTi
Loe täielik HTTP/1 CONNECTi vastus enne, kui annad socketi TLS-ile üle, isegi kui olekurida saabub esimesena.
Klient näeb 200 Connection Established, käivitab TLS-i ja teatab kohe mõttetusi seal, kus peaks olema TLS-kirje. Otsi lõpetamata HTTP-vastust, enne kui süüdistad sihtkoha šifri seadeid.
HTTP/1 CONNECTi vahetuses on olekurida ainult vastuse algus. Sellele võivad järgneda päiseväljad. Päiseosa lõpetav tühi rida märgib üleminekut tunnelisse pärast õnnestunud CONNECTi vastust.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
Need baidid võivad saabuda ühe lugemisega, mitme lugemisega või lugemisega, mis sisaldab ka järgnevaid baite. TCP ei säilita serveri kirjutamise piire.
Tee üleandmisest parseri selge olek
- Kogu ja parsi olekurida. Kasuta numbrilist olekut, mitte täpset ingliskeelset põhjuse fraasi.
- Jätka, kuni täielik päiseosa lõpp on saabunud. Õnnestunud olekurida ei pane ülejäänud välju kaduma.
- Õnnestunud CONNECTi vastuse korral loe vahetult pärast lõppu tulev bait tunneliandmete alguseks. Muude vastuste korral järgi sobivat HTTP-vastuse ja autentimise käsitlust.
- Edasta ühendus ja kõik kasutamata baidid järgmise protokolli toetatud puhverdatud I/O-liidese kaudu.
Viimane samm on oluline ka hea eraldajaotsingu korral. Puhverdatud lugeja võib olla socketist tarbinud rohkem, kui parser palus. TLS-i käivitamine paljal socketil, jättes selle lugeja kõrvale, võib jätta baidid lugeja privaatsesse puhvrisse.
Kasuta seadistamise tähtaega ja päise suuruse piirangut. EOF enne lõppu on puudulik puhverserveri vastus, mitte kutse oodata igavesti või TLS-i siiski proovida.
Mõtle läbi mitu piiri
Kujuta ette lugemist, mis lõpeb pärast Proxy-Agent:. Parser vajab veel HTTP-päise baite. Kujuta ette teist, mis lõpeb viimase CRLF-jada keskel. See ei ole veel täielik päiseosa. Nüüd kujuta ette täielikku õnnestunud päiseosa, millele järgnevad samas puhvris tunneli baidid: need lisabaidid peavad üleandmise üle elama.
407 on teine tulemus. See nõuab autentimise käsitlust; see ei luba TLS ClientHello tunnelisse, mida kunagi ei avatud.
Eelista hooldatud connectorit, kui just käepigistuse juurutamine pole ülesanne. See piir kehtib siin näidatud HTTP/1 vahetuse kohta. HTTP/2 puhverserver kannab CONNECTi erineva raamistusega voos.