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.

Artigos relacionados