O libcurl associa a configuração do proxy ao easy handle que realiza a transferência. Defina o endereço do intermediário nesse handle, deixando CURLOPT_URL como o URL de destino.

O fragmento seguinte pressupõe que o libcurl foi inicializado e que handle é um 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));

Mantenha o buffer de erros vivo enquanto o handle fizer referência a ele. Antes de sair do seu âmbito, limpe o handle ou substitua ou apague o seu ponteiro CURLOPT_ERRORBUFFER. O nome do host do proxy é um marcador de posição; um candidato não autenticado da lista de proxies HTTP pode fornecer o endereço para este teste num site público. Use o esquema e a porta reais, e verifique se permite o túnel HTTPS.

Um destino HTTPS pode usar um proxy HTTP. O libcurl gere o túnel para essa transferência HTTPS. O http:// na opção de proxy descreve a ligação ao intermediário. Altere-o para https:// apenas para um endpoint de proxy que aceite realmente TLS e uma compilação do libcurl que o suporte.

Torne a rota efetiva deliberada

Uma opção de proxy explícita substitui a definição de ambiente de proxy correspondente. A omissão é uma decisão separada: um no_proxy herdado ainda pode excluir o destino. Se este handle tiver de usar o proxy escolhido para cada destino que recebe, configure CURLOPT_NOPROXY como uma string vazia no âmbito dessa política.

Por outro lado, definir CURLOPT_PROXY como uma string vazia desativa explicitamente a utilização do proxy. Defini-lo como NULL remove a atribuição explícita e volta a permitir o comportamento baseado no ambiente. Esses dois valores servem propósitos diferentes.

Um cabeçalho específico do destino como Content-Type: text/xml não seleciona o proxy. Adicione-o apenas quando o corpo real do pedido e a API de destino precisarem desse tipo de média.

Leia também o resultado HTTP

Um curl_easy_perform bem-sucedido não significa que o site tenha devolvido um estado HTTP bem-sucedido. Leia CURLINFO_RESPONSE_CODE e aplique o tratamento de estados da aplicação. A resposta CONNECT do proxy tem o seu próprio valor, CURLINFO_HTTP_CONNECTCODE; uma rejeição do túnel precede qualquer resposta do site.

CURLOPT_FAILONERROR pode tratar muitos erros HTTP como falhas, mas a sua documentação assinala exceções de autenticação. Mantenha o desafio 407 do proxy separado do estado do destino.

Artigos relacionados