Unha resposta recibida a través dun proxy pode devolver unha Location relativa:

Location: ../new/

O HTTP moderno permite aquí unha referencia URI. Resólvaa contra o URL que produciu a resposta. Se ese URL era https://docs.example/catalog/old/, a referencia anterior identifica https://docs.example/catalog/new/. O nome de host do proxy non é a base.

Para as solicitudes ordinarias de Python urllib, use o seu manexador de redireccións en lugar de unir cadeas arredor do punto de conexión do 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 solicitude de documento público sen autenticación de proxy, un candidato HTTP da lista de proxies HTTP pode substituír o punto de conexión de exemplo cando se permite a ruta. As clases proveñen de urllib.request. O seu manexador normal segue as redireccións admitidas dentro dos seus límites. final_url describe o URL final do recurso, non o intermediario utilizado para chegar a el.

Resolva primeiro e logo escolla a seguinte ruta

Unha redirección pode cambiar o host ou o esquema de destino. Por iso unha política de proxy baseada no destino tamén debe avaliar ese novo URL. Unha ruta que funcionou para o primeiro host pode non ser a ruta para o seguinte.

Cando implemente vostede mesmo o manexo de redireccións, use a resolución de referencias URI con tratamento de segmentos de punto. Conserve as regras de método do código de estado real e impoña un límite de redireccións. Engadir Location a un nome de host non substitúe ese algoritmo de resolución.

Se unha redirección falla, conserve o URL solicitado, o estado da resposta, o valor de Location e o URL seguinte resolto. Eses catro valores adoitan mostrar se o fallo pertence á construción do URL ou á conexión intentada despois.

Artigos relacionados