Une réponse reçue via un proxy peut renvoyer une Location relative :

Location: ../new/

Le HTTP moderne autorise ici une référence URI. Résolvez-la par rapport à l'URL qui a produit la réponse. Si cette URL était https://docs.example/catalog/old/, la référence ci-dessus désigne https://docs.example/catalog/new/. Le nom d'hôte du proxy n'est pas la base.

Pour les requêtes Python urllib ordinaires, utilisez son gestionnaire de redirection plutôt que de concaténer des chaînes autour du point de terminaison du 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()

Pour cette requête de document public sans authentification de proxy, un candidat HTTP de la liste de proxys HTTP peut remplacer le point de terminaison d'exemple lorsque la route est autorisée. Les classes proviennent d'urllib.request. Son gestionnaire normal suit les redirections prises en charge dans ses limites. final_url décrit l'URL finale de la ressource, pas l'intermédiaire utilisé pour l'atteindre.

Résolvez d'abord, puis choisissez la route suivante

Une redirection peut changer l'hôte ou le schéma de destination. Une politique de proxy fondée sur la destination doit donc évaluer aussi cette nouvelle URL. Une route qui fonctionnait pour le premier hôte peut ne pas être la route du suivant.

Lorsque vous implémentez vous-même la gestion des redirections, utilisez la résolution de référence URI avec le traitement des segments de point. Conservez les règles de méthode du code de statut réel et imposez une limite de redirection. Ajouter Location à un nom d'hôte ne remplace pas cet algorithme de résolution.

Si une redirection échoue, conservez l'URL demandée, le statut de la réponse, la valeur Location et l'URL suivante résolue. Ces quatre valeurs montrent généralement si l'échec relève de la construction de l'URL ou de la connexion tentée ensuite.

Articles similaires