NetworkStream.DataAvailable не позначає кінець HTTP-відповіді
Уникайте обрізаних завантажень HTTP, використовуючи кадрування повідомлень замість NetworkStream.DataAvailable як умови завершення.
NetworkStream.DataAvailable == false означає, що немає байтів, готових до негайного читання. Це не означає, що HTTP-відповідь завершена. Цикл, який тут зупиняється, може обрізати цілком нормальне завантаження через SOCKS під час паузи між пакетами.
Після того як SOCKS встановлює TCP-з'єднання, правило завершення все ще задає кадрування HTTP:
- Тіло з Content-Length закінчується після оголошених байтів вмісту.
- Відповідь chunked потребує завершального чанка та застосовних trailer-ів.
- Відповідь, обмежена з'єднанням, закінчується разом із з'єднанням.
- Деякі статуси та відповіді на HEAD не мають тіла.
Прочитайте статус і заголовки, щоб визначити застосовне правило. Очікування лише закриття не є загальним рішенням, бо повна HTTP-відповідь може залишити з'єднання відкритим. Місткість одного буфера теж не пов'язана з довжиною відповіді.
Використовуйте реалізацію кадрування HTTP-клієнта, якщо вона підтримує обраний транспорт через проксі. У сумісному сучасному середовищі виконання .NET розгляньте вбудовану підтримку SOCKS у HttpClient. Власна реалізація має зберігати стан розбору між частковими заголовками та читаннями тіла й відрізняти успішне завершення від скасування, тайм-ауту та неочікуваного EOF. У непорожньому запиті на читання нуль прочитаних байтів означає, що потік завершився; це відрізняється від відсутності байтів у черзі прямо зараз.
Проксі може зробити паузи помітними, але він не перетворює порожню чергу прийому на маркер кінця повідомлення.