2#ifndef _KURLYK_HTTP_UTILS_HPP_INCLUDED
3#define _KURLYK_HTTP_UTILS_HPP_INCLUDED
28 long period_ms = 60000;
38 long period_ms = 1000;
99 auto promise = std::make_shared<std::promise<void>>();
100 auto future = promise->get_future();
103 promise->set_value();
104 }
catch (
const std::future_error& e) {
105 if (e.code() == std::make_error_condition(std::future_errc::promise_already_satisfied)) {
110 }
catch (
const std::exception& e) {
132 auto promise = std::make_shared<std::promise<void>>();
133 auto future = promise->get_future();
136 promise->set_value();
137 }
catch (
const std::future_error& e) {
138 if (e.code() == std::make_error_condition(std::future_errc::promise_already_satisfied)) {
143 }
catch (
const std::exception& e) {
157# if __cplusplus >= 201402L
158 auto response = std::make_unique<HttpResponse>();
160 auto response = std::unique_ptr<HttpResponse>(
new HttpResponse());
162 response->ready =
true;
163 response->status_code = 0;
164 response->error_code = submit_result.
error_code;
165 response->error_message = submit_result.
error_code.message();
173 std::shared_ptr<std::promise<HttpResponsePtr>> promise,
175 if (!response || !response->ready)
return;
177 promise->set_value(std::move(response));
178 }
catch (
const std::future_error& e) {
179 if (e.code() == std::make_error_condition(std::future_errc::promise_already_satisfied)) {
184 }
catch (
const std::exception& e) {
196 std::unique_ptr<HttpRequest> request_ptr,
199 std::move(request_ptr), std::move(callback));
203 return submit_result;
211 std::unique_ptr<HttpRequest> request_ptr,
220 std::unique_ptr<HttpRequest> request_ptr) {
222 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
223 auto future = promise->get_future();
230 if (!submit_result) {
246 const std::string &method,
247 const std::string &url,
250 const std::string &content,
252# if __cplusplus >= 201402L
253 auto request_ptr = std::make_unique<HttpRequest>();
255 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
259 request_ptr->request_id = request_id;
260 request_ptr->set_url(url, query);
261 request_ptr->method = method;
262 request_ptr->headers = headers;
263 request_ptr->content = content;
264 if (
http_request(std::move(request_ptr), std::move(callback)))
return request_id;
278 const std::string &method,
279 const std::string &url,
282 const std::string &content,
285# if __cplusplus >= 201402L
286 auto request_ptr = std::make_unique<HttpRequest>();
288 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
292 request_ptr->request_id = request_id;
293 request_ptr->set_url(url, query);
294 request_ptr->method = method;
295 request_ptr->headers = headers;
296 request_ptr->content = content;
297 request_ptr->streaming = streaming;
298 if (
http_request(std::move(request_ptr), std::move(callback)))
return request_id;
310 const std::string &method,
311 const std::string &url,
314 const std::string &content) {
316# if __cplusplus >= 201402L
317 auto request_ptr = std::make_unique<HttpRequest>();
319 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
323 request_ptr->request_id = request_id;
324 request_ptr->set_url(url, query);
325 request_ptr->method = method;
326 request_ptr->headers = headers;
327 request_ptr->content = content;
329 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
330 auto future = promise->get_future();
337 if (!submit_result) {
341 return {request_id, std::move(future)};
354 const std::string &method,
355 const std::string &host,
356 const std::string &path,
359 const std::string &content,
362# if __cplusplus >= 201402L
363 auto request_ptr = std::make_unique<HttpRequest>();
365 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
369 request_ptr->request_id = request_id;
370 request_ptr->set_url(host, path, query);
371 request_ptr->method = method;
372 request_ptr->headers = headers;
373 request_ptr->content = content;
374 if (
http_request(std::move(request_ptr), std::move(callback)))
return request_id;
389 const std::string &method,
390 const std::string &host,
391 const std::string &path,
394 const std::string &content,
398# if __cplusplus >= 201402L
399 auto request_ptr = std::make_unique<HttpRequest>();
401 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
405 request_ptr->request_id = request_id;
406 request_ptr->set_url(host, path, query);
407 request_ptr->method = method;
408 request_ptr->headers = headers;
409 request_ptr->content = content;
410 request_ptr->streaming = streaming;
411 if (
http_request(std::move(request_ptr), std::move(callback)))
return request_id;
422 const std::string &url,
426 return http_request(
"GET", url, query, headers, std::string(), std::move(callback));
437 const std::string &url,
442 return http_request(
"GET", url, query, headers, std::string(), streaming, std::move(callback));
450 inline std::pair<uint64_t, std::future<HttpResponsePtr>>
http_get(
451 const std::string& url,
455# if __cplusplus >= 201402L
456 auto request_ptr = std::make_unique<HttpRequest>();
458 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
462 request_ptr->request_id = request_id;
463 request_ptr->set_url(url, query);
464 request_ptr->method =
"GET";
465 request_ptr->headers = headers;
467 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
468 auto future = promise->get_future();
475 if (!submit_result) {
479 return {request_id, std::move(future)};
490 const std::string &url,
493 const std::string& content,
495 return http_request(
"POST", url, query, headers, content, std::move(callback));
507 const std::string &url,
510 const std::string& content,
513 return http_request(
"POST", url, query, headers, content, streaming, std::move(callback));
522 inline std::pair<uint64_t, std::future<HttpResponsePtr>>
http_post(
523 const std::string& url,
526 const std::string& content) {
528# if __cplusplus >= 201402L
529 auto request_ptr = std::make_unique<HttpRequest>();
531 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
535 request_ptr->request_id = request_id;
536 request_ptr->set_url(url, query);
537 request_ptr->method =
"POST";
538 request_ptr->headers = headers;
539 request_ptr->content = content;
541 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
542 auto future = promise->get_future();
549 if (!submit_result) {
553 return {request_id, std::move(future)};
#define KURLYK_HANDLE_ERROR(e, msg)
std::size_t max_pending_requests() const
Returns the current maximum pending request count.
uint64_t generate_group_id()
Generates a new group ID.
void set_max_pending_requests(std::size_t max_pending_requests)
Sets the maximum number of pending requests accepted into the global queue.
void cancel_request_by_id(uint64_t request_id, std::function< void()> callback)
Cancels one request by request ID.
static HttpRequestManager & get_instance()
Get the singleton instance of HttpRequestManager.
HttpRateLimitHandlePtr get_rate_limit(long limit_id)
Returns a handle for a registered rate limit ID.
SubmitResult submit_request(std::unique_ptr< HttpRequest > request_ptr, HttpResponseCallback callback)
Attempts to enqueue a new HTTP request and reports the admission result.
bool remove_limit(long limit_id)
Removes an existing rate limit with the specified identifier.
void cancel_requests_by_group_id(uint64_t group_id, std::function< void()> callback)
Cancels all requests with the specified group ID.
uint64_t generate_request_id()
Generates a new unique request ID.
HttpRateLimitHandlePtr create_rate_limit(long requests_per_period, long period_ms, bool sequential=false)
Creates a rate-limit handle with specified parameters.
Represents an HTTP request configuration.
Represents an HTTP response.
void notify()
Notifies the worker to begin processing requests or tasks.
static NetworkWorker & get_instance()
Get the singleton instance of NetworkWorker.
Primary namespace for the Kurlyk library, encompassing initialization, request management,...
HttpRateLimitHandlePtr create_rate_limit(long requests_per_period, long period_ms, bool sequential=false)
Creates a RAII rate-limit handle with specified parameters.
std::size_t max_pending_requests()
Returns the current global pending queue limit.
std::function< void(HttpResponsePtr response)> HttpResponseCallback
Callback invoked with an HTTP response.
void set_max_pending_requests(std::size_t max_pending_requests)
Sets the maximum number of requests accepted into the global pending queue.
void safe_set_response(std::shared_ptr< std::promise< HttpResponsePtr > > promise, HttpResponsePtr response)
Safely sets an HTTP response on the provided promise.
std::unique_ptr< HttpResponse > HttpResponsePtr
Owning pointer to an HTTP response.
bool http_request(std::unique_ptr< HttpRequest > request_ptr, HttpResponseCallback callback)
Sends an HTTP request with callback.
HttpRateLimitHandlePtr get_rate_limit(long limit_id)
Returns a manager-owned rate-limit handle by ID.
void cancel_requests_by_group_id(uint64_t group_id, std::function< void()> callback)
Cancels all requests with the specified group ID.
utils::CaseInsensitiveMultimap Headers
Alias for HTTP headers, providing a case-insensitive unordered multimap.
uint64_t generate_request_id()
Generates a new unique request ID.
uint64_t generate_group_id()
Generates a new group ID.
uint64_t http_get(const std::string &url, const QueryParams &query, const Headers &headers, HttpResponseCallback callback)
Sends an asynchronous HTTP GET request with a callback.
bool remove_limit(long limit_id)
Releases manager-owned rate-limit handle by ID.
SubmitResult submit_http_request(std::unique_ptr< HttpRequest > request_ptr, HttpResponseCallback callback)
Attempts to submit an HTTP request and reports the admission result.
HttpRateLimitHandlePtr create_rate_limit_rps(long requests_per_second, bool sequential=false)
Creates a RAII rate-limit based on Requests Per Second (RPS).
std::shared_ptr< HttpRateLimitHandle > HttpRateLimitHandlePtr
Shared RAII handle for HTTP rate limits.
HttpRateLimitHandlePtr create_rate_limit_rpm(long requests_per_minute, bool sequential=false)
Creates a RAII rate-limit based on Requests Per Minute (RPM).
utils::CaseInsensitiveMultimap QueryParams
Alias for query parameters in HTTP requests, stored case-insensitively.
void cancel_request_by_id(uint64_t request_id, std::function< void()> callback)
Cancels a request by its unique identifier.
uint64_t http_post(const std::string &url, const QueryParams &query, const Headers &headers, const std::string &content, HttpResponseCallback callback)
Sends an asynchronous HTTP POST request with a callback.
HttpResponsePtr make_submit_error_response(const SubmitResult &submit_result)
Creates a ready HTTP response describing a synchronous submission rejection.
Represents the synchronous result of trying to enqueue or submit work.
bool accepted
Indicates whether the work item was accepted for processing.
std::error_code error_code
Describes the rejection reason when accepted is false.