2

libcurl を使用して HTTP ポスト リクエストを送信し、その後レスポンスを処理しています。応答が受信されると、ライブラリは をCURLOPT_WRITEFUNCTION介し​​てプロパティに指定された関数を使用して私のプログラムにコールバックしますcurl_easy_setopt

// callback function
std::size_t on_data(const char* buffer, const std::size_t size, const std::size_t nmemb, void* context);

ドキュメントからは不明です (コールバックから 0 を返すことにより) バッファにデータを残すことができます。または、データをローカル バッファにコピーしてから、メッセージ全体を受信するまで、後続の各コールバックでこれに追加し続ける必要があります。 .

私の質問は次のとおりです。

  1. メッセージ全体の長さを取得する最良の方法は何ですか? 経由でContent-LengthヘッダーからCURLOPT_WRITEHEADERですか?
  2. 最終メッセージが受信されるのを待ってから、これを完全に処理する代わりに、部分的な応答をコピーしないようにする方法はありますか?
4

1 に答える 1

1

オプションに関する限りCURLOPT_WRITEFUNCTION、ドキュメントでは、この関数が次のことを行う必要があると明示的に述べています。

[r]実際に処理されたバイト数を返します。その量が関数に渡された量と異なる場合、ライブラリにエラーが通知されます。これにより、転送が中止され、CURLE_WRITE_ERROR が返されます。

したがって、転送を明示的に中止したい場合を除き、常に実際のサイズ、つまりsize * nmemb. また、ローカル バッファーを使用することを選択した場合は、docs/examples/getinmemory.cサンプル コードで示されているように、受信データをローカル バッファーにコピーする (および再割り当てを行う) 必要があります。

インメモリ バッファを使用したくない場合は、またはの例CURLOPT_WRITEDATAで示すように、オプションを介してファイルを使用することもできます。docs/examples/url2file.cdocs/examples/fopen.c

さもないと:

  1. 取得しようとしているリソースのサイズをアプリオリに確認するには、 ( set to 1 およびset to 1 も) 経由でHTTP ヘッダーを書き込むように要求するHEAD要求を実行する必要があります。最後に値を解析します。ただし、これはべき等ではないため、リクエストを処理する方法ではありませんCURLOPT_NOBODYCURLOPT_HEADERCURLOPT_WRITEHEADERCURLOPT_WRITEFUNCTIONContent-LengthPOST

  2. ここでも、増大するメモリ内バッファの操作に慣れていない場合 (たとえば、非常に大きな応答が予想されるため)、ファイルを操作する機能を使用しCURLOPT_WRITEDATAて、応答が徐々にディスクに書き込まれるようにする必要があります。完了したら、メッセージ全体を含むファイルを好きなように使用します。

于 2012-10-16T08:18:39.320 に答える