Gaidiet tukšo rindu pēc CONNECT
Izlasiet pilnu HTTP/1 CONNECT atbildi pirms socket pārejas uz TLS, pat ja statusa rinda atnāk pirmā.
Klients ierauga 200 Connection Established, sāk TLS un uzreiz ziņo muļķības tur, kur jābūt TLS ierakstam. Meklējiet nepabeigtu HTTP atbildi, pirms vainojat galamērķa šifrēšanas iestatījumus.
HTTP/1 CONNECT apmaiņā statusa rinda ir tikai atbildes sākums. Pēc tās var sekot galvences lauki. Tukšā rinda, kas noslēdz galvenes sadaļu, iezīmē pāreju uz tuneli pēc veiksmīgas CONNECT atbildes.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
Šie baiti var atnākt vienā lasījumā, vairākos lasījumos vai lasījumā, kas satur arī nākamos baitus. TCP nesaglabā servera rakstīšanas robežas.
Padariet nodošanu par skaidru parsera stāvokli
- Savāciet un parsējiet statusa rindu. Izmantojiet skaitlisko statusu, nevis precīzu angļu iemesla frāzi.
- Turpiniet, līdz ir pienācis pilnīgs galvenes sadaļas noslēdzējs. Veiksmīga statusa rinda neizraisa atlikušo lauku pazušanu.
- Veiksmīgas CONNECT atbildes gadījumā baitu uzreiz pēc šī noslēdzēja uzskatiet par tuneļa datu sākumu. Citās atbildēs ievērojiet atbilstošo HTTP atbildes un autentifikācijas apstrādi.
- Pārsūtiet savienojumu un visus neizmantotos baitus caur buferēto I/O saskarni, ko atbalsta nākamais protokols.
Pēdējais solis ir svarīgs arī ar labu atdalītāja meklēšanu. Buferēts lasītājs var būt patērējis vairāk socket, nekā parseris pieprasīja. TLS sākšana uz kailā socket, atstājot šo lasītāju, var atstāt baitus lasītāja privātajā buferī.
Izmantojiet iestatīšanas termiņu un galvenes izmēra ierobežojumu. EOF pirms noslēdzēja ir nepilnīga starpniekservera atbilde, nevis aicinājums gaidīt mūžīgi vai tomēr mēģināt TLS.
Pārdomājiet vairākas robežas
Iedomājieties lasījumu, kas beidzas pēc Proxy-Agent:. Parserim joprojām vajag vairāk HTTP galvenes baitu. Iedomājieties citu, kas beidzas pēdējās CRLF secības vidū. Tas vēl nav pilnīga galvenes sadaļa. Tagad iedomājieties pilnu veiksmīgu galvenes sadaļu, kam tajā pašā buferī seko tuneļa baiti: šiem papildu baitiem jāpāržīvo nodošana.
407 ir cits iznākums. Tam nepieciešama autentifikācijas apstrāde; tas neļauj TLS ClientHello iekļūt tunelī, kas nekad nav atvērts.
Dodiet priekšroku uzturētam savienotājam, ja vien roku paspiešanas ieviešana nav uzdevums. Šī robeža attiecas uz šeit parādīto HTTP/1 apmaiņu. HTTP/2 starpniekserveris pārnēsā CONNECT straumē ar citu kadrējumu.