დაელოდეთ ცარიელ ხაზს CONNECT-ის შემდეგ
წაიკითხეთ სრული HTTP/1 CONNECT პასუხი, სანამ socket-ს TLS-ს გადასცემთ, თუნდაც სტატუსის ხაზი პირველი მოვიდეს.
კლიენტი ხედავს 200 Connection Established-ს, იწყებს TLS-ს და მაშინვე იტყობინება უაზრობას იქ, სადაც TLS ჩანაწერი უნდა იყოს. მოძებნეთ დაუმთავრებელი HTTP პასუხი, სანამ დანიშნულების შიფრის პარამეტრებს დაადანაშაულებთ.
HTTP/1 CONNECT გაცვლაში სტატუსის ხაზი მხოლოდ პასუხის დასაწყისია. მის შემდეგ შეიძლება მოვიდეს header-ის ველები. ცარიელი ხაზი, რომელიც ამთავრებს header-ის სექციას, აღნიშნავს გვირაბზე გადასვლას წარმატებული CONNECT პასუხის შემდეგ.
HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n
ეს ბაიტები შეიძლება მოვიდეს ერთი წაკითხვით, რამდენიმე წაკითხვით, ან წაკითხვით, რომელიც მომდევნო ბაიტებსაც შეიცავს. TCP არ ინახავს სერვერის ჩაწერის საზღვრებს.
გადაცემა გახადეთ parser-ის მკაფიო მდგომარეობა
- შეაგროვეთ და გააანალიზეთ სტატუსის ხაზი. გამოიყენეთ რიცხვითი სტატუსი ზუსტი ინგლისური მიზეზის ფრაზის ნაცვლად.
- განაგრძეთ, სანამ header-ის სექციის სრული დამამთავრებელი არ მოვა. წარმატებული სტატუსის ხაზი დარჩენილ ველებს არ აქრობს.
- წარმატებული CONNECT პასუხისას, ამ დამამთავრებლის შემდეგ მყოფი ბაიტი ჩათვალეთ გვირაბის მონაცემების დასაწყისად. სხვა პასუხებისას მიჰყევით შესაბამის HTTP პასუხისა და ავთენტიფიკაციის დამუშავებას.
- გადასცეთ კავშირი და ყველა გამოუყენებელი ბაიტი შემდეგი პროტოკოლის მიერ მხარდაჭერილი ბუფერირებული I/O ინტერფეისით.
ბოლო ნაბიჯი მნიშვნელოვანია კარგი გამყოფის ძებნის შემთხვევაშიც. ბუფერირებულმა მკითხველმა შეიძლება უფრო მეტი socket მოიხმარა, ვიდრე parser-მა მოითხოვა. TLS-ის დაწყება შიშველ socket-ზე იმ მკითხველის მიტოვებით შეიძლება ბაიტები დატოვოს მკითხველის კერძო ბუფერში.
გამოიყენეთ დაყენების ვადა და header-ის ზომის ლიმიტი. EOF დამამთავრებლამდე არასრული proxy პასუხია, არა მოწვევა უსასრულოდ ლოდინის ან მაინც TLS-ის ცდისკენ.
გაიარეთ რამდენიმე საზღვარი
წარმოიდგინეთ წაკითხვა, რომელიც Proxy-Agent:-ის შემდეგ მთავრდება. parser-ს ჯერ კიდევ სჭირდება დამატებითი HTTP header-ის ბაიტები. წარმოიდგინეთ სხვა, რომელიც ბოლო CRLF მიმდევრობის შუაში მთავრდება. ეს ჯერ არ არის სრული header-ის სექცია. ახლა წარმოიდგინეთ სრული წარმატებული header-ის სექცია, რომელსაც იმავე ბუფერში გვირაბის ბაიტები მოსდევს: ეს დამატებითი ბაიტები გადაცემას უნდა გადაურჩეს.
407 სხვა შედეგია. მას ავთენტიფიკაციის დამუშავება სჭირდება; ის არ უშვებს TLS ClientHello-ს იმ გვირაბში, რომელიც არასდროს გახსნილა.
უპირატესობა მიანიჭეთ მხარდაჭერილ კონექტორს, თუ ხელის ჩამორთმევის იმპლემენტაცია თავად ამოცანა არ არის. ეს საზღვარი ეხება აქ ნაჩვენებ HTTP/1 გაცვლას. HTTP/2 proxy CONNECT-ს სხვა ფრეიმინგის მქონე ნაკადზე ატარებს.