libcurl associa la configurazione del proxy all'easy handle che esegue il trasferimento. Impostate l'indirizzo dell'intermediario su quel handle, lasciando CURLOPT_URL come URL di destinazione.

Il frammento seguente presuppone che libcurl sia inizializzato e che handle sia un easy handle valido:

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

Mantenete vivo il buffer degli errori finché l'handle vi fa riferimento. Prima di uscire dal suo ambito, ripulite l'handle oppure sostituite o cancellate il suo puntatore CURLOPT_ERRORBUFFER. Il nome host del proxy è un segnaposto; un candidato non autenticato dalla lista di proxy HTTP può fornire l'indirizzo per questo test su un sito pubblico. Usate il suo schema e la sua porta reali e verificate se consente il tunnel HTTPS.

Una destinazione HTTPS può usare un proxy HTTP. libcurl gestisce il tunnel per quel trasferimento HTTPS. Il http:// nell'opzione proxy descrive la connessione all'intermediario. Cambiatelo in https:// solo per un endpoint proxy che accetta davvero TLS e per una build di libcurl che lo supporta.

Rendete deliberato il percorso effettivo

Un'opzione proxy esplicita sostituisce la corrispondente impostazione dell'ambiente proxy. L'esclusione è una decisione separata: un no_proxy ereditato può comunque escludere la destinazione. Se questo handle deve usare il proxy scelto per ogni destinazione che riceve, configurate CURLOPT_NOPROXY come stringa vuota nell'ambito di quella politica.

Al contrario, impostare CURLOPT_PROXY su una stringa vuota disabilita esplicitamente l'uso del proxy. Impostarlo su NULL rimuove l'assegnazione esplicita e consente di nuovo il comportamento basato sull'ambiente. Questi due valori servono scopi diversi.

Un'intestazione specifica della destinazione come Content-Type: text/xml non seleziona il proxy. Aggiungetela solo quando il corpo effettivo della richiesta e l'API di destinazione richiedono quel tipo di media.

Leggete anche il risultato HTTP

Un curl_easy_perform riuscito non significa che il sito abbia restituito uno stato HTTP riuscito. Leggete CURLINFO_RESPONSE_CODE e applicate la gestione degli stati dell'applicazione. La risposta CONNECT del proxy ha un valore proprio, CURLINFO_HTTP_CONNECTCODE; un rifiuto del tunnel precede qualsiasi risposta del sito.

CURLOPT_FAILONERROR può trattare molti errori HTTP come errori, ma la sua documentazione segnala eccezioni di autenticazione. Tenete la sfida 407 del proxy separata dallo stato della destinazione.

Articoli correlati