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.

Llame al método open propio de este opener cuando una ruta pertenezca a la comprobación. El punto de conexión HTTP del ejemplo puede venir de su servicio o de la lista de proxy HTTP para comprobaciones públicas. El fragmento ilustra la propiedad; no define la política completa de autenticación ni de salud. Mantenga cualquier controlador específico de la cuenta vinculado a ese cliente previsto.

urllib.request.install_opener() cambia el valor predeterminado de todo el proceso que usan las llamadas posteriores a urlopen() a nivel de módulo. Por tanto, un comprobador que recorre proxies puede dejar que peticiones no relacionadas usen su último punto de conexión. Instalar temporalmente y restaurar en la limpieza sigue permitiendo que las peticiones concurrentes se ejecuten durante la mutación compartida.

socket.setdefaulttimeout() también cambia los valores predeterminados de los sockets creados después. Use el tiempo de espera a nivel de operación cuando solo la comprobación deba recibirlo.

Cierre las respuestas de la comprobación y mantenga sus resultados concretos: una respuesta de error HTTP no es automáticamente un escucha de proxy muerto. Si se usa una comprobación síncrona de urllib en un servicio asíncrono, mueva el trabajo bloqueante a un trabajador adecuado; esa decisión de ejecución no hace que la mutación global del opener sea aislada.

Una comprobación debería devolver su observación sin dejar otra política de red detrás. Su propio objeto de cliente y su operación acotada hacen explícita esa frontera.

Artículos relacionados