REST API を使用してファイルとして保存するために、非常に大きな文字列 (最大 16GB 相当) をクラウド サーバー (AWS に類似) に送信しようとしています。文字列を小さなチャンクでサーバーにストリーミングしたいと思います。文字列のチャンクはオンザフライで生成されます。私が知る限り、転送エンコーディングを「チャンク」に設定すると、まさにそれを行うのに役立ちます。libcurl ライブラリを使用して、これを行う C++ プログラムの作成を開始しました。単純化されたテスト文字列を含む関連するスニペットを次に示します。
headers = curl_slist_append(headers, "Accept: text/plain");
headers = curl_slist_append(headers, "Content-Type: binary/octet-stream");
headers = curl_slist_append(headers, "Transfer-Encoding: chunked");
curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.1:8080/namespace/test/test");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "5/r/nHELLO/r/n");
curl_res = curl_easy_perform(curl);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "3/r/nBYE/r/n");
curl_res = curl_easy_perform(curl);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "0/r/n");
curl_res = curl_easy_perform(curl);
チャンク転送について私が理解していることから、各チャンクは 16 進数で表された文字列のサイズで始まり、その後に実際の文字列が続く必要があります。サイズがゼロになると、サーバーは転送が完了したことを認識します ( http://en.wikipedia.org/wiki/Chunked_transfer_encoding )。しかし、上記を実行した後にファイルの内容を見ると、「HELLOBYE」ではなく「0」しか表示されません。そのため、チャンク転送ごとにファイルを上書きするだけでなく、文字列のサイズを文字列の一部として解釈しています。
したがって、私の質問は次のようになります。
- チャンク転送の最初の部分を文字列のサイズとして解釈するにはどうすればよいですか?
- 順次チャンク転送を「連結」するにはどうすればよいですか?