urllib2/requests и относительный путь HTTP

Как я могу заставить модули urllib2/requests использовать относительные пути вместо полного/абсолютного URL??

когда я отправляю запрос с помощью urllib2/requests, я вижу в своем прокси, что он разрешает его:

GET https://xxxx/path/to/something HTTP/1.1

К сожалению, сервер, на который я его отправляю, не может понять этот запрос и выдает мне странную ошибку 302. Я знаю, что это в RFC, просто не работает, и я пытаюсь исправить это в коде Python. У меня нет доступа к этому серверу.

Относительный путь, работает хорошо

GET /path/to/something HTTP/1.1
Host: xxxx

Итак, как я могу заставить запросы/urllib2 не использовать абсолютные пути? и использовать простые относительные пути?


person Simon    schedule 11.06.2013    source источник
comment
Разве requests не нужно знать домен в первую очередь, чтобы отправить его? Кажется, я не понимаю вопроса.   -  person TankorSmash    schedule 11.06.2013
comment
Пожалуйста, опубликуйте полный ответ вашего сервера/прокси.   -  person Sylvain Leroux    schedule 11.06.2013


Ответы (2)


Вероятно, для вашего случая подойдет следующий код:

from urlparse import urljoin
import requests

class RelativeSession(requests.Session):
    def __init__(self, base_url):
        super(RelativeSession, self).__init__()
        self.__base_url = base_url

    def request(self, method, url, **kwargs): 
        url = urljoin(self.__base_url, url)
        return super(RelativeSession, self).request(method, url, **kwargs)

session = RelativeSession('http://server.net')
response = session.get('/rel/url')
person Alek Kowalczyk    schedule 05.02.2015
comment
В python3 первую строку импорта необходимо изменить на: from urllib.parse import urljoin - person Kim; 06.05.2019

Я думаю, что здесь есть небольшая путаница. В соответствии с RFC 2616 только абсолютный путь или абсолютный URI разрешен в строке http-запроса. Просто не существует такой вещи, как относительный HTTP-запрос, поскольку в основном HTTP не имеет состояния.

В своем вопросе вы говорите о прокси, в RFC четко указано, что:

Форма absoluteURI НЕОБХОДИМА при отправке запроса к прокси.

Как таковой, насколько я знаю, ваш прокси-сервер не совместим с HTTP/1.1. Это коммерческий продукт или собственная разработка?

Кстати, HTTP 302 — это перенаправление. Вы уверены, что ресурс просто не переехал в другое место?


Во всяком случае, просмотрев исходный код или запросы (requests/models.py L276) Боюсь, у него нет простого способа заставить использовать абсолютный путь

Лучше всего было бы изменить объект PreparedRequest до его отправки, как описано в расширенное использование/Подготовленный запрос.

person Sylvain Leroux    schedule 11.06.2013