Evite alterações globais do opener de urllib nos verificadores de proxy
Mantenha as sondas de proxy com urllib locais ao seu próprio opener em vez de substituir o encaminhamento e os tempos limite predefinidos de todo o 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.Chame o método open próprio deste opener quando uma rota pertence à sonda. O ponto de extremidade HTTP do exemplo pode vir do seu serviço ou da lista de proxy HTTP para sondas públicas. O trecho ilustra a propriedade; não define a política completa de autenticação ou de saúde. Mantenha qualquer manipulador específico da conta ligado a esse cliente pretendido.
urllib.request.install_opener() altera a predefinição de todo o processo usada pelas chamadas urlopen() posteriores ao nível do módulo. Um verificador que percorre proxies pode, portanto, deixar pedidos não relacionados a usar o seu último ponto de extremidade. Instalar temporariamente e restaurar na limpeza ainda permite que pedidos simultâneos corram durante a mutação partilhada.
socket.setdefaulttimeout() também altera as predefinições dos sockets criados depois. Use o tempo limite ao nível da operação quando apenas a sonda o deve receber.
Feche as respostas da sonda e mantenha os resultados específicos: uma resposta de erro HTTP não é automaticamente um ouvinte de proxy morto. Se uma sonda urllib síncrona for usada num serviço assíncrono, mova o trabalho bloqueante para um worker adequado; essa decisão de execução não torna a mutação global do opener isolada.
Uma sonda deve devolver a sua observação sem deixar outra política de rede para trás. O seu próprio objeto de cliente e a operação limitada tornam essa fronteira explícita.