urllib2 / peticiones y ruta relativa HTTP

¿Cómo puedo obligar a los módulos urllib2 / request a usar rutas relativas en lugar de una URL completa / absoluta?

Cuando envío una solicitud utilizando urllib2 / peticiones, veo en mi proxy que se resuelve en:

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

Desafortunadamente, el servidor al que lo envío, no puede entender esa solicitud y me da un extraño 302. Sé que está en RFC, simplemente no funciona y estoy tratando de corregirlo en código python. No tengo acceso a ese servidor.

Camino relativo, funciona bien.

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

Entonces, ¿cómo puedo forzar que peticiones / urllib2 no usen rutas absolutas? y usar rutas relativas simples?

Probablemente el siguiente código haría por su caso:

 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') 

Creo que hay un poco de confusión aquí. Según RFC 2616, solo se permiten rutas absolutas o URI absolutas en la línea de solicitud http. Simplemente no existe tal cosa como una solicitud relativa de http, ya que básicamente http no tiene estado.

En su pregunta sobre el proxy , ese RFC establece claramente que:

El formulario absoluteURI se REQUIERE cuando la solicitud se realiza a un proxy.

Según per se, AFAIK, su proxy no es compatible con HTTP / 1.1. ¿Es este un producto comercial o un desarrollo interno?

Por cierto, HTTP 302 es una redirección. ¿Estás seguro de que el recurso no se ha movido simplemente a otra ubicación?


De todos modos, al mirar el código fuente o las solicitudes ( peticiones / modelos.py L276 ) me temo que no parece tener una manera fácil de forzar el uso de la ruta absoluta

Mi mejor opción sería cambiar el objeto PreparedRequest antes de enviarlo como se describe en usos avanzados / solicitud preparada .