Запросы Python удаляют заголовок Content-Length из POST

Я использую модуль запросов python для тестирования сайта.

Модуль запросов позволяет вам удалить определенные заголовки, передав словарь с ключами, установленными на None. Например

headers = {u'User-Agent': None}

гарантирует, что пользовательский агент не будет отправлен с запросом.

Однако кажется, что когда я публикую данные, запросы будут вычислять для меня правильную Content-Length, даже если я укажу None или неверное значение. Например.

headers = {u'Content-Length': u'999'}
headers = {u'Content-Length': None}

Я проверяю ответ на заголовки, используемые в запросе (response.request.headers), и вижу, что Content-Length был повторно добавлен с правильным значением. Пока я не вижу способа отключить это поведение

CaseInsensitiveDict({'Content-Length': '39', 'Content-Type': 'application/x-www-form-urlencoded', 'Accept-Encoding': 'gzip, deflate, compress', 'Accept': '*/*', 'User-Agent': 'python-requests/2.2.1 CPython/2.7.6 Linux/3.13.0-36-generic'})

Я ДЕЙСТВИТЕЛЬНО хотел бы остаться с модулем запросов, чтобы сделать это. Это возможно?


person joeButler    schedule 20.11.2014    source источник


Ответы (1)


Вам нужно будет подготовить запрос вручную, а затем удалите сгенерированный заголовок длины содержимого:

from requests import Request, Session

s = Session()
req = Request('POST', url, data=data)
prepped = req.prepare()
del prepped.headers['content-length']
response = s.send(prepped)

Обратите внимание, что большинство совместимых HTTP-серверов могут затем игнорировать ваше сообщение!

Если вы хотели использовать кодирование фрагментированной передачи (где вам не нужно отправлять длину содержимого ), затем используйте итератор для параметра data. См. раздел Запросы, закодированные по частям< /a> в документации. В этом случае заголовок Content-Length установлен не будет.

person Martijn Pieters    schedule 20.11.2014
comment
@selurvedu: заголовок содержимого не добавляется при использовании итератора для параметра данных или если тело не имеет длины. В этот момент используется Transfer-Encoding: chunked, на что я ссылаюсь в моем последнем абзаце. - person Martijn Pieters; 29.07.2019
comment
@ Мартейн, конечно, я об этом и говорил. Я пропустил часть об итераторе, но использование итератора подразумевает, что длину содержимого нельзя легко определить. - person selurvedu; 30.07.2019
comment
@selurvedu: да, в этом суть. Если длину контента можно легко определить, вам определенно следует использовать длину контента в своем запросе. - person Martijn Pieters; 31.07.2019