libcurl easy handle에 명시적 프록시 설정하기
특정 프록시용으로 libcurl easy handle을 구성하고 옵션 오류, 전송 실패, HTTP 상태를 구분합니다.
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 문제를 대상의 상태와 분리해 두십시오.