Получение ответа http-запроса без длины содержимого?

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

моя в формате запрос;

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

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

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

2 ответов


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

в HTTP/1.1? С поблочного кодирования.


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

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