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