프록시 검사기에서 전역 urllib opener 변경 피하기
urllib 프록시 검사를 프로세스 전체 라우팅과 타임아웃 기본값을 바꾸는 대신 해당 opener 자체에 한정하십시오.
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.경로가 검사에 속할 때는 이 opener 자체의 open 메서드를 호출하십시오. 예제의 HTTP 엔드포인트는 서비스나 공개 검사용 HTTP 프록시 목록에서 올 수 있습니다. 이 조각은 소유권을 보여 줄 뿐 인증이나 상태에 대한 전체 정책을 정의하지 않습니다. 계정별 핸들러는 의도한 클라이언트에 붙여 두십시오.
urllib.request.install_opener() 는 이후 모듈 수준 urlopen() 호출이 사용하는 프로세스 전체 기본값을 바꿉니다. 따라서 프록시를 순회하는 검사기는 무관한 요청이 마지막 엔드포인트를 쓰도록 남길 수 있습니다. 임시로 설치하고 정리 시 복원해도 공유 변경 중에는 동시 요청이 실행될 수 있습니다.
socket.setdefaulttimeout() 도 마찬가지로 나중에 생성되는 소켓의 기본값을 바꿉니다. 검사만 받아야 할 때는 작업 수준 타임아웃을 사용하십시오.
검사 응답을 닫고 결과를 구체적으로 유지하십시오. HTTP 오류 응답이 자동으로 죽은 프록시 리스너는 아닙니다. 비동기 서비스에서 동기 urllib 검사를 사용한다면 차단 작업을 적절한 워커로 옮기십시오. 그 실행 결정이 전역 opener 변경을 격리해 주지는 않습니다.
검사는 다른 네트워크 정책을 남기지 않고 관측 결과를 반환해야 합니다. 자체 클라이언트 객체와 제한된 작업이 그 경계를 명확히 합니다.