Seguire un reindirizzamento relativo attraverso il proxy
Risolvete una Location relativa rispetto all'URL di destinazione corrente, tenendo l'indirizzo del proxy fuori dalla risoluzione dell'URL.
Una risposta ricevuta tramite un proxy può restituire una Location relativa:
Location: ../new/
L'HTTP moderno consente qui un riferimento URI. Risolvetelo rispetto all'URL che ha prodotto la risposta. Se quell'URL era https://docs.example/catalog/old/, il riferimento sopra identifica https://docs.example/catalog/new/. Il nome host del proxy non è la base.
Per le normali richieste Python urllib, usate il suo gestore dei reindirizzamenti invece di concatenare stringhe attorno all'endpoint del 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()
Per questa richiesta di documento pubblico senza autenticazione proxy, un candidato HTTP dalla lista di proxy HTTP può sostituire l'endpoint di esempio quando il percorso è consentito. Le classi provengono da urllib.request. Il suo gestore normale segue i reindirizzamenti supportati entro i suoi limiti. final_url descrive l'URL finale della risorsa, non l'intermediario usato per raggiungerla.
Prima risolvete, poi scegliete il percorso successivo
Un reindirizzamento può cambiare l'host o lo schema di destinazione. Una politica del proxy basata sulla destinazione deve quindi valutare anche il nuovo URL. Un percorso che funzionava per il primo host potrebbe non essere il percorso per il successivo.
Quando implementate voi stessi la gestione dei reindirizzamenti, usate la risoluzione dei riferimenti URI con la gestione dei segmenti di punto. Conservate le regole del metodo del codice di stato effettivo e imponete un limite ai reindirizzamenti. Aggiungere Location a un nome host non sostituisce quell'algoritmo di risoluzione.
Se un reindirizzamento fallisce, conservate l'URL richiesto, lo stato della risposta, il valore Location e l'URL successivo risolto. Questi quattro valori di solito mostrano se l'errore riguarda la costruzione dell'URL o la connessione tentata dopo.