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.

Artigos relacionados