NetworkStream.DataAvailable არ აღნიშნავს HTTP პასუხის დასრულებას
თავიდან აიცილეთ წაკვეთილი HTTP ჩამოტვირთვები დასრულების პირობად NetworkStream.DataAvailable-ის ნაცვლად შეტყობინების ჩარჩოების გამოყენებით.
NetworkStream.DataAvailable == false ნიშნავს, რომ დაუყოვნებლივ წასაკითხად მზა ბაიტები არ არის. ეს არ ნიშნავს, რომ HTTP პასუხი დასრულებულია. იქ გაჩერებულ ციკლს შეუძლია პაკეტებს შორის შუალედში სრულიად ნორმალური SOCKS ჩამოტვირთვა წაკვეთოს.
მას შემდეგ, რაც SOCKS დაამყარებს TCP კავშირს, დასრულების წესს მაინც HTTP ჩარჩოები განსაზღვრავს:
- Content-Length-ის სხეული მთავრდება გამოცხადებული შიგთავსის ბაიტების შემდეგ.
- chunked პასუხს სჭირდება დასასრული chunk და შესაბამისი trailer-ები.
- კავშირით შემოზღუდული პასუხი კავშირთან ერთად მთავრდება.
- ზოგი სტატუსისა და HEAD-ის პასუხს სხეული არ აქვს.
წაიკითხეთ სტატუსი და სათაურები მოქმედი წესის დასადგენად. მხოლოდ დახურვის ლოდინი ზოგადი გადაწყვეტა არ არის, რადგან სრულ HTTP პასუხს შეუძლია კავშირი ღიად დატოვოს. ერთი ბუფერის ტევადობა ასევე არ არის დაკავშირებული პასუხის სიგრძესთან.
გამოიყენეთ HTTP კლიენტის ჩარჩოების იმპლემენტაცია, როცა ის მხარს უჭერს არჩეულ პროქსი ტრანსპორტს. თავსებად თანამედროვე .NET გარემოზე განიხილეთ HttpClient-ის მშობლიური SOCKS მხარდაჭერა. ნედლმა იმპლემენტაციამ უნდა შეინარჩუნოს ანალიზის მდგომარეობა ნაწილობრივ სათაურებსა და სხეულის კითხვებს შორის და განასხვავოს წარმატებული დასრულება გაუქმებისგან, დროის ამოწურვისა და მოულოდნელი EOF-ისგან. არაცარიელი კითხვის მოთხოვნისას ნული წაკითხული ბაიტი ნიშნავს, რომ ნაკადი დასრულდა; ეს განსხვავდება იმისგან, რომ ახლა რიგში ბაიტები არ არის.
პროქსის შეუძლია დროითი შუალედები თვალსაჩინო გახადოს, მაგრამ ცარიელ მიღების რიგს შეტყობინების დასასრულის ნიშნად არ აქცევს.