2#ifndef _KURLYK_HTTP_UTILS_HPP_INCLUDED
3#define _KURLYK_HTTP_UTILS_HPP_INCLUDED
24 long period_ms = 60000;
32 long period_ms = 1000;
73 auto promise = std::make_shared<std::promise<void>>();
74 auto future = promise->get_future();
78 }
catch (
const std::future_error& e) {
79 if (e.code() == std::make_error_condition(std::future_errc::promise_already_satisfied)) {
84 }
catch (
const std::exception& e) {
98# if __cplusplus >= 201402L
99 auto response = std::make_unique<HttpResponse>();
101 auto response = std::unique_ptr<HttpResponse>(
new HttpResponse());
103 response->ready =
true;
104 response->status_code = 0;
105 response->error_code = submit_result.
error_code;
106 response->error_message = submit_result.
error_code.message();
114 std::shared_ptr<std::promise<HttpResponsePtr>> promise,
116 if (!response || !response->ready)
return;
118 promise->set_value(std::move(response));
119 }
catch (
const std::future_error& e) {
120 if (e.code() == std::make_error_condition(std::future_errc::promise_already_satisfied)) {
125 }
catch (
const std::exception& e) {
137 std::unique_ptr<HttpRequest> request_ptr,
140 std::move(request_ptr), std::move(callback));
144 return submit_result;
152 std::unique_ptr<HttpRequest> request_ptr,
161 std::unique_ptr<HttpRequest> request_ptr) {
163 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
164 auto future = promise->get_future();
171 if (!submit_result) {
187 const std::string &method,
188 const std::string &url,
191 const std::string &content,
193# if __cplusplus >= 201402L
194 auto request_ptr = std::make_unique<HttpRequest>();
196 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
200 request_ptr->request_id = request_id;
201 request_ptr->set_url(url, query);
202 request_ptr->method = method;
203 request_ptr->headers = headers;
204 request_ptr->content = content;
205 if (
http_request(std::move(request_ptr), std::move(callback)))
return request_id;
219 const std::string &method,
220 const std::string &url,
223 const std::string &content,
226# if __cplusplus >= 201402L
227 auto request_ptr = std::make_unique<HttpRequest>();
229 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
233 request_ptr->request_id = request_id;
234 request_ptr->set_url(url, query);
235 request_ptr->method = method;
236 request_ptr->headers = headers;
237 request_ptr->content = content;
238 request_ptr->streaming = streaming;
239 if (
http_request(std::move(request_ptr), std::move(callback)))
return request_id;
251 const std::string &method,
252 const std::string &url,
255 const std::string &content) {
257# if __cplusplus >= 201402L
258 auto request_ptr = std::make_unique<HttpRequest>();
260 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
264 request_ptr->request_id = request_id;
265 request_ptr->set_url(url, query);
266 request_ptr->method = method;
267 request_ptr->headers = headers;
268 request_ptr->content = content;
270 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
271 auto future = promise->get_future();
278 if (!submit_result) {
282 return {request_id, std::move(future)};
295 const std::string &method,
296 const std::string &host,
297 const std::string &path,
300 const std::string &content,
303# if __cplusplus >= 201402L
304 auto request_ptr = std::make_unique<HttpRequest>();
306 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
310 request_ptr->request_id = request_id;
311 request_ptr->set_url(host, path, query);
312 request_ptr->method = method;
313 request_ptr->headers = headers;
314 request_ptr->content = content;
315 if (
http_request(std::move(request_ptr), std::move(callback)))
return request_id;
330 const std::string &method,
331 const std::string &host,
332 const std::string &path,
335 const std::string &content,
339# if __cplusplus >= 201402L
340 auto request_ptr = std::make_unique<HttpRequest>();
342 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
346 request_ptr->request_id = request_id;
347 request_ptr->set_url(host, path, query);
348 request_ptr->method = method;
349 request_ptr->headers = headers;
350 request_ptr->content = content;
351 request_ptr->streaming = streaming;
352 if (
http_request(std::move(request_ptr), std::move(callback)))
return request_id;
363 const std::string &url,
367 return http_request(
"GET", url, query, headers, std::string(), std::move(callback));
378 const std::string &url,
383 return http_request(
"GET", url, query, headers, std::string(), streaming, std::move(callback));
391 inline std::pair<uint64_t, std::future<HttpResponsePtr>>
http_get(
392 const std::string& url,
396# if __cplusplus >= 201402L
397 auto request_ptr = std::make_unique<HttpRequest>();
399 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
403 request_ptr->request_id = request_id;
404 request_ptr->set_url(url, query);
405 request_ptr->method =
"GET";
406 request_ptr->headers = headers;
408 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
409 auto future = promise->get_future();
416 if (!submit_result) {
420 return {request_id, std::move(future)};
431 const std::string &url,
434 const std::string& content,
436 return http_request(
"POST", url, query, headers, content, std::move(callback));
448 const std::string &url,
451 const std::string& content,
454 return http_request(
"POST", url, query, headers, content, streaming, std::move(callback));
463 inline std::pair<uint64_t, std::future<HttpResponsePtr>>
http_post(
464 const std::string& url,
467 const std::string& content) {
469# if __cplusplus >= 201402L
470 auto request_ptr = std::make_unique<HttpRequest>();
472 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
476 request_ptr->request_id = request_id;
477 request_ptr->set_url(url, query);
478 request_ptr->method =
"POST";
479 request_ptr->headers = headers;
480 request_ptr->content = content;
482 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
483 auto future = promise->get_future();
490 if (!submit_result) {
494 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.
void set_max_pending_requests(std::size_t max_pending_requests)
Sets the maximum number of pending requests accepted into the global queue.
const long create_rate_limit(long requests_per_period, long period_ms)
Creates a rate limit with specified parameters.
void cancel_request_by_id(uint64_t request_id, std::function< void()> callback)
Cancels a request by its unique identifier.
static HttpRequestManager & get_instance()
Get the singleton instance of HttpRequestManager.
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.
uint64_t generate_request_id()
Generates a new unique request ID.
Represents an HTTP request.
Represents the response received from an HTTP request, including headers, content,...
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,...
std::size_t max_pending_requests()
Returns the current global pending queue limit.
std::function< void(HttpResponsePtr response)> HttpResponseCallback
Type definition for the callback function used to handle HTTP responses.
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
A unique pointer to an HttpResponse object for memory management.
bool http_request(std::unique_ptr< HttpRequest > request_ptr, HttpResponseCallback callback)
Sends an HTTP request with callback.
long create_rate_limit_rpm(long requests_per_minute)
Creates a rate limit based on Requests Per Minute (RPM).
utils::CaseInsensitiveMultimap Headers
Alias for HTTP headers, providing a case-insensitive unordered multimap.
uint64_t generate_request_id()
Generates a new unique request ID.
long create_rate_limit_rps(long requests_per_second)
Creates a rate limit based on Requests Per Second (RPS).
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)
Removes an existing rate limit with the specified identifier.
SubmitResult submit_http_request(std::unique_ptr< HttpRequest > request_ptr, HttpResponseCallback callback)
Attempts to submit an HTTP request and reports the admission result.
utils::CaseInsensitiveMultimap QueryParams
Alias for query parameters in HTTP requests, stored case-insensitively.
long create_rate_limit(long requests_per_period, long period_ms)
Creates a rate limit with specified parameters.
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.