Seguir um redirecionamento relativo através do proxy
Resolva um Location relativo em relação ao URL de destino atual, mantendo o endereço do proxy fora da resolução do URL.
Uma resposta recebida através de um proxy pode devolver um Location relativo:
Location: ../new/
O HTTP moderno permite aqui uma referência URI. Resolva-a em relação ao URL que produziu a resposta. Se esse URL era https://docs.example/catalog/old/, a referência acima identifica https://docs.example/catalog/new/. O nome do host do proxy não é a base.
Para pedidos Python urllib comuns, use o seu manipulador de redirecionamentos em vez de concatenar strings à volta do endpoint 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 este pedido de documento público sem autenticação de proxy, um candidato HTTP da lista de proxies HTTP pode substituir o endpoint de exemplo quando a rota é permitida. As classes vêm de urllib.request. O seu manipulador normal segue os redirecionamentos suportados dentro dos seus limites. final_url descreve o URL final do recurso, não o intermediário usado para o alcançar.
Resolva primeiro, depois escolha a rota seguinte
Um redirecionamento pode alterar o host ou o esquema de destino. Por isso, uma política de proxy baseada no destino também tem de avaliar esse novo URL. Uma rota que funcionou para o primeiro host pode não ser a rota para o seguinte.
Quando implementar o tratamento de redirecionamentos, use a resolução de referências URI com tratamento de segmentos de ponto. Mantenha as regras de método do código de estado real e imponha um limite de redirecionamentos. Acrescentar Location a um nome de host não substitui esse algoritmo de resolução.
Se um redirecionamento falhar, conserve o URL pedido, o estado da resposta, o valor Location e o URL seguinte resolvido. Esses quatro valores mostram normalmente se a falha pertence à construção do URL ou à ligação tentada depois.