NetworkStream.DataAvailable не означава крај HTTP одговора
Спречите скраћена HTTP преузимања коришћењем уоквиривања порука уместо NetworkStream.DataAvailable као услова завршетка.
NetworkStream.DataAvailable == false значи да нема бајтова спремних за тренутно читање. То не значи да је HTTP одговор завршен. Петља која се ту заустави може одесећи сасвим нормално SOCKS преузимање током паузе између пакета.
Након што SOCKS успостави TCP везу, HTTP уоквиривање и даље даје правило завршетка:
- Тело са Content-Length завршава се након објављених бајтова садржаја.
- Chunked одговор захтева завршни chunk и примењиве trailere.
- Одговор ограничен везом завршава се заједно са везом.
- Неки статуси и одговори на HEAD немају тело.
Прочитајте статус и заглавља да одредите примењиво правило. Чекање само на затварање није опште решење јер потпун HTTP одговор може оставити везу отвореном. Капацитет једног бафера једнако је неповезан са дужином одговора.
Користите имплементацију уоквиривања HTTP клијента када подржава изабрани proxy транспорт. На компатибилном модерном .NET runtime-у размотрите уграђену SOCKS подршку HttpClient-а. Сирова имплементација мора да чува стање парсирања кроз делимична заглавља и читања тела и да разликује успешан завршетак од отказивања, истека времена и неочекиваног EOF-а. За захтев читања који није празан, нула прочитаних бајтова значи да је ток завршио; то се разликује од тога да тренутно нема бајтова у реду.
Прокси може учинити временске паузе уочљивим, али не претвара празан ред за пријем у ознаку краја поруке.