Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
HttpClientSession.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4
5#include "HttpClient.h"
6
7namespace SC
8{
11
13struct SC_HTTP_CLIENT_EXPORT HttpClientSessionCookie
14{
15 enum Flag : uint8_t
16 {
17 Secure = 1 << 0,
18 HttpOnly = 1 << 1,
19 DomainCookie = 1 << 2,
20 };
21
22 StringSpan name;
23 StringSpan value;
24 StringSpan domain;
25 StringSpan path;
26 uint8_t flags = 0;
27
28 [[nodiscard]] bool isInUse() const { return not name.isEmpty(); }
29};
30
32struct SC_HTTP_CLIENT_EXPORT HttpClientSessionAuthCacheEntry
33{
36
37 [[nodiscard]] bool isInUse() const { return not origin.isEmpty(); }
38};
39
41struct SC_HTTP_CLIENT_EXPORT HttpClientSessionAuthChallenge
42{
43 enum Target : uint8_t
44 {
45 Origin,
46 Proxy,
47 };
48
49 enum Scheme : uint8_t
50 {
51 Unsupported,
52 Basic,
53 };
54
55 Target target = Origin;
56 Scheme scheme = Unsupported;
57 StringSpan realm;
58
59 [[nodiscard]] const char* getTargetName() const { return getTargetName(target); }
60 [[nodiscard]] const char* getSchemeName() const { return getSchemeName(scheme); }
61 [[nodiscard]] static const char* getTargetName(Target target);
62 [[nodiscard]] static const char* getSchemeName(Scheme scheme);
63};
64
74
76struct SC_HTTP_CLIENT_EXPORT HttpClientSessionRetryPolicy
77{
78 uint8_t maxAttempts = 1;
79
80 bool retryTransportErrors = true;
81 bool retryHttpStatusCodes = true;
82 bool retryNonIdempotentReplayableBody = false;
83};
84
86struct SC_HTTP_CLIENT_EXPORT HttpClientSessionRetryState
87{
88 HttpClientRequest::Method method = HttpClientRequest::HttpGET;
90 uint8_t attemptsStarted = 0;
91 bool requestBodyReplayable = true;
92
93 [[nodiscard]] bool isStarted() const { return attemptsStarted > 0; }
94 [[nodiscard]] bool hasAttemptsRemaining() const { return attemptsStarted < policy.maxAttempts; }
95 [[nodiscard]] uint8_t getRemainingAttempts() const
96 {
97 return attemptsStarted < policy.maxAttempts ? static_cast<uint8_t>(policy.maxAttempts - attemptsStarted) : 0;
98 }
99};
100
106struct SC_HTTP_CLIENT_EXPORT HttpClientSession
107{
108 [[nodiscard]] Result init(const HttpClientSessionMemory& memory);
109 void clear();
110 void clearCookies();
111 void clearAuthorizations();
112
113 [[nodiscard]] Result addAuthorization(StringSpan origin, StringSpan authorizationHeader);
114 [[nodiscard]] bool findAuthorization(StringSpan origin, StringSpan& authorizationHeader) const;
115 [[nodiscard]] bool hasAuthorization(StringSpan origin) const;
116 [[nodiscard]] bool findCookie(StringSpan name, StringSpan domain, StringSpan path,
117 HttpClientSessionCookie& cookie) const;
118 [[nodiscard]] bool hasCookie(StringSpan name, StringSpan domain, StringSpan path) const;
119 [[nodiscard]] Result prepareRequest(const HttpClientRequest& source, HttpClientRequest& prepared);
120 [[nodiscard]] Result captureResponse(const HttpClientRequest& request, const HttpClientResponse& response);
121
122 [[nodiscard]] static Result makeBasicAuthorization(StringSpan username, StringSpan password, Span<char> destination,
123 StringSpan& authorizationHeader);
124 [[nodiscard]] static bool findBasicAuthChallenge(const HttpClientResponse& response,
125 HttpClientSessionAuthChallenge::Target target,
127 [[nodiscard]] static Result makeBasicAuthorizationForChallenge(const HttpClientResponse& response,
128 HttpClientSessionAuthChallenge::Target target,
129 StringSpan username, StringSpan password,
130 Span<char> destination,
131 StringSpan& authorizationHeader);
132
133 [[nodiscard]] Result beginRetry(HttpClientSessionRetryState& state, const HttpClientRequest& request,
134 HttpClientSessionRetryPolicy policy) const;
135 [[nodiscard]] bool shouldRetry(HttpClientSessionRetryState& state, Result transportResult,
136 const HttpClientResponse* response) const;
137
138 [[nodiscard]] static bool isIdempotentMethod(HttpClientRequest::Method method);
139 [[nodiscard]] static bool isRetryableStatusCode(int statusCode);
140
141 [[nodiscard]] bool isInitialized() const { return initialized; }
142 [[nodiscard]] size_t getNumCookies() const;
143 [[nodiscard]] size_t getNumAuthorizations() const;
144
145 private:
146 [[nodiscard]] Result copyStateString(StringSpan source, StringSpan& destination);
147 [[nodiscard]] Result appendPreparedHeader(StringSpan name, StringSpan value, size_t& numHeaders);
148 [[nodiscard]] Result appendScratch(StringSpan text, bool addSeparator);
149 [[nodiscard]] Result appendMatchingCookies(StringSpan url, size_t& numHeaders);
150 [[nodiscard]] Result captureSetCookie(StringSpan requestUrl, StringSpan setCookie);
151
152 HttpClientSessionMemory sessionMemory;
153 size_t stateScratchUsed = 0;
154 size_t headerScratchUsed = 0;
155 bool initialized = false;
156};
157
159} // namespace SC
unsigned char uint8_t
Platform independent (1) byte unsigned int.
Definition PrimitiveTypes.h:27
Configuration for an outgoing HTTP request.
Definition HttpClient.h:274
Parsed response metadata filled when headers arrive.
Definition HttpClient.h:303
Caller-managed authorization cache entry for one exact request origin.
Definition HttpClientSession.h:33
StringSpan authorizationHeader
Full Authorization header value, e.g. Basic ...
Definition HttpClientSession.h:35
StringSpan origin
scheme://host[:port]
Definition HttpClientSession.h:34
Authentication challenge parsed from response headers without owning memory.
Definition HttpClientSession.h:42
Cookie state owned by HttpClientSession caller-provided memory.
Definition HttpClientSession.h:14
Caller-owned memory for the optional HttpClientSession layer.
Definition HttpClientSession.h:67
Span< HttpClientSessionAuthCacheEntry > authEntries
Durable auth cache slots.
Definition HttpClientSession.h:70
Span< char > stateScratch
Append-only durable state string scratch.
Definition HttpClientSession.h:72
Span< HttpClientHeader > requestHeaders
Header workspace for prepared requests.
Definition HttpClientSession.h:68
Span< char > headerScratch
Per-prepare header value scratch.
Definition HttpClientSession.h:71
Span< HttpClientSessionCookie > cookies
Durable cookie slots.
Definition HttpClientSession.h:69
Retry policy used by HttpClientSessionRetryState.
Definition HttpClientSession.h:77
Caller-owned retry bookkeeping for one logical request.
Definition HttpClientSession.h:87
Optional caller-owned state layer above the stateless HttpClient core.
Definition HttpClientSession.h:107
An ascii string used as boolean result. SC_TRY macro forwards errors to caller.
Definition Result.h:13
View over a contiguous sequence of items (pointer + size in elements).
Definition Span.h:29
An read-only view over a string (to avoid including Strings library when parsing is not needed).
Definition StringSpan.h:37
constexpr bool isEmpty() const
Return true if StringView is empty.
Definition StringSpan.h:85