Evitate modifiche globali all'opener di urllib nei controllori proxy
Mantenete le sonde proxy urllib locali al loro opener invece di sostituire il routing e i timeout predefiniti dell'intero processo.
from urllib.request import ProxyHandler, build_opener
def make_proxy_opener(proxy_uri):
return build_opener(ProxyHandler({
"http": proxy_uri,
"https": proxy_uri,
}))
opener = make_proxy_opener("http://proxy.example.net:8080")
# Use opener.open(destination, timeout=10) for this route.Chiamate il metodo open proprio di questo opener quando una rotta appartiene alla sonda. L'endpoint HTTP dell'esempio può provenire dal vostro servizio o dalla lista di proxy HTTP per le sonde pubbliche. Il frammento illustra la proprietà; non definisce la politica completa di autenticazione o salute. Tenete qualsiasi gestore specifico dell'account collegato al client previsto.
urllib.request.install_opener() cambia il valore predefinito a livello di processo usato dalle chiamate urlopen() successive a livello di modulo. Un controllore che scorre i proxy può quindi lasciare che richieste non correlate usino il suo ultimo endpoint. Un'installazione temporanea e il ripristino durante la pulizia consentono comunque alle richieste concorrenti di essere eseguite durante la mutazione condivisa.
socket.setdefaulttimeout() modifica allo stesso modo i valori predefiniti per i socket creati successivamente. Usate il timeout a livello di operazione quando solo la sonda deve riceverlo.
Chiudete le risposte della sonda e mantenete i risultati specifici: una risposta di errore HTTP non è automaticamente un listener proxy morto. Se una sonda urllib sincrona viene usata in un servizio asincrono, spostate il lavoro bloccante su un worker adeguato; quella decisione di esecuzione non rende isolata la mutazione globale dell'opener.
Una sonda dovrebbe restituire la propria osservazione senza lasciare un'altra politica di rete dietro. Il suo oggetto client e l'operazione limitata rendono esplicito quel confine.