2

http_send_message() 每次我想发送 http 消息时,我都会使用以下功能:

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消息时都注意到,它尝试发送一个没有摘要认证头的请求,然后它发送带有摘要认证头的请求。在正常情况下,它应该只在第一条消息中执行此行为。对于后续消息,它应该记住身份验证标头并在每条消息中发送

4

1 回答 1

3

要获得这样的行为,您需要为后续调用重新使用 curl 句柄,以充分利用持久连接和Digest Access Authentication请求计数器:

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

在实践中不要清理你的卷曲手柄。而是维护它,并在您需要执行另一个请求时立即:

如果您使用该CURLOPT_VERBOSE选项,您将看到对于后续请求,您将有一个Authorization请求计数器增加的标头(nc=00000002nc=00000003等)。

于 2012-12-07T09:44:08.113 回答