curl-cpp
static c++17 wrapper for curl with -fno-exceptions support
curl_multi_poll.cc
#include "../curl_easy.hpp"
#include "../curl_url.hpp"
#include "../curl_multi.hpp"
#include <cassert>
#include <vector>
#include "utility.hpp"
static constexpr const auto connection_cnt = 20UL;
static constexpr const auto expected_response = "<p>Hello, world!\\n</p>\n";
int main(int argc, char* argv[])
{
curl::curl_t curl{nullptr};
assert(curl.has_http2_multiplex_support());
assert(curl.has_max_concurrent_stream_support());
assert(curl.has_multi_poll_support());
auto multi = curl.create_multi().get_return_value();
multi.set_multiplexing(30);
std::vector<std::pair<curl::Easy_t, std::string>> pool;
for (auto i = 0UL; i != connection_cnt; ++i) {
auto easy = curl.create_easy();
assert(easy);
pool.emplace_back(std::move(easy), std::string());
}
for (auto &pair: pool) {
auto easy_ref = Easy_ref_t{pair.first.get()};
easy_ref.request_get();
easy_ref.set_url("http://localhost:8787/");
easy_ref.set_readall_writeback(pair.second);
multi.add_easy(easy_ref);
}
assert_same(multi.get_number_of_handles(), connection_cnt);
do {
multi.perform([](Easy_ref_t &easy_ref, Easy_ref_t::perform_ret_t ret, curl::Multi_t &multi, void*) noexcept
{
assert_same(ret.get_return_value(), Easy_ref_t::code::ok);
assert_same(easy_ref.get_response_code(), 200L);
multi.remove_easy(easy_ref);
}, nullptr);
} while (multi.break_or_poll().get_return_value() != -1);
assert_same(multi.get_number_of_handles(), 0);
for (auto &[_, str]: pool) {
assert_same(str, expected_response);
}
return 0;
}
curl::Easy_ref_t
Definition: curl_easy.hpp:53
curl::Multi_t
Definition: curl_multi.hpp:29
curl::curl_t
Definition: curl.hpp:62
curl::Multi_t::remove_easy
void remove_easy(Easy_ref_t &easy) noexcept
Definition: curl_multi.cc:57