კლიენტი ხედავს 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-ის მკაფიო მდგომარეობა

  1. შეაგროვეთ და გააანალიზეთ სტატუსის ხაზი. გამოიყენეთ რიცხვითი სტატუსი ზუსტი ინგლისური მიზეზის ფრაზის ნაცვლად.
  2. განაგრძეთ, სანამ header-ის სექციის სრული დამამთავრებელი არ მოვა. წარმატებული სტატუსის ხაზი დარჩენილ ველებს არ აქრობს.
  3. წარმატებული CONNECT პასუხისას, ამ დამამთავრებლის შემდეგ მყოფი ბაიტი ჩათვალეთ გვირაბის მონაცემების დასაწყისად. სხვა პასუხებისას მიჰყევით შესაბამის HTTP პასუხისა და ავთენტიფიკაციის დამუშავებას.
  4. გადასცეთ კავშირი და ყველა გამოუყენებელი ბაიტი შემდეგი პროტოკოლის მიერ მხარდაჭერილი ბუფერირებული 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-ს სხვა ფრეიმინგის მქონე ნაკადზე ატარებს.

დაკავშირებული სტატიები