2#ifndef _KURLYK_HTTP_UTILS_HPP_INCLUDED
3#define _KURLYK_HTTP_UTILS_HPP_INCLUDED
22 long period_ms = 60000;
30 long period_ms = 1000;
59 auto promise = std::make_shared<std::promise<void>>();
60 auto future = promise->get_future();
64 }
catch (
const std::future_error& e) {
65 if (e.code() == std::make_error_condition(std::future_errc::promise_already_satisfied)) {
70 }
catch (
const std::exception& e) {
85 std::unique_ptr<HttpRequest> request_ptr,
96 std::unique_ptr<HttpRequest> request_ptr) {
98 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
99 auto future = promise->get_future();
102 if (!response || !response->ready)
return;
104 promise->set_value(std::move(response));
105 }
catch (
const std::future_error& e) {
106 if (e.code() == std::make_error_condition(std::future_errc::promise_already_satisfied)) {
111 }
catch (
const std::exception& e) {
121 promise->set_exception(std::make_exception_ptr(
123 "Failed to add request to RequestManager")));
140 const std::string &method,
141 const std::string &url,
144 const std::string &content,
146# if __cplusplus >= 201402L
147 auto request_ptr = std::make_unique<HttpRequest>();
149 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
153 request_ptr->request_id = request_id;
154 request_ptr->set_url(url, query);
155 request_ptr->method = method;
156 request_ptr->headers = headers;
157 request_ptr->content = content;
158 if (
http_request(std::move(request_ptr), std::move(callback)))
return request_id;
170 const std::string &method,
171 const std::string &url,
174 const std::string &content) {
176# if __cplusplus >= 201402L
177 auto request_ptr = std::make_unique<HttpRequest>();
179 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
183 request_ptr->request_id = request_id;
184 request_ptr->set_url(url, query);
185 request_ptr->method = method;
186 request_ptr->headers = headers;
187 request_ptr->content = content;
189 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
190 auto future = promise->get_future();
193 if (!response || !response->ready)
return;
195 promise->set_value(std::move(response));
196 }
catch (
const std::future_error& e) {
197 if (e.code() == std::make_error_condition(std::future_errc::promise_already_satisfied)) {
202 }
catch (
const std::exception& e) {
209 if (!
http_request(std::move(request_ptr), std::move(callback))) {
211 promise->set_exception(std::make_exception_ptr(
213 "Failed to add request to HttpRequestManager")));
217 return {request_id, std::move(future)};
230 const std::string &method,
231 const std::string &host,
232 const std::string &path,
235 const std::string &content,
238# if __cplusplus >= 201402L
239 auto request_ptr = std::make_unique<HttpRequest>();
241 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
245 request_ptr->request_id = request_id;
246 request_ptr->set_url(host, path, query);
247 request_ptr->method = method;
248 request_ptr->headers = headers;
249 request_ptr->content = content;
250 if (
http_request(std::move(request_ptr), std::move(callback)))
return request_id;
261 const std::string &url,
265 return http_request(
"GET", url, query, headers, std::string(), std::move(callback));
273 std::pair<uint64_t, std::future<HttpResponsePtr>>
http_get(
274 const std::string& url,
278# if __cplusplus >= 201402L
279 auto request_ptr = std::make_unique<HttpRequest>();
281 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
285 request_ptr->request_id = request_id;
286 request_ptr->set_url(url, query);
287 request_ptr->method =
"GET";
288 request_ptr->headers = headers;
290 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
291 auto future = promise->get_future();
294 if (!response || !response->ready)
return;
296 promise->set_value(std::move(response));
297 }
catch (
const std::future_error& e) {
298 if (e.code() == std::make_error_condition(std::future_errc::promise_already_satisfied)) {
303 }
catch (
const std::exception& e) {
310 if (!
http_request(std::move(request_ptr), std::move(callback))) {
312 promise->set_exception(std::make_exception_ptr(
314 "Failed to add request to HttpRequestManager")));
318 return {request_id, std::move(future)};
329 const std::string &url,
332 const std::string& content,
334 return http_request(
"POST", url, query, headers, content, std::move(callback));
343 std::pair<uint64_t, std::future<HttpResponsePtr>>
http_post(
344 const std::string& url,
347 const std::string& content) {
349# if __cplusplus >= 201402L
350 auto request_ptr = std::make_unique<HttpRequest>();
352 auto request_ptr = std::unique_ptr<HttpRequest>(
new HttpRequest());
356 request_ptr->request_id = request_id;
357 request_ptr->set_url(url, query);
358 request_ptr->method =
"POST";
359 request_ptr->headers = headers;
360 request_ptr->content = content;
362 auto promise = std::make_shared<std::promise<HttpResponsePtr>>();
363 auto future = promise->get_future();
366 if (!response || !response->ready)
return;
368 promise->set_value(std::move(response));
369 }
catch (
const std::future_error& e) {
370 if (e.code() == std::make_error_condition(std::future_errc::promise_already_satisfied)) {
375 }
catch (
const std::exception& e) {
382 if (!
http_request(std::move(request_ptr), std::move(callback))) {
384 promise->set_exception(std::make_exception_ptr(
386 "Failed to add request to HttpRequestManager")));
390 return {request_id, std::move(future)};
#define KURLYK_HANDLE_ERROR(e, msg)
const bool add_request(std::unique_ptr< HttpRequest > request_ptr, HttpResponseCallback callback)
Adds a new HTTP request to the manager.
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.
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.
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::function< void(HttpResponsePtr response)> HttpResponseCallback
Type definition for the callback function used to handle HTTP responses.
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.
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.