NetworkStream.DataAvailable == false означає, що немає байтів, готових до негайного читання. Це не означає, що HTTP-відповідь завершена. Цикл, який тут зупиняється, може обрізати цілком нормальне завантаження через SOCKS під час паузи між пакетами.

Після того як SOCKS встановлює TCP-з'єднання, правило завершення все ще задає кадрування HTTP:

  • Тіло з Content-Length закінчується після оголошених байтів вмісту.
  • Відповідь chunked потребує завершального чанка та застосовних trailer-ів.
  • Відповідь, обмежена з'єднанням, закінчується разом із з'єднанням.
  • Деякі статуси та відповіді на HEAD не мають тіла.

Прочитайте статус і заголовки, щоб визначити застосовне правило. Очікування лише закриття не є загальним рішенням, бо повна HTTP-відповідь може залишити з'єднання відкритим. Місткість одного буфера теж не пов'язана з довжиною відповіді.

Використовуйте реалізацію кадрування HTTP-клієнта, якщо вона підтримує обраний транспорт через проксі. У сумісному сучасному середовищі виконання .NET розгляньте вбудовану підтримку SOCKS у HttpClient. Власна реалізація має зберігати стан розбору між частковими заголовками та читаннями тіла й відрізняти успішне завершення від скасування, тайм-ауту та неочікуваного EOF. У непорожньому запиті на читання нуль прочитаних байтів означає, що потік завершився; це відрізняється від відсутності байтів у черзі прямо зараз.

Проксі може зробити паузи помітними, але він не перетворює порожню чергу прийому на маркер кінця повідомлення.

Схожі статті