2015-05-15 2 views
1

Я использую библиотеку запросов python для некоторой проверки HTTP в приложении. У меня есть ситуация, когда мне нужно отправить начальный заголовок узла в запросах, но это не должно использоваться при переадресации, где это вызывает проблему.запросы python - удалить заголовки при перенаправлении

Я осмотрел документы запроса, но я не вижу способа, которым у меня могут быть запросы, чтобы удалить заголовки запросов при переадресации.

Вот пример моей проблемы

import requests 
from requests.structures import CaseInsensitiveDict 

s = requests.Session() 
request_headers = CaseInsensitiveDict() 
request_headers['host'] = 'google.co.uk' 

response = s.get("http://google.co.uk",allow_redirects=True,headers=request_headers) 

В этом случае google.co.uk будет перенаправлять https://www.google.co.uk, но застревают в цикле, потому что он будет посылать заголовок узла установлен в «google.co .uk 'даже после того, как он следует перенаправлению.

Мне всегда нужно использовать заголовок основного хоста по первому запросу из-за этого через CDN, который использует заголовок для определения сайта, на котором он служит. Удаление его из первоначального запроса не является вариантом.

Вот эквивалентный скручивание, которое отбрасывает заголовок узла после первоначального запроса. Это поведение, которое я бы хотел увидеть/ожидал от запросов Python

curl -H "Host: google.co.uk" http://google.co.uk -L -o /dev/null 
+2

Заголовок 'Host' должен быть автоматически установлен библиотекой. Если это не так, это ошибка в библиотеке. Вам не нужно устанавливать его явно. – ZhongYu

+0

Он будет установлен библиотекой, но мне нужно установить это явно для первого запроса. Я бы хотел удалить этот заголовок для любых последующих перенаправлений. – joeButler

ответ

1

curl не отбрасывает заголовок Host. Он отправляет второй запрос с заголовком Host: www.google.co.uk (созданным по URL-адресу, к которому ведет перенаправление).

Как писал ZhongYu, вам не нужно указывать заголовок узла. Так что, если ваша цель была только для загрузки страницы, то решение было бы просто опустить headers аргумент:

response = s.get("http://google.co.uk",allow_redirects=True) 

Но если ваша цель некоторые HTTP проверяя, может быть, это будет решение:

import requests 

resp = requests.get("http://google.co.uk",allow_redirects=False) 
while resp.status_code == 301: 
    resp = requests.get(resp.headers['location'],allow_redirects=False) 
+0

Этот подход действительно выглядит так, как будто он будет работать – joeButler