Kurlyk
Toggle main menu visibility
Loading...
Searching...
No Matches
HttpRequestContext.hpp
Go to the documentation of this file.
1
#pragma once
2
#ifndef KURLYK_HEADER_KURLYK_HTTP_HTTP_REQUEST_MANAGER_HTTP_REQUEST_CONTEXT_HPP_INCLUDED
3
#define KURLYK_HEADER_KURLYK_HTTP_HTTP_REQUEST_MANAGER_HTTP_REQUEST_CONTEXT_HPP_INCLUDED
4
7
8
namespace
kurlyk
{
9
12
class
HttpRequestContext
{
13
public
:
14
using
time_point_t
= std::chrono::steady_clock::time_point;
15
16
std::unique_ptr<HttpRequest>
request
;
17
HttpResponseCallback
callback
;
18
long
retry_attempt
;
19
time_point_t
start_time
;
20
uint64_t
in_flight_token
= 0;
21
std::function<void()>
on_complete
;
22
std::function<void()>
on_group_complete
;
23
std::atomic<bool>
complete_called
{
false
};
24
28
HttpRequestContext
(
29
std::unique_ptr<HttpRequest> request_ptr,
30
HttpResponseCallback
callback
)
31
:
request
(
std
::move(request_ptr)),
32
callback
(
std
::move(
callback
)),
33
retry_attempt
(0),
34
in_flight_token
(0),
35
complete_called
(false) {
36
}
37
38
HttpRequestContext
() =
default
;
39
42
void
invoke_callback
(
HttpResponsePtr
response)
noexcept
{
43
if
(!
callback
)
return
;
44
45
try
{
46
callback
(std::move(response));
47
}
catch
(...) {
48
report_callback_exception
(
49
std::current_exception(),
50
"Unhandled exception in HttpRequestContext response callback"
);
51
}
52
}
53
56
void
invoke_final_callback
(
HttpResponsePtr
response)
noexcept
{
57
invoke_callback
(std::move(response));
58
complete
();
59
}
60
62
void
complete
() noexcept {
63
bool
expected =
false
;
64
if
(!
complete_called
.compare_exchange_strong(expected,
true
)) {
65
return
;
66
}
67
68
try
{
69
if
(
on_complete
) {
70
on_complete
();
71
}
72
}
catch
(...) {
73
report_callback_exception
(
74
std::current_exception(),
75
"Exception in HttpRequestContext completion callback"
);
76
}
77
78
try
{
79
if
(
on_group_complete
) {
80
on_group_complete
();
81
}
82
}
catch
(...) {
83
report_callback_exception
(
84
std::current_exception(),
85
"Exception in HttpRequestContext group completion callback"
);
86
}
87
}
88
89
private
:
90
static
void
report_callback_exception
(
91
std::exception_ptr exception,
92
const
char
* message)
noexcept
{
93
try
{
94
KURLYK_HANDLE_ERROR
(exception, message);
95
}
catch
(...) {
96
// Error reporting must not interrupt request cleanup.
97
}
98
}
99
};
// HttpRequestContext
100
101
}
// namespace kurlyk
102
103
#endif
// KURLYK_HEADER_KURLYK_HTTP_HTTP_REQUEST_MANAGER_HTTP_REQUEST_CONTEXT_HPP_INCLUDED
KURLYK_HANDLE_ERROR
#define KURLYK_HANDLE_ERROR(e, msg)
Definition
NetworkWorker.hpp:8
kurlyk::HttpRequestContext::on_group_complete
std::function< void()> on_group_complete
Callback invoked after the final user callback for the group.
Definition
HttpRequestContext.hpp:22
kurlyk::HttpRequestContext::start_time
time_point_t start_time
Time when the request was initially created or last retried.
Definition
HttpRequestContext.hpp:19
kurlyk::HttpRequestContext::request
std::unique_ptr< HttpRequest > request
The HTTP request associated with this context.
Definition
HttpRequestContext.hpp:16
kurlyk::HttpRequestContext::complete_called
std::atomic< bool > complete_called
True after completion callbacks have been claimed for invocation.
Definition
HttpRequestContext.hpp:23
kurlyk::HttpRequestContext::on_complete
std::function< void()> on_complete
Callback invoked once when the request finishes (including retries).
Definition
HttpRequestContext.hpp:21
kurlyk::HttpRequestContext::retry_attempt
long retry_attempt
Number of retry attempts made for this request.
Definition
HttpRequestContext.hpp:18
kurlyk::HttpRequestContext::time_point_t
std::chrono::steady_clock::time_point time_point_t
Definition
HttpRequestContext.hpp:14
kurlyk::HttpRequestContext::invoke_final_callback
void invoke_final_callback(HttpResponsePtr response) noexcept
Invokes the final response callback, then performs idempotent request completion.
Definition
HttpRequestContext.hpp:56
kurlyk::HttpRequestContext::in_flight_token
uint64_t in_flight_token
Token for sequential rate-limit tracking.
Definition
HttpRequestContext.hpp:20
kurlyk::HttpRequestContext::HttpRequestContext
HttpRequestContext()=default
kurlyk::HttpRequestContext::complete
void complete() noexcept
Invokes completion callbacks exactly once. Thread-safe and idempotent.
Definition
HttpRequestContext.hpp:62
kurlyk::HttpRequestContext::report_callback_exception
static void report_callback_exception(std::exception_ptr exception, const char *message) noexcept
Definition
HttpRequestContext.hpp:90
kurlyk::HttpRequestContext::callback
HttpResponseCallback callback
Callback function to be invoked when the request completes.
Definition
HttpRequestContext.hpp:17
kurlyk::HttpRequestContext::invoke_callback
void invoke_callback(HttpResponsePtr response) noexcept
Invokes the response callback and reports callback exceptions.
Definition
HttpRequestContext.hpp:42
kurlyk::HttpRequestContext::HttpRequestContext
HttpRequestContext(std::unique_ptr< HttpRequest > request_ptr, HttpResponseCallback callback)
Constructs a HttpRequestContext with the specified request and callback.
Definition
HttpRequestContext.hpp:28
kurlyk
Primary namespace for the Kurlyk library, encompassing initialization, request management,...
kurlyk::HttpResponseCallback
std::function< void(HttpResponsePtr response)> HttpResponseCallback
Callback invoked with an HTTP response.
Definition
HttpResponse.hpp:40
kurlyk::HttpResponsePtr
std::unique_ptr< HttpResponse > HttpResponsePtr
Owning pointer to an HTTP response.
Definition
HttpResponse.hpp:36
std
Enables use of ClientError with std::error_code.
Definition
ClientErrorCategory.hpp:71
include
kurlyk
http
HttpRequestManager
HttpRequestContext.hpp
Generated by
1.18.0