libcurl은 프록시 구성을 전송을 수행하는 easy handle에 연결합니다. 중간 서버의 주소를 해당 handle에 설정하고 CURLOPT_URL은 대상 URL로 그대로 둡니다.

다음 조각은 libcurl이 초기화되었고 handle이 유효한 easy handle이라고 가정합니다.

char error[CURL_ERROR_SIZE] = {0};
CURLcode result;

result = curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, error);
if (result == CURLE_OK)
    result = curl_easy_setopt(handle, CURLOPT_URL,
                              "https://example.com/");
if (result == CURLE_OK)
    result = curl_easy_setopt(handle, CURLOPT_PROXY,
                              "http://proxy.example:8080");
if (result == CURLE_OK)
    result = curl_easy_perform(handle);

if (result != CURLE_OK)
    fprintf(stderr, "%s\n", error[0] ? error
                                  : curl_easy_strerror(result));

handle이 참조하는 동안 오류 버퍼를 살려 두십시오. 범위를 벗어나기 전에 handle을 정리하거나 CURLOPT_ERRORBUFFER 포인터를 교체 또는 지우십시오. 프록시 호스트 이름은 자리 표시자입니다. HTTP 프록시 목록의 인증되지 않은 후보가 이 공개 사이트 테스트용 주소를 제공할 수 있습니다. 실제 스킴과 포트를 사용하고 HTTPS 터널을 허용하는지 확인하십시오.

HTTPS 대상도 HTTP 프록시를 사용할 수 있습니다. libcurl이 해당 HTTPS 전송의 터널을 처리합니다. 프록시 옵션의 http://는 중간 서버와의 연결을 설명합니다. 실제로 TLS를 받아들이는 프록시 엔드포인트와 이를 지원하는 libcurl 빌드에만 https://로 변경하십시오.

실제 경로를 의도적으로 만드십시오

명시적 프록시 옵션은 해당 프록시 환경 설정을 재정의합니다. 우회는 별도의 결정입니다. 상속된 no_proxy은 여전히 대상을 제외할 수 있습니다. 이 handle이 주어진 모든 대상에 대해 선택한 프록시를 사용해야 한다면 해당 정책의 일부로 CURLOPT_NOPROXY을 빈 문자열로 구성하십시오.

반대로 CURLOPT_PROXY을 빈 문자열로 설정하면 프록시 사용이 명시적으로 비활성화됩니다. NULL로 설정하면 명시적 할당이 제거되고 환경 기반 동작이 다시 허용됩니다. 이 두 값은 서로 다른 목적을 수행합니다.

Content-Type: text/xml 같은 대상별 헤더는 프록시를 선택하지 않습니다. 실제 요청 본문과 대상 API가 해당 미디어 유형을 필요로 할 때만 추가하십시오.

HTTP 결과도 읽으십시오

curl_easy_perform이 성공했다고 해서 웹사이트가 성공적인 HTTP 상태를 반환한 것은 아닙니다. CURLINFO_RESPONSE_CODE를 읽고 애플리케이션의 상태 처리를 적용하십시오. 프록시의 CONNECT 응답에는 고유한 값 CURLINFO_HTTP_CONNECTCODE이 있으며, 터널 거부는 웹사이트 응답보다 먼저 발생합니다.

CURLOPT_FAILONERROR은 많은 HTTP 오류를 실패로 처리할 수 있지만 문서에서는 인증 예외를 지적합니다. 프록시의 407 문제를 대상의 상태와 분리해 두십시오.

관련 글