Un răspuns primit printr-un proxy poate returna un Location relativ:

Location: ../new/

HTTP modern permite aici o referință URI. Rezolvați-o față de URL-ul care a produs răspunsul. Dacă acel URL era https://docs.example/catalog/old/, referința de mai sus indică https://docs.example/catalog/new/. Numele de gazdă al proxy-ului nu este baza.

Pentru cererile Python urllib obișnuite, folosiți handlerul său de redirecționare în loc să uniți șiruri în jurul punctului final al proxy-ului:

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()

Pentru această cerere de document public fără autentificare proxy, un candidat HTTP din lista de proxy-uri HTTP poate înlocui punctul final exemplu când ruta este permisă. Clasele provin din urllib.request. Handlerul său obișnuit urmează redirecționările acceptate în limitele sale. final_url descrie URL-ul final al resursei, nu intermediarul folosit pentru a o atinge.

Rezolvați mai întâi, apoi alegeți următoarea rută

O redirecționare poate schimba gazda sau schema destinației. De aceea, o politică de proxy bazată pe destinație trebuie să evalueze și acel URL nou. O rută care a funcționat pentru prima gazdă poate să nu fie ruta pentru următoarea.

Când implementați singuri tratarea redirecționărilor, folosiți rezolvarea referințelor URI cu tratarea segmentelor de punct. Păstrați regulile de metodă ale codului de stare real și impuneți o limită de redirecționări. Adăugarea Location la un nume de gazdă nu înlocuiește acel algoritm de rezolvare.

Dacă o redirecționare eșuează, păstrați URL-ul cerut, starea răspunsului, valoarea Location și URL-ul următor rezolvat. Aceste patru valori arată de obicei dacă eșecul ține de construirea URL-ului sau de conexiunea încercată după aceea.

Articole similare