Seguir unha redirección relativa a través do proxy
Resolva unha Location relativa contra o URL de destino actual, mantendo o enderezo do proxy fóra da resolución de URL.
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.