用 std::streambuf 包装 libcurl 以进行上传

Wrapping libcurl with std::streambuf for uploads?

本文关键字:libcurl std streambuf 包装      更新时间:2023-10-16

我已经在libcurl周围实现了std::streambuf API的读取一半(即underflow()xsgetn()),以便普通istream可以将这样的streambuf插入其中并从HTTP或FTP服务器检索内容。效果很好。

现在我想实现 API 的写入一半(即 overflow()xsputn()),用于将文件上传到 FTP 服务器以执行以下操作:

ostream os( my_curl_streambuf );
curl_easy_setopt( my_curl_handle, CURLOPT_UPLOAD, 1L );
os << is->rdbuf(); // copy entire contents of istream "is" to ostream "os"

问题在于libcurl通过通过CURLOPT_READFUNCTION设置的读取回调函数使用"拉"API,而上面的最后一行代码是"推送"方式。

这能行得通吗? 即,使用 streambuf API 包装 libcurl 以进行读取写入?

我对 libcurl API 的了解不够,但我希望它会提取数据,直到所有数据都用完。由于 IOStreams 有一个推送接口,它不会轻易与拉动接口结合,因此您似乎最好实现一个流,该流缓冲所有输出直到完成,此时对现成的缓冲区进行 libcurl 拉取。您可能sync()什么都不做,而是提供一个自定义函数,例如,在您的流上send(),这是将控制权移交给 libcurl 直到它的业务中断的触发器。

另一种方法是使用一个线程来拉取 libcurl,使用另一个线程来写入流,并在 libcurl 拉取数据时将写入的位馈送到流中。