NetworkStream.DataAvailable не отбелязва края на HTTP отговор
Предотвратете съкратени HTTP изтегляния, като използвате рамкиране на съобщенията вместо NetworkStream.DataAvailable като условие за край.
NetworkStream.DataAvailable == false означава, че няма байтове, готови за незабавно четене. Това не означава, че HTTP отговорът е завършен. Цикъл, който спира тук, може да отреже напълно нормално SOCKS изтегляне по време на пауза между пакети.
След като SOCKS установи TCP връзката, рамкирането на HTTP все още дава правилото за завършване:
- Тяло с Content-Length завършва след обявените байтове съдържание.
- Отговор с chunked кодиране се нуждае от завършващата част и приложимите trailers.
- Отговор, ограничен от връзката, завършва с връзката.
- Някои статуси и отговори на HEAD нямат тяло.
Прочетете статуса и заглавките, за да определите приложимото правило. Да се чака само затваряне не е универсално решение, защото завършен HTTP отговор може да остави връзката отворена. Капацитетът на един буфер също е еднакво несвързан с дължината на отговора.
Използвайте реализацията на рамкиране на HTTP клиента, когато тя поддържа избрания прокси транспорт. На съвместима съвременна .NET среда обмислете вградената SOCKS поддръжка на HttpClient. Суровата реализация трябва да пази състояние на анализа между частичните заглавки и четенията на тялото и да различава успешното завършване от отказ, изтичане на времето и неочакван EOF. При непуста заявка за четене нула прочетени байта означава, че потокът е приключил; това е различно от липсата на байтове в опашката в момента.
Проксито може да направи времевите паузи забележими, но не превръща пустата опашка за получаване в маркер за край на съобщението.