Получение ответа на запрос HTTP без содержания?

У меня небольшая программа отправляет HTTP-запрос и получает ответ с протоколом TCP.

Мой формат запроса;

GET / HTTP/1.0
Host: somewebsite.com
{two new line}

Я читаю ответ строки за строкой из сокета (используя NetworkStream и StreamReader в С#), пока не найду заголовок длины содержимого. Я сохраняю длину, затем продолжаю читать, пока не найду пустую строку. Затем создайте буфер с длиной и получите оставшуюся часть ответа.

Но у некоторых reponses нет заголовка длины содержимого. Поэтому мой подход не подходит. Если я не знаю, сколько байтов я должен получить, когда я должен остановиться?

Ответ 1

В HTTP/1.0? Когда поток закрывается.

В HTTP/1.1? С chunked encoding.

Ответ 2

Смотрите соответствующую часть спецификации HTTP. В вашем конкретном случае, если сервер не возвращает длину содержимого, он ДОЛЖЕН закрывать поток после завершения ответа. Нет другого надежного способа узнать (как клиента). Независимо от версии HTTP. @Julian chunked encoding действительно является умным обновлением в HTTP/1.1, но довольно специфично для потоковой передачи, и нет никакой причины, по которой "простой" веб-сервер будет реализовывать его. Это сервер, который знает длину содержимого перед началом ответа. И я предполагаю, что OP не контролирует сервер, иначе он не будет возражать против отсутствия заголовков HTTP.

Но даже если вы получите заголовок длины контента, вы не должны безоговорочно доверять ему. Разработчики сервера также являются ошибочными людьми. Возьмите его как "наиболее вероятный" ответ, начальное значение для изменяемого размера буфера. Вы все еще должны быть готовы обрабатывать меньше, а также больше (худший случай).