如何在每个http包中发送libcurl发送摘要认证头?

时间:2012-12-07 08:28:52

标签: c libcurl

我每次要发送http消息时都会使用以下函数http_send_message()

http_send_message(char *msg_out, char **msg_in)
{
    CURLcode res;
    CURL *curl;

    curl = curl_easy_init();
    if (!curl) return -1;

    curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.1.133:8080/tawtaw");
    curl_easy_setopt(curl, CURLOPT_USERNAME, "tawtaw");
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "tawtaw");
    curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST);
        .
        .
        .
   curl_easy_cleanup(curl); 
}

但我注意到每次该函数发送http消息时,它会尝试发送没有摘要认证头的请求,然后使用摘要认证头发送它。在正常情况下,它应该仅在第一条消息中执行此行为。对于后续消息,它应记住认证标头并在每条消息中发送

1 个答案:

答案 0 :(得分:3)

要获得此类行为,您需要重新使用卷曲句柄以便后续调用充分利用持久连接和Digest Access Authentication请求计数器:

  

[...]客户端可以发出另一个请求,重用服务器nonce值(服务器只为每个“401”响应发出一个新的nonce),但提供一个新的客户端nonce(cnonce)。对于后续请求,十六进制请求计数器(nc)必须大于它使用的最后一个值

在练习中不要清理你的卷发手柄。而是在需要执行另一个请求时立即维护它:

  • 使用curl_easy_reset函数重置它:curl_easy_reset(curl);
  • 然后重新设置您的选项。

如果您使用CURLOPT_VERBOSE选项,您会看到对于后续请求,您将拥有一个Authorization标头,其中包含不断增加的请求计数器nc=00000002nc=00000003等)。