2#ifndef _KURLYK_HTTP_MULTI_REQUEST_HANDLER_HPP_INCLUDED
3#define _KURLYK_HTTP_MULTI_REQUEST_HANDLER_HPP_INCLUDED
21 for (
auto& context : context_list) {
22 if (!context || !context->callback)
continue;
23# if __cplusplus >= 201402L
24 auto response = std::make_unique<HttpResponse>();
26 auto response = std::unique_ptr<HttpResponse>(
new HttpResponse());
29 response->status_code = 499;
30 response->ready =
true;
31 context->callback(std::move(response));
37 for (
auto& context : context_list) {
38 if (!context)
continue;
39# if __cplusplus >= 201402L
40 auto handler = std::make_unique<HttpRequestHandler>(std::move(context));
42 auto handler = std::unique_ptr<HttpRequestHandler>(
new HttpRequestHandler(std::move(context)));
44 CURL* curl = handler->get_curl();
47 auto ctx = handler->get_request_context();
48 if (ctx && ctx->callback) {
49# if __cplusplus >= 201402L
50 auto response = std::make_unique<HttpResponse>();
52 auto response = std::unique_ptr<HttpResponse>(
new HttpResponse());
55 response->status_code = 499;
56 response->ready =
true;
57 ctx->callback(std::move(response));
67 for (
auto& context : context_list) {
75 CURL* curl = handler->get_curl();
90 auto ctx = handler->get_request_context();
91 if (ctx && ctx->callback) {
92# if __cplusplus >= 201402L
93 auto response = std::make_unique<HttpResponse>();
95 auto response = std::unique_ptr<HttpResponse>(
new HttpResponse());
98 response->status_code = 499;
99 response->ready =
true;
100 ctx->callback(std::move(response));
107 int still_running = 0;
108 CURLMcode res = curl_multi_perform(
m_multi_handle, &still_running);
109 if (res != CURLM_OK)
return false;
111 int pending_messages;
112 while (CURLMsg* message = curl_multi_info_read(
m_multi_handle, &pending_messages)) {
113 if (message->msg != CURLMSG_DONE)
continue;
116 if (still_running == 0) {
140 if (group_id == 0)
return 0;
142 std::size_t count = 0;
144 if (handler && !handler->is_done() && handler->get_group_id() == group_id) {
154 cancel_requests(to_cancel, std::unordered_map<uint64_t, std::list<std::function<
void()>>>());
161 const std::unordered_map<uint64_t, std::list<std::function<
void()>>>& requests_to_cancel,
162 const std::unordered_map<uint64_t, std::list<std::function<
void()>>>& groups_to_cancel) {
165 const uint64_t request_id = (*it)->get_request_id();
166 const uint64_t group_id = (*it)->get_group_id();
167 const bool should_cancel =
168 (request_id != 0 && requests_to_cancel.count(request_id) > 0) ||
169 (group_id != 0 && groups_to_cancel.count(group_id) > 0);
170 if (!should_cancel) {
188 CURL* curl = message->easy_handle;
191 curl_easy_getinfo(curl, CURLINFO_PRIVATE, &ptr);
193 if (!handler)
return;
199 handler->mark_done();
void cancel_request_by_id(const std::unordered_map< uint64_t, std::list< std::function< void()> > > &to_cancel)
Cancels HTTP requests based on their unique IDs.
bool has_group_id(uint64_t group_id) const
Checks whether this batch contains a request from the specified group.
std::list< std::unique_ptr< HttpRequestContext > > m_failed_requests
List of failed request contexts.
void handle_completed_request(CURLMsg *message)
Handles the completion of a single request.
bool process()
Processes the requests within the handler.
std::list< std::unique_ptr< HttpRequestContext > > extract_failed_requests()
Extracts the list of failed requests.
std::vector< std::unique_ptr< HttpRequestHandler > > m_handlers
Collection of active request handlers.
HttpBatchRequestHandler(std::vector< std::unique_ptr< HttpRequestContext > > &context_list)
Constructs a handler for managing multiple HTTP requests asynchronously.
~HttpBatchRequestHandler()
Cleans up the multi handle and removes all request handles.
CURLM * m_multi_handle
libcurl multi handle.
std::size_t group_request_count(uint64_t group_id) const
Counts active requests from the specified group.
void cancel_requests(const std::unordered_map< uint64_t, std::list< std::function< void()> > > &requests_to_cancel, const std::unordered_map< uint64_t, std::list< std::function< void()> > > &groups_to_cancel)
Cancels HTTP requests based on their request or group IDs.
Manages asynchronous HTTP requests, including handling responses, retries, and error processing.
bool handle_curl_message(CURLMsg *message)
Processes a CURL message and determines if a callback should be invoked.
Represents an HTTP response.
@ AbortedDuringDestruction
Request handler was destroyed before completion, causing the request to abort.
std::error_code make_error_code(ClientError e)
Creates a std::error_code from a ClientError value.
Primary namespace for the Kurlyk library, encompassing initialization, request management,...