Kurlyk
Loading...
Searching...
No Matches
sequential_rate_limit_example.cpp
Go to the documentation of this file.
1#include <iostream>
2#define KURLYK_AUTO_INIT 0
3#include <kurlyk.hpp>
4
6 if (response->ready) {
7 KURLYK_PRINT << "Response received:" << std::endl
8 << "Status Code: " << response->status_code << std::endl
9 << "Content: " << response->content << std::endl
10 << "----------------------------------------" << std::endl;
11 } else {
12 KURLYK_PRINT << "Response received:" << std::endl
13 << "Request not ready or cancelled." << std::endl
14 << "----------------------------------------" << std::endl;
15 }
16}
17
18int main() {
19 kurlyk::init(true);
20
21 kurlyk::add_error_handler([](const std::exception& ex,
22 const char* func,
23 const char* file,
24 int line,
25 const char* message) {
26 KURLYK_PRINT << "Network error caught:"
27 << "\n Message: " << message
28 << "\n Exception: " << ex.what()
29 << "\n Function: " << func
30 << "\n File: " << file
31 << "\n Line: " << line << std::endl;
32 });
33
34 // Create a sequential rate limit: only one request may be in-flight at a time.
35 // Retries of the same request also hold the lock; other requests wait.
36 auto limit = kurlyk::create_rate_limit(1, 60000, true);
37 KURLYK_PRINT << "Created sequential rate-limit handle ID: " << limit->id() << std::endl;
38
39 const uint64_t group_id_1 = kurlyk::generate_group_id();
40 const uint64_t group_id_2 = kurlyk::generate_group_id();
41
42 auto make_sequential_request = [&limit](uint64_t group_id, const std::string& path) {
43#if __cplusplus >= 201402L
44 auto request = std::make_unique<kurlyk::HttpRequest>();
45#else
46 auto request = std::unique_ptr<kurlyk::HttpRequest>(new kurlyk::HttpRequest());
47#endif
48 request->request_id = kurlyk::generate_request_id();
49 request->group_id = group_id;
50 request->method = "GET";
51 request->set_url("http://127.0.0.1", path);
52 request->specific_rate_limit = limit;
53 return request;
54 };
55
56 // Request 1: starts immediately (connection refused, but holds the sequential lock).
57 KURLYK_PRINT << "Submitting Request 1 (group " << group_id_1 << ")..." << std::endl;
59 make_sequential_request(group_id_1, "/first"),
60 [](kurlyk::HttpResponsePtr response) {
61 KURLYK_PRINT << "Request 1 done (status " << response->status_code << ")" << std::endl;
62 print_response(response);
63 });
64
65 // Request 2: blocked while Request 1 is in-flight.
66 KURLYK_PRINT << "Submitting Request 2 (group " << group_id_2 << ") — waiting..." << std::endl;
68 make_sequential_request(group_id_2, "/second"),
69 [](kurlyk::HttpResponsePtr response) {
70 KURLYK_PRINT << "Request 2 done (status " << response->status_code << ")" << std::endl;
71 print_response(response);
72 });
73
74 // Cancel Request 1 to release the sequential lock so Request 2 can proceed.
75 std::this_thread::sleep_for(std::chrono::milliseconds(500));
76 KURLYK_PRINT << "Cancelling Request 1 by group_id..." << std::endl;
77 kurlyk::cancel_requests_by_group_id(group_id_1).wait();
78 KURLYK_PRINT << "Request 1 cancelled; sequential lock released." << std::endl;
79
80 // Give Request 2 a chance to run and then cancel it too.
81 std::this_thread::sleep_for(std::chrono::milliseconds(500));
82 KURLYK_PRINT << "Cancelling Request 2 by group_id..." << std::endl;
83 kurlyk::cancel_requests_by_group_id(group_id_2).wait();
84
85 KURLYK_PRINT << "Press Enter to exit..." << std::endl;
86 std::cin.get();
88 return 0;
89}
Represents an HTTP request configuration.
Main header file for the Kurlyk library, providing HTTP and WebSocket support.
HttpRateLimitHandlePtr create_rate_limit(long requests_per_period, long period_ms, bool sequential=false)
Creates a RAII rate-limit handle with specified parameters.
Definition utils.hpp:18
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
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
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
#define KURLYK_PRINT
void print_response(const kurlyk::HttpResponsePtr &response)