C++的HTTP客户端库

5
我正在尝试编写一个多线程HTTP代理来学习C++/socket/HTTP。
我正在寻找类似于Java中HttpURLConnection可用的HTTP客户端库。
我查看了一些库,例如C/C++的libcurl。这些库可以发出http请求,但它们会返回完整的内容。我需要一个可以部分读取内容到缓冲区的库,以便能够立即将其发送给请求的客户端,而无需将整个内容存储在内存中。
任何链接/建议都将不胜感激 :)
谢谢!

你尝试过这个吗: Ninja_Search - gideon
1
[libcurl] 可以发起 HTTP 请求,但它们会返回完整的内容。使用 libcurl 时,您可以设置接收数据时要使用的函数,并在每个数据块上调用该函数 -- 除非响应非常小,否则您不太可能一次性获取到整个响应。请参阅 http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTWRITEFUNCTION。 - user470379
4个回答

5

libcurl文档提供了一个示例页面,介绍如何获取增量下载回调(将数据流式传输到内存缓冲区):

http://curl.haxx.se/libcurl/c/getinmemory.html

在您的情况下,您只需将数据缓冲区转发给最初发出请求的客户端即可。


4
Beast是一个开源的C++库,支持您所需的功能。它有一个“Writer”概念,支持挂起和恢复、增量渲染正文以及协程:http://vinniefalco.github.io/beast/beast/types/Writer.html 该库在此处:http://vinniefalco.github.io/ 这是一个完整的示例程序:
#include <beast/http.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include <string>

int main()
{
    // Normal boost::asio setup
    std::string const host = "boost.org";
    boost::asio::io_service ios;
    boost::asio::ip::tcp::resolver r(ios);
    boost::asio::ip::tcp::socket sock(ios);
    boost::asio::connect(sock,
        r.resolve(boost::asio::ip::tcp::resolver::query{host, "http"}));

    // Send HTTP request using beast
    beast::http::request_v1<beast::http::empty_body> req;
    req.method = "GET";
    req.url = "/";
    req.version = 11;
    req.headers.replace("Host", host + ":" + std::to_string(sock.remote_endpoint().port()));
    req.headers.replace("User-Agent", "Beast");
    beast::http::prepare(req);
    beast::http::write(sock, req);

    // Receive and print HTTP response using beast
    beast::streambuf sb;
    beast::http::response_v1<beast::http::streambuf_body> resp;
    beast::http::read(sock, sb, resp);
    std::cout << resp;
}

2

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接