libcurl asocia la configuración del proxy al easy handle que realiza la transferencia. Establezca la dirección del intermediario en ese handle, dejando CURLOPT_URL como la URL de destino.

El siguiente fragmento supone que libcurl se ha inicializado y que handle es un easy handle válido:

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));

Mantenga vivo el búfer de errores mientras el handle haga referencia a él. Antes de salir de su ámbito, limpie el handle o sustituya o borre su puntero CURLOPT_ERRORBUFFER. El nombre de host del proxy es un marcador de posición; un candidato no autenticado de la lista de proxies HTTP puede proporcionar la dirección para esta prueba en un sitio público. Utilice su esquema y puerto reales, y compruebe si permite el túnel HTTPS.

Un destino HTTPS puede usar un proxy HTTP. libcurl gestiona el túnel para esa transferencia HTTPS. El http:// de la opción de proxy describe la conexión con el intermediario. Cámbielo a https:// solo para un punto de conexión de proxy que realmente acepte TLS y una compilación de libcurl que lo admita.

Haga que la ruta efectiva sea deliberada

Una opción de proxy explícita anula la configuración de entorno de proxy correspondiente. La omisión es una decisión aparte: un no_proxy heredado aún puede excluir el destino. Si este handle debe usar el proxy seleccionado para cada destino que recibe, configure CURLOPT_NOPROXY como una cadena vacía dentro de esa política.

Por el contrario, establecer CURLOPT_PROXY en una cadena vacía desactiva explícitamente el uso del proxy. Establecerlo en NULL elimina la asignación explícita y vuelve a permitir el comportamiento basado en el entorno. Esos dos valores sirven a propósitos distintos.

Una cabecera específica del destino como Content-Type: text/xml no selecciona el proxy. Añádala solo cuando el cuerpo real de la solicitud y la API de destino necesiten ese tipo de medio.

Lea también el resultado HTTP

Un curl_easy_perform correcto no significa que el sitio web haya devuelto un estado HTTP correcto. Lea CURLINFO_RESPONSE_CODE y aplique el tratamiento de estados de la aplicación. La respuesta CONNECT del proxy tiene su propio valor, CURLINFO_HTTP_CONNECTCODE; un rechazo del túnel precede a cualquier respuesta del sitio web.

CURLOPT_FAILONERROR puede tratar muchos errores HTTP como fallos, pero su documentación señala excepciones de autenticación. Mantenga el desafío 407 del proxy separado del estado del destino.

Artículos relacionados