Una respuesta recibida a través de un proxy puede devolver una Location relativa:

Location: ../new/

El HTTP moderno permite aquí una referencia URI. Resuélvala contra la URL que produjo la respuesta. Si esa URL era https://docs.example/catalog/old/, la referencia anterior identifica https://docs.example/catalog/new/. El nombre de host del proxy no es la base.

Para las solicitudes ordinarias de Python urllib, use su manejador de redirecciones en lugar de unir cadenas alrededor del punto de conexión del proxy:

opener = build_opener(ProxyHandler({
    "https": "http://proxy.example:8080",
}))
with opener.open("https://docs.example/catalog/old/",
                 timeout=15) as response:
    final_url = response.geturl()

Para esta solicitud de documento público sin autenticación de proxy, un candidato HTTP de la lista de proxies HTTP puede sustituir el punto de conexión de ejemplo cuando se permita la ruta. Las clases provienen de urllib.request. Su manejador normal sigue las redirecciones admitidas dentro de sus límites. final_url describe la URL final del recurso, no el intermediario utilizado para llegar a él.

Resuelva primero y luego elija la siguiente ruta

Una redirección puede cambiar el host o el esquema de destino. Por lo tanto, una política de proxy basada en el destino también debe evaluar esa nueva URL. Una ruta que funcionó para el primer host puede no ser la ruta para el siguiente.

Cuando implemente usted mismo el manejo de redirecciones, utilice la resolución de referencias URI con tratamiento de segmentos de punto. Conserve las reglas de método del código de estado real e imponga un límite de redirecciones. Añadir Location a un nombre de host no sustituye a ese algoritmo de resolución.

Si una redirección falla, conserve la URL solicitada, el estado de la respuesta, el valor de Location y la URL siguiente resuelta. Esos cuatro valores suelen mostrar si el fallo pertenece a la construcción de la URL o a la conexión intentada después.

Artículos relacionados