Evite cambios globais do opener de urllib nos comprobadores de proxy
Manteña as comprobacións de proxy con urllib locais ao seu propio opener en vez de substituír o enrutamento e os tempos de espera predeterminados de todo o proceso.
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 ao método open propio deste opener cando unha ruta pertenza á comprobación. O punto de conexión HTTP do exemplo pode vir do seu servizo ou da lista de proxy HTTP para comprobacións públicas. O fragmento ilustra a propiedade; non define a política completa de autenticación nin de saúde. Manteña calquera controlador específico da conta vinculado a ese cliente previsto.
urllib.request.install_opener() cambia o valor predeterminado de todo o proceso que usan as chamadas posteriores a urlopen() a nivel de módulo. Por tanto, un comprobador que percorre proxies pode deixar que peticións non relacionadas usen o seu último punto de conexión. Instalar temporalmente e restaurar na limpeza segue permitindo que as peticións simultáneas se executen durante a mutación compartida.
socket.setdefaulttimeout() tamén cambia os valores predeterminados dos sockets creados despois. Use o tempo de espera a nivel de operación cando só a comprobación deba recibilo.
Pecha as respostas da comprobación e mantén os resultados concretos: unha resposta de erro HTTP non é automaticamente un oínte de proxy morto. Se se usa unha comprobación síncrona de urllib nun servizo asíncrono, mova o traballo bloqueante a un traballador axeitado; esa decisión de execución non fai que a mutación global do opener sexa illada.
Unha comprobación debería devolver a súa observación sen deixar outra política de rede detrás. O seu propio obxecto de cliente e a súa operación limitada fan explícita esa fronteira.