하나의 엔드포인트가 클라이언트 요청을 처리해야 한다면 proxy= 를 사용하세요. 목적지 스킴별로 다른 경로가 필요하면 mounts= 를 사용합니다. 이 예제는 해당 HTTPX 인터페이스를 사용합니다. 이전 proxies= API를 쓰는 프로젝트는 그 버전에 맞게 설정해야 합니다.

엔드포인트 하나 사용하기

import httpx

timeout = httpx.Timeout(15.0, connect=5.0)

with httpx.Client(
    proxy="http://127.0.0.1:8080",
    trust_env=False,
    timeout=timeout,
) as client:
    response = client.get("https://example.com/")
    response.raise_for_status()
    print(response.status_code)

로컬 리스너를 실행 중인 HTTP 프록시로 바꾸세요. HTTP 프록시 목록의 후보도 자신의 목적지에 맞춰 테스트해야 합니다. HTTPS 목적지는 CONNECT를 통해 이 http:// 엔드포인트를 사용할 수 있습니다. 엔드포인트 스킴을 https:// 로 바꾸면 프록시 자체와 TLS를 맺겠다는 요청이 되며, 리스너와 클라이언트가 모두 지원해야 합니다.

목적지 스킴별로 경로 나누기

import httpx

mounts = {
    "http://": httpx.HTTPTransport(
        proxy="http://127.0.0.1:8080",
        trust_env=False,
    ),
    "https://": httpx.HTTPTransport(
        proxy="http://127.0.0.1:8081",
        trust_env=False,
    ),
}

with httpx.Client(
    mounts=mounts,
    trust_env=False,
    timeout=httpx.Timeout(15.0, connect=5.0),
) as client:
    response = client.get("https://example.com/")
    response.raise_for_status()
    print(response.status_code)

마운트 키는 목적지 URL과 일치시킵니다. 여기서는 HTTP 목적지가 포트 8080을, HTTPS 목적지가 포트 8081을 선택합니다. 프록시 값은 리스너 자체의 프로토콜을 나타내므로 HTTPS 마운트에 http:// 프록시가 들어가도 올바릅니다. 자신의 엔드포인트로 바꾸고 두 목적지 스킴을 모두 확인하세요.

두 예제 모두 클라이언트에 trust_env=False 를 설정하며, 전송 객체를 제공하는 곳에는 그 객체에도 설정합니다. 그렇지 않으면 HTTPX는 기본적으로 프록시와 인증서 환경 변수를 읽습니다. 배포가 이 변수에 의존한다면 자동 탐색을 켜 두거나 필요한 경로와 신뢰 설정을 명시하세요. 사설 신뢰에는 해당 HTTPX 버전이 지원하는 TLS 컨텍스트와 CA 설정을 쓰고, 목적지 검증은 켜 두세요. HTTPS 프록시 신뢰는 목적지 신뢰와 별개일 수 있습니다.

httpx.Timeout(15.0, connect=5.0) 는 연결 타임아웃을 덮어쓰고 다른 설정된 타임아웃 항목에는 기본값을 제공합니다. 읽기, 쓰기, 풀 대기는 각각 별도 제한이 있습니다. 십오 초는 작업 전체의 경과 시간 한도가 아닙니다. 풀 타임아웃은 다른 작업이 사용 가능한 연결을 점유했다는 뜻일 수도 있습니다. 프록시에 도달할 수 없다는 증거로 보기 전에 클라이언트와 스트리밍 응답을 올바르게 닫으세요.

관련 글