2009-06-25 4 views
1

私はシングルスレッドのアプリを持っている問題が

[libcurlのメーリングリストからのクロスポスト](MSVC C++ 2005)静的 のlibcurl 7.19.4

テストアプリケーションに対してビルド社内サーバーに接続&は、2つのフォームの投稿を含む認証済みの 認証プロセスを実行し、成功すると が新しいリソース(POST)を作成し、If-Matchを使用して リソース(PUT)を更新します。私はクッキーエンジンが curl_easy_setoptを使用して開始(CURLOPT_COOKIEFILE、「」)から有効になっている

(すなわち一つだけCURL *)をlibcurlのために、単一の接続を使用

クッキーのキャッシュがでクリアされますcurl_easy_setopt(CURLOPT_COOKIELIST、 "SESS")を使用して、認証プロセスの終了を示します。 これは、認証プロセスによって が必要です。成功した認証を完了し

次の呼び出しは、 の結果は、セキュリティクッキーのカップルは、サーバから返される - 彼らは有効期限が設定されていません 。

サーバ(と私)は、セキュリティクッキーがサーバに続くすべての要求を で送信することを期待しています。問題は、時々 と送信され、時にはではありません。

私はCURLのエキスパートではないので、私はおそらく何か間違っていますが、私は は何を理解できません。ループの結果でテストアプリを実行すると、正確なCookie処理のランダムな分布が表示されます( )。

回避策として、私はクッキーエンジンを無効にして、基本的な 手動クッキー処理を行っています。このように、期待どおりに動作しますが、可能であれば、ライブラリを使用するのは です。

誰にもアイデアはありますか?ヘッダは、特定のサイズであるとき

おかげ セブ

答えて

1

私たちは、「セッション」を失うことのlibcurlの問題を経験しました。私たちが見てきた

二つの既知の場合は1425と2885.

ヘッダは、サーバが適切なクッキーを受け取るためには表示されません。この特定のサイズです送信されます。私たちは実際に制御されたサーバーに対して実際にサーバーが受け取ったものを調べることはしていません。

最後に、ヘッダーサイズを変更するためのスペースを追加することで、User-Agentを少し変更しました。ここで

は、要求が面白い

size_t PredictHeaderOutSize(CURL *curl, bool doPost, const char* request, char* userAgent, const char* host, const char* form) 
{ 
    size_t predictedHeaderOutSize = 0; 

    // Note, so far predicting 1 byte per newline, fix the hard coded #'s below if that turns out to be wrong 

    // POST/GET line 
    predictedHeaderOutSize += (doPost ? 4 : 3); // POST vs GET 
    predictedHeaderOutSize += strlen(request); 
    predictedHeaderOutSize += 11; // Extra characters in 'POST <request> HTTP/1.1' not accounted for above 

    // User-Agent line 
    predictedHeaderOutSize += strlen(userAgent); 
    predictedHeaderOutSize += 13; 

    // Host: header 
    predictedHeaderOutSize += strlen(host); 
    predictedHeaderOutSize += 7; 

    // Accept: */* 
    predictedHeaderOutSize += 12; 

    // Cookie: 
    struct curl_slist *cookies=NULL; 
    struct curl_slist *next_cookie; 
    int num_cookies = 0; 
    CURLcode res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies); 
    if (res == CURLE_OK) 
    { 
     if (cookies != NULL) 
     { 
      // At least 1 cookie so add the extra space taken on cookie line 
      predictedHeaderOutSize += 7; 
      next_cookie = cookies; 
      num_cookies = 1; 
      while (next_cookie) 
      { 
       std::vector<std::string> cookie = QueueHelper::Split("\t", next_cookie->data, 7); 
       if (cookie.size() != 7) 
       { 
        // wtf? 
       } 
       else 
       { 
        // For each cookie we add length of key + value + 3 (for the = ; and extra space) 
        predictedHeaderOutSize += cookie[5].length() + cookie[6].length() + 3; 
       } 
       next_cookie = next_cookie->next; 
       num_cookies++; 
      } 
      curl_slist_free_all(cookies); 
     } 
    } 
    else 
    { 
     printf("curl_easy_getinfo failed: %s\n", curl_easy_strerror(res)); 
    } 

    if (doPost) 
    { 
     // Content-Length: 
     size_t formLength = strlen(form); 
     if (formLength < 10) 
      predictedHeaderOutSize += 1; 
     if (formLength >= 10 && formLength < 100) 
      predictedHeaderOutSize += 2; 
     if (formLength >= 100 && formLength < 1000) 
      predictedHeaderOutSize += 3; 
     if (formLength >= 1000 && formLength < 10000) 
      predictedHeaderOutSize += 4; 
     predictedHeaderOutSize += 17; 

     // Content-Type: application/x-www-form-urlencoded 
     predictedHeaderOutSize += 48; 
    } 

    predictedHeaderOutSize += 2; // 2 newlines at the end? something else? not sure 

    return predictedHeaderOutSize; 
} 
+0

、感謝を送信する前に、ヘッダサイズを予測するためのいくつかのコードです。 あなたはどのバージョンのlibcurlを使用していましたか?開発者に不具合を起こしたことはありますか? –

+0

7.19.5を含むカップルバージョン。私はまだ7.20をテストしていません。いいえ、それについてメーリングリストに投稿することは決してありません。 私の主な提案は、エラーが発生したときにヘッダーサイズを記録することです。おそらく、エラーは非常に特定のヘッダーサイズにしかないことがすぐにわかります。 – thelsdj