Wag vir die leë reël ná CONNECT
Lees die volledige HTTP/1 CONNECT-antwoord voordat die socket aan TLS oorhandig word, selfs wanneer die statuslyn eerste aankom.
Die kliënt sien 200 Connection Established, begin TLS en meld dadelik onsinnigheid waar 'n TLS-rekord behoort te wees. Soek eers na 'n onvoltooide HTTP-antwoord voordat jy die bestemming se cipher-instellings blameer.
By 'n HTTP/1 CONNECT-uitruiling is die statuslyn net die begin van die antwoord. Kopvelde kan daarop volg. Die leë reël wat die kopafdeling beëindig, merk die oorskakeling na die tonnel ná 'n geslaagde CONNECT-antwoord.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
Daardie grepe kan in een lees aankom, in verskeie lees, of in een wat ook daaropvolgende grepe bevat. TCP bewaar nie die bediener se skryfgrense nie.
Maak die oorhandiging 'n eksplisiete ontleder-toestand
- Versamel en ontleed die statuslyn. Gebruik die numeriese status eerder as 'n presiese Engelse reason phrase.
- Hou aan tot die volledige terminator van die kopafdeling aangekom het. 'n Geslaagde statuslyn laat nie die oorblywende velde verdwyn nie.
- By 'n geslaagde CONNECT-antwoord is die greep direk ná daardie terminator die begin van tonneldata. Volg by ander antwoorde die toepaslike HTTP-antwoord- en verifikasiehantering.
- Dra die verbinding en enige onverbruikte grepe oor via die volgende protokol se ondersteunde gebufferde I/O-koppelvlak.
Die laaste stap maak saak selfs met 'n goeie soektog na die skeidingsteken. 'n Gebufferde leser kon meer van die socket verbruik het as wat die ontleder aangevra het. Om TLS op die kaal socket te begin terwyl daardie leser laat vaar word, kan grepe in die leser se privaat buffer laat strand.
Gebruik 'n sperdatum vir die opstel en 'n limiet op die kopgrootte. EOF voor die terminator is 'n onvolledige proxy-antwoord, nie 'n uitnodiging om vir ewig te wag of om tog TLS te probeer nie.
Redeneer deur verskeie grense
Stel jou 'n lees voor wat ná Proxy-Agent: eindig. Die ontleder het nog meer HTTP-kopgrepe nodig. Stel jou 'n ander voor wat halfpad deur die laaste CRLF-reeks eindig. Dit is steeds nie 'n volledige kopafdeling nie. Stel jou nou 'n volledige geslaagde kopafdeling voor, gevolg deur tonnelgrepe in dieselfde buffer: daardie ekstra grepe moet die oorhandiging oorleef.
'n 407 is 'n ander uitkoms. Dit verg verifikasiehantering; dit magtig nie 'n TLS ClientHello in 'n tonnel wat nooit oopgemaak is nie.
Verkies 'n onderhoude connector, tensy die implementering van die handdruk die taak is. Hierdie grens is spesifiek vir die HTTP/1-uitruiling wat hier gewys word. 'n HTTP/2-proxy dra CONNECT op 'n stroom met ander framing.