Kurlyk
Toggle main menu visibility
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
5
void
print_response
(
const
kurlyk::HttpResponsePtr
& response) {
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
18
int
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;
58
kurlyk::submit_http_request
(
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;
67
kurlyk::submit_http_request
(
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();
87
kurlyk::deinit
();
88
return
0;
89
}
kurlyk::HttpRequest
Represents an HTTP request configuration.
Definition
HttpRequest.hpp:16
kurlyk.hpp
Main header file for the Kurlyk library, providing HTTP and WebSocket support.
kurlyk::create_rate_limit
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
kurlyk::init
void init(const bool use_async=true)
Initializes the Kurlyk library, setting up necessary managers and the network worker.
Definition
runtime.hpp:13
kurlyk::HttpResponsePtr
std::unique_ptr< HttpResponse > HttpResponsePtr
Owning pointer to an HTTP response.
Definition
HttpResponse.hpp:36
kurlyk::add_error_handler
void add_error_handler(::kurlyk::core::NetworkWorker::ErrorHandler handler)
Registers a global error handler for the network worker.
Definition
runtime.hpp:44
kurlyk::cancel_requests_by_group_id
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
kurlyk::deinit
void deinit()
Deinitializes the Kurlyk library, stopping async processing or cleaning up synchronous state.
Definition
runtime.hpp:26
kurlyk::generate_request_id
uint64_t generate_request_id()
Generates a new unique request ID.
Definition
utils.hpp:65
kurlyk::generate_group_id
uint64_t generate_group_id()
Generates a new group ID.
Definition
utils.hpp:71
kurlyk::submit_http_request
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
KURLYK_PRINT
#define KURLYK_PRINT
Definition
print_utils.hpp:8
print_response
void print_response(const kurlyk::HttpResponsePtr &response)
Definition
sequential_rate_limit_example.cpp:5
main
int main()
Definition
sequential_rate_limit_example.cpp:18
examples
sequential_rate_limit_example.cpp
Generated by
1.17.0