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 ハンドルを再利用して、永続的な接続とダイジェスト アクセス認証要求カウンターを最大限に活用する必要があります。

[...] クライアントは、サーバーの nonce 値を再利用して (サーバーは "401" 応答ごとに新しい nonce を発行するだけです)、別の要求を行うことができますが、新しいクライアントの nonce (cnonce) を提供します。後続の要求では、16 進数の要求カウンター (nc) は、最後に使用した値よりも大きくなければなりません

実際には、curl ハンドルをクリーンアップしないでください。代わりにそれを維持し、別のリクエストを実行する必要があるとすぐに:

  • curl_easy_reset関数でリセットします。curl_easy_reset(curl);
  • 次に、オプションを再設定します。

このオプションを使用するCURLOPT_VERBOSEと、後続のリクエストに対して、増加するリクエスト カウンター ( 、 など) を持つヘッダーが表示されますAuthorizationnc=00000002nc=00000003

于 2012-12-07T09:44:08.113 に答える