Colocar um proxy explícito num easy handle do libcurl
Configure um easy handle do libcurl para um proxy específico e separe erros de opção, falhas de transferência e estado HTTP.
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.