Я пытаюсь загрузить файл через обычное сокетное соединение, используя HTTP-запрос GET. Итак, я должен указать, сколько байтов поступающих данных я должен прочитать из сокета. Однако у меня возникают проблемы с определением объема данных (скажем, в байтах), с которого сервер ответит. Я знаю, что в ответе, отправляемом сервером, есть поле «Content-Length», но оно дает мне размер фактических данных (без заголовков http).
Есть ли способ получить точный размер заголовков HTTP, отправленных сервером, или требуется оценка?
(Я делаю это для загрузки в мобильной сети, где каждый бит данных имеет значение с точки зрения времени и денег, поэтому я не хочу делать ненужную большую оценку размера заголовка.)
1 ответ
Вы не читаете фиксированное количество байтов. Вы читаете столько байтов, сколько есть (или пока не прервете), пока не достигнете отметки END OF HEADER
(для HTTP это \n\r\n
насколько мне известно). Хотя по соображениям безопасности фактическая длина заголовка ограничена HTTP-сервером:
Не существует ограничений по размеру каждого имени или значения поля заголовка или количества заголовков в самом стандарте. Однако большинство серверов, клиентов и прокси-серверов накладывают определенные ограничения по практическим соображениям и соображениям безопасности. Например, сервер Apache 2.3 по умолчанию ограничивает каждый размер заголовка до 8190 байт, и в одном запросе может быть не более 100 заголовков.
Полагаться на буферы фиксированного размера в этом сообщении было бы большой ошибкой. Ваш буфер должен динамически расти. Вы даже не должны полагаться на правильность поля Content-Length
при получении тела сообщения.