Kurlyk
Loading...
Searching...
No Matches
cancel_http_requests.cpp
Go to the documentation of this file.
1#define KURLYK_AUTO_INIT 0
2#include <kurlyk.hpp>
3
5 if (response->ready) {
6 KURLYK_PRINT << "Response received:" << std::endl
7 << "Status Code: " << response->status_code << std::endl
8 << "Content: " << response->content << std::endl
9 << "----------------------------------------" << std::endl;
10 } else {
11 KURLYK_PRINT << "Response received:" << std::endl
12 << "Request not ready or cancelled." << std::endl
13 << "----------------------------------------" << std::endl;
14 }
15}
16
17int main() {
18 kurlyk::init(true);
19
20 kurlyk::add_error_handler([](const std::exception& ex,
21 const char* func,
22 const char* file,
23 int line,
24 const char* message) {
25 KURLYK_PRINT << "Network error caught:"
26 << "\n Message: " << message
27 << "\n Exception: " << ex.what()
28 << "\n Function: " << func
29 << "\n File: " << file
30 << "\n Line: " << line << std::endl;
31 });
32
33 // Sending a GET request using the first function (callback-based)
34 uint64_t request_id1 = kurlyk::http_get(
35 "https://httpbin.org/delay/5", // Delayed response to simulate long-running request
38 [](kurlyk::HttpResponsePtr response) {
39 KURLYK_PRINT << "Callback-based GET request response:" << std::endl;
40 print_response(response);
41 }
42 );
43
44# if __cplusplus >= 201703L
45 // Sending a GET request using the second function (future-based)
46 auto [request_id2, future_response] = kurlyk::http_get(
47 "https://httpbin.org/delay/5", // Delayed response
50 );
51# else
52 auto func_result = kurlyk::http_get(
53 "https://httpbin.org/delay/5", // Delayed response
56 );
57 uint64_t request_id2 = func_result.first;
58 auto future_response = std::move(func_result.second);
59# endif
60
61 KURLYK_PRINT << "Sent two requests. Request IDs: " << request_id1 << ", " << request_id2 << std::endl;
62
63 // Cancel the first request after a delay
64 std::this_thread::sleep_for(std::chrono::seconds(1));
65 KURLYK_PRINT << "Cancelling the first request (ID: " << request_id1 << ")..." << std::endl;
66 kurlyk::cancel_request_by_id(request_id1, []() {
67 KURLYK_PRINT << "Request 1 cancelled successfully." << std::endl;
68 });
69
70 // Cancel the second request after a delay
71 KURLYK_PRINT << "Cancelling the second request (ID: " << request_id2 << ")..." << std::endl;
72 kurlyk::cancel_request_by_id(request_id2).wait();
73
74 // Ensure all operations complete before exiting
75 try {
76 future_response.get();
77 } catch (const std::exception& e) {
78 KURLYK_PRINT << "Future-based request exception: " << e.what() << std::endl;
79 }
80
81 const uint64_t group_id = kurlyk::generate_group_id();
82 const uint64_t grouped_request_id1 = kurlyk::generate_request_id();
83 const uint64_t grouped_request_id2 = kurlyk::generate_request_id();
84
85 auto make_grouped_request = [group_id](uint64_t request_id) {
86# if __cplusplus >= 201402L
87 auto request = std::make_unique<kurlyk::HttpRequest>();
88# else
89 auto request = std::unique_ptr<kurlyk::HttpRequest>(new kurlyk::HttpRequest());
90# endif
91 request->request_id = request_id;
92 request->group_id = group_id;
93 request->method = "GET";
94 request->set_url("https://httpbin.org", "/delay/5");
95 return request;
96 };
97
98 auto submit_grouped = [](std::unique_ptr<kurlyk::HttpRequest> request, const char* label) {
100 std::move(request),
101 [label](kurlyk::HttpResponsePtr response) {
102 KURLYK_PRINT << label << " response:" << std::endl;
103 print_response(response);
104 });
105
106 if (!submit) {
107 KURLYK_PRINT << label << " submit rejected: " << submit.error_code.message() << std::endl;
108 }
109 };
110
111 submit_grouped(make_grouped_request(grouped_request_id1), "Grouped request 1");
112 submit_grouped(make_grouped_request(grouped_request_id2), "Grouped request 2");
113
114 KURLYK_PRINT << "Sent grouped requests. Request IDs: "
115 << grouped_request_id1 << ", " << grouped_request_id2
116 << " | Group ID: " << group_id << std::endl;
117 std::this_thread::sleep_for(std::chrono::seconds(1));
118 KURLYK_PRINT << "Cancelling both grouped requests by group_id..." << std::endl;
120
121 auto limit = kurlyk::create_rate_limit_rps(2);
122 KURLYK_PRINT << "Created rate-limit handle ID: " << limit->id() << std::endl;
123
124 kurlyk::HttpClient limited_client("https://httpbin.org");
125 limited_client.set_timeout(5);
126 limited_client.set_rate_limit_handle(limit);
127
128 auto limited_future = limited_client.get("/delay/2", kurlyk::QueryParams(), kurlyk::Headers());
130 KURLYK_PRINT << "Released manager-owned rate-limit handle; pending requests keep copied handles alive." << std::endl;
131
132 std::this_thread::sleep_for(std::chrono::seconds(1));
133 KURLYK_PRINT << "Cancelling the HttpClient request group..." << std::endl;
134 limited_client.cancel_requests();
135
136 try {
137 print_response(limited_future.get());
138 } catch (const std::exception& e) {
139 KURLYK_PRINT << "Limited request exception: " << e.what() << std::endl;
140 }
141
142 KURLYK_PRINT << "Press Enter to exit..." << std::endl;
143 std::cin.get();
144
146 return 0;
147}
void print_response(const kurlyk::HttpResponsePtr &response)
int main()
Concrete HTTP client for making requests to a specific host.
bool set_rate_limit_handle(const HttpRateLimitHandlePtr &limit, RateLimitType type=RateLimitType::RL_GENERAL)
Sets an existing rate-limit handle for future requests.
void set_timeout(long timeout)
Sets the timeout duration for HTTP requests.
bool get(const std::string &path, const QueryParams &query, const Headers &headers, HttpResponseCallback callback)
Sends a GET request.
void cancel_requests()
Cancels requests associated with this client and waits for cancellation callbacks.
Represents an HTTP request configuration.
Main header file for the Kurlyk library, providing HTTP and WebSocket support.
void init(const bool use_async=true)
Initializes the Kurlyk library, setting up necessary managers and the network worker.
Definition runtime.hpp:13
std::unique_ptr< HttpResponse > HttpResponsePtr
Owning pointer to an HTTP response.
void add_error_handler(::kurlyk::core::NetworkWorker::ErrorHandler handler)
Registers a global error handler for the network worker.
Definition runtime.hpp:44
void cancel_requests_by_group_id(uint64_t group_id, std::function< void()> callback)
Cancels all requests with the specified group ID.
Definition utils.hpp:123
void deinit()
Deinitializes the Kurlyk library, stopping async processing or cleaning up synchronous state.
Definition runtime.hpp:26
utils::CaseInsensitiveMultimap Headers
Alias for HTTP headers, providing a case-insensitive unordered multimap.
uint64_t generate_request_id()
Generates a new unique request ID.
Definition utils.hpp:65
uint64_t generate_group_id()
Generates a new group ID.
Definition utils.hpp:71
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.
Definition utils.hpp:421
bool remove_limit(long limit_id)
Releases manager-owned rate-limit handle by ID.
Definition utils.hpp:52
SubmitResult submit_http_request(std::unique_ptr< HttpRequest > request_ptr, HttpResponseCallback callback)
Attempts to submit an HTTP request and reports the admission result.
Definition utils.hpp:195
HttpRateLimitHandlePtr create_rate_limit_rps(long requests_per_second, bool sequential=false)
Creates a RAII rate-limit based on Requests Per Second (RPS).
Definition utils.hpp:37
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.
Definition utils.hpp:90
#define KURLYK_PRINT
Represents the synchronous result of trying to enqueue or submit work.
std::error_code error_code
Describes the rejection reason when accepted is false.