Как стряхнуть с HTTP..CLIENT.BAD STATUS LINE?

Я хочу установить заголовки в urllib.request, чтобы каким-то образом избавиться от http.client.BadStatusLine

headers = ['Content-length']=str(len(bytes(body, 'utf-8')))
req = urllib.request.Request(url, bytes(body, 'utf-8'), headers)

Источник: Исключение BadStatusLine возникает при возврате ответа с сервера. в Python 3

К чему относится body в hearders?


person user6575792    schedule 17.07.2016    source источник
comment
Возможный дубликат Установить заголовок в urllib.request python 3   -  person user94559    schedule 17.07.2016


Ответы (1)


Правильный синтаксис: headers['Content-length']=str(len(bytes(body, 'utf-8')))

Полагаю, опечатка. Заголовок Content length обозначает размер ответа html или иным образом определяется сервером. Например, если серверу запрашивается html-страница, он возвращает размер html-контента.

Например, когда вы запрашиваете страницу: http://www.york.ac.uk/teaching/cws/wws/webpage1.html
(Это простая страница для демонстрации, она не требует дополнительных ресурсов). Заголовки ответа сервера показаны ниже. Вы можете увидеть это для любой страницы в консоли разработчика в chrome или firefox, на вкладке «сеть» и «все» заголовки.

Accept-Ranges:bytes
Cache-Control:max-age=300
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1957
Content-Type:text/html
Date:Sun, 17 Jul 2016 06:48:41 GMT
Expires:Sun, 17 Jul 2016 06:53:41 GMT
Keep-Alive:timeout=4, max=100
Server:Apache/2.2.22 (Ubuntu)
Vary:Accept-Encoding

Заголовок content-Length показывает длину 1957 байт. Если вы перейдете на страницу и проверите источник, нажав Ctrl-U. Вы заметите, что размер текста намного больше. Но полученный текст сжимается. Итак, перейдите на http://www.txtwizard.net/compression и поместите исходный текст. Вы заметите, что сжатый размер составляет 1957 байт (Кодировка также упоминается как Content-Encoding:Gzip в заголовках, а сайт настроен на сжатие gz.

Итак, что касается кода, body — это ответ сервера в формате html или иным образом (например, для файла, изображения или чего-либо, что обозначено заголовком content-type).

Другой пример: https://github.com/python/cpython/blob/master/Lib/http/server.py#L752
это код python3 для SimpleHTTPResponseHandler, который можно использовать для написания пользовательских обработчиков для встроенного сервера python.

Переменная encoded — это строка, содержащая HTML-ответ, закодированный в виде двоичного файла, который необходимо передать функции do_GET. Убедитесь, что заголовок Content-Length имеет размер закодированной строки.

person pikaynu    schedule 17.07.2016