A11 (C++ runtime)
Native C++ implementation of the A11 action and streaming runtime
Loading...
Searching...
No Matches
http2.h
Go to the documentation of this file.
1// Copyright 2026 The A11 Authors.
2
15#ifndef A11_NET_HTTP2_H_
16#define A11_NET_HTTP2_H_
17
18#include <cstddef>
19#include <cstdint>
20#include <functional>
21#include <memory>
22#include <optional>
23#include <string>
24#include <string_view>
25#include <utility>
26#include <vector>
27
28#include <absl/base/nullability.h>
29#include <absl/status/status.h>
30#include <absl/status/statusor.h>
31#include <absl/time/time.h>
32
34
35namespace a11::net {
36
37class Http2RequestBodyStream;
38
45using HttpHeaders = std::vector<std::pair<std::string, std::string>>;
46
50std::optional<std::string> GetHttpHeader(const HttpHeaders& headers,
51 std::string_view name);
53void EraseHttpHeader(HttpHeaders* absl_nonnull headers, std::string_view name);
55void SetHttpHeader(HttpHeaders* absl_nonnull headers, std::string name,
56 std::string value);
58absl::Status ValidateHttpHeaders(const HttpHeaders& headers);
59
65 std::string method;
66 std::string protocol;
67 std::string scheme;
68 std::string authority;
69 std::string path;
71 std::string body;
73 std::shared_ptr<Http2RequestBodyStream> body_stream;
74};
75
81
85 std::string body;
86};
87
91 bool enabled = false;
92 bool verify_peer = true;
94 std::string key_pem_file;
96
98 absl::Status Validate() const;
99};
100
104 size_t max_request_body_size = 32 * 1024 * 1024;
105 size_t max_response_body_size = 32 * 1024 * 1024;
107 4 * 1024 * 1024;
109 4 * 1024 * 1024;
110 absl::Time deadline = absl::InfiniteFuture();
112
114 absl::Status Validate() const;
115};
116
117class Http2Connection;
118
126 : public std::enable_shared_from_this<Http2RequestBodyStream> {
127 public:
132 a11::Task Done() const;
134 absl::Status Cancel(absl::Status status = absl::CancelledError(
135 "HTTP/2 request body cancelled"));
137 [[nodiscard]] std::int32_t stream_id() const;
138
139 private:
140 struct State;
141
142 explicit Http2RequestBodyStream(std::shared_ptr<State> state)
143 : state_(std::move(state)) {}
144
145 std::shared_ptr<State> state_;
146
147 friend class Http2Connection;
148};
149
158 : public std::enable_shared_from_this<Http2ResponseStream> {
159 public:
166 a11::Task Done() const;
168 absl::Status Cancel(
169 absl::Status status = absl::CancelledError("HTTP/2 request cancelled"));
171 [[nodiscard]] std::int32_t stream_id() const;
172
173 private:
174 struct State;
175
176 explicit Http2ResponseStream(std::shared_ptr<State> state)
177 : state_(std::move(state)) {}
178
179 std::shared_ptr<State> state_;
180
181 friend class Http2Connection;
182 friend class Http2Client;
183};
184
193 : public std::enable_shared_from_this<Http2DuplexStream> {
194 public:
201 absl::Status Write(std::string data);
203 absl::Status Finish();
205 absl::Status Abort(absl::Status status = absl::CancelledError(
206 "HTTP/2 duplex stream cancelled"));
208 a11::Task Done() const;
210 [[nodiscard]] std::int32_t stream_id() const;
211
212 private:
213 Http2DuplexStream(std::weak_ptr<Http2Connection> connection,
214 std::shared_ptr<Http2ResponseStream> response)
215 : connection_(std::move(connection)), response_(std::move(response)) {}
216
217 std::weak_ptr<Http2Connection> connection_;
218 std::shared_ptr<Http2ResponseStream> response_;
219
220 friend class Http2Connection;
221 friend class Http2Client;
222};
223
232 : public std::enable_shared_from_this<Http2ResponseWriter> {
233 public:
235 absl::Status SendHeaders(int status, HttpHeaders headers = {});
237 absl::Status Write(std::string data);
239 absl::Status Finish();
241 absl::Status SendResponse(int status, HttpHeaders headers = {},
242 std::string body = {});
244 absl::Status Abort(absl::Status status);
246 a11::Task Done() const;
247
249 [[nodiscard]] bool headers_sent() const;
251 [[nodiscard]] bool finished() const;
252
254 [[nodiscard]] std::int32_t stream_id() const { return stream_id_; }
255
256 private:
257 struct State;
258
259 Http2ResponseWriter(std::weak_ptr<Http2Connection> connection,
260 std::int32_t stream_id, std::shared_ptr<State> state)
261 : connection_(std::move(connection)),
262 stream_id_(stream_id),
263 state_(std::move(state)) {}
264
265 std::weak_ptr<Http2Connection> connection_;
266 std::int32_t stream_id_;
267 std::shared_ptr<State> state_;
268
269 friend class Http2Connection;
270};
271
273using Http2RequestHandler = std::function<a11::Task(
274 HttpRequest request, std::shared_ptr<Http2ResponseWriter> response)>;
275
282class Http2Server : public std::enable_shared_from_this<Http2Server> {
283 public:
293 static absl::StatusOr<std::shared_ptr<Http2Server>> Create(
294 std::string bind_address, std::uint16_t port, Http2RequestHandler handler,
295 Http2Options options = {});
296
297 ~Http2Server();
298
300 absl::Status Stop();
302 [[nodiscard]] std::uint16_t port() const;
304 [[nodiscard]] std::string bind_address() const;
306 [[nodiscard]] bool running() const;
308 [[nodiscard]] bool secure() const;
310 [[nodiscard]] void* absl_nullable GetImpl() const;
311
312 private:
313 struct State;
314
315 explicit Http2Server(std::shared_ptr<State> state)
316 : state_(std::move(state)) {}
317
318 std::shared_ptr<State> state_;
319};
320
328class Http2Client : public std::enable_shared_from_this<Http2Client> {
329 public:
339 std::string host, std::uint16_t port, Http2Options options = {});
340
341 ~Http2Client();
342
344 absl::StatusOr<std::shared_ptr<Http2ResponseStream>> RequestStream(
345 std::string method, std::string path, HttpHeaders headers = {},
346 std::string body = {}, std::string scheme = {});
348 absl::StatusOr<std::shared_ptr<Http2DuplexStream>> ExtendedConnect(
349 std::string protocol, std::string path, HttpHeaders headers = {},
350 std::string scheme = {});
352 a11::Future<HttpResponse> Request(std::string method, std::string path,
353 HttpHeaders headers = {},
354 std::string body = {},
355 std::string scheme = {});
357 absl::Status Close();
358
360 [[nodiscard]] std::string host() const;
362 [[nodiscard]] std::uint16_t port() const;
364 [[nodiscard]] bool connected() const;
366 [[nodiscard]] bool secure() const;
368 [[nodiscard]] void* absl_nullable GetImpl() const;
369
370 private:
371 struct Impl;
372 static constexpr size_t kImplSize = 272;
373 static constexpr size_t kImplAlignment = alignof(std::max_align_t);
374
375 Http2Client(std::string host, std::uint16_t port, Http2Options options,
376 std::shared_ptr<Http2Connection> connection);
377
378 Impl* absl_nonnull state();
379 const Impl* absl_nonnull state() const;
380
381 alignas(kImplAlignment) std::byte impl_[kImplSize];
382};
383
384} // namespace a11::net
385
386#endif // A11_NET_HTTP2_H_
Shared handle to one asynchronous result.
Definition future.h:110
An HTTP/2 client connection, reusable across many streams.
Definition http2.h:328
static a11::Future< std::shared_ptr< Http2Client > > Connect(std::string host, std::uint16_t port, Http2Options options={})
Asynchronously connects to an HTTP/2 server.
Definition http2.cc:2479
std::string host() const
Definition http2.cc:2788
absl::Status Close()
Closes the client connection.
Definition http2.cc:2777
bool connected() const
Definition http2.cc:2796
absl::StatusOr< std::shared_ptr< Http2DuplexStream > > ExtendedConnect(std::string protocol, std::string path, HttpHeaders headers={}, std::string scheme={})
Opens an extended CONNECT duplex stream for bidirectional data.
Definition http2.cc:2710
void *absl_nullable GetImpl() const
Definition http2.cc:2809
a11::Future< HttpResponse > Request(std::string method, std::string path, HttpHeaders headers={}, std::string body={}, std::string scheme={})
Definition http2.cc:2733
bool secure() const
Definition http2.cc:2805
~Http2Client()
Definition http2.cc:2682
absl::StatusOr< std::shared_ptr< Http2ResponseStream > > RequestStream(std::string method, std::string path, HttpHeaders headers={}, std::string body={}, std::string scheme={})
Opens a request and returns a pull-oriented response body stream.
Definition http2.cc:2687
std::uint16_t port() const
Definition http2.cc:2792
Definition http2.cc:800
Client side of an HTTP/2 extended CONNECT stream.
Definition http2.h:193
a11::Future< HttpResponseHead > Headers() const
Definition http2.cc:2199
absl::Status Abort(absl::Status status=absl::CancelledError("HTTP/2 duplex stream cancelled"))
Aborts the whole duplex stream with the given status.
Definition http2.cc:2221
absl::Status Write(std::string data)
Writes a chunk of request DATA.
Definition http2.cc:2207
absl::Status Finish()
Closes the request side, signalling END_STREAM to the peer.
Definition http2.cc:2214
a11::Task Done() const
Definition http2.cc:2225
std::int32_t stream_id() const
Definition http2.cc:2229
a11::Future< std::optional< std::string > > Read()
Definition http2.cc:2203
Pull-oriented request DATA for an extended CONNECT stream.
Definition http2.h:126
a11::Task Done() const
Definition http2.cc:504
absl::Status Cancel(absl::Status status=absl::CancelledError("HTTP/2 request body cancelled"))
Cancels the body stream with the given status.
Definition http2.cc:508
a11::Future< std::optional< std::string > > Read()
Definition http2.cc:467
std::int32_t stream_id() const
Definition http2.cc:525
A pull-oriented HTTP/2 response body stream.
Definition http2.h:158
a11::Task Done() const
Definition http2.cc:694
std::int32_t stream_id() const
Definition http2.cc:716
a11::Future< std::optional< std::string > > Read()
Definition http2.cc:656
absl::Status Cancel(absl::Status status=absl::CancelledError("HTTP/2 request cancelled"))
Cancels the response stream with the given status.
Definition http2.cc:698
a11::Future< HttpResponseHead > Headers() const
Definition http2.cc:652
Server-side handle for writing an HTTP/2 response to one request.
Definition http2.h:232
std::int32_t stream_id() const
Definition http2.h:254
bool headers_sent() const
Definition http2.cc:2279
absl::Status Finish()
Signals the end of the response body.
Definition http2.cc:2249
bool finished() const
Definition http2.cc:2287
absl::Status Write(std::string data)
Writes a chunk of response body data.
Definition http2.cc:2241
absl::Status SendHeaders(int status, HttpHeaders headers={})
Sends the response status and headers.
Definition http2.cc:2233
absl::Status Abort(absl::Status status)
Aborts the response with the given status.
Definition http2.cc:2266
absl::Status SendResponse(int status, HttpHeaders headers={}, std::string body={})
Sends a complete response (status, headers, and body) in one call.
Definition http2.cc:2256
a11::Task Done() const
Definition http2.cc:2273
An HTTP/2 server that dispatches each request to an async handler.
Definition http2.h:282
std::string bind_address() const
Definition http2.cc:2461
static absl::StatusOr< std::shared_ptr< Http2Server > > Create(std::string bind_address, std::uint16_t port, Http2RequestHandler handler, Http2Options options={})
Creates and starts an HTTP/2 server.
Definition http2.cc:2314
void *absl_nullable GetImpl() const
Definition http2.cc:2474
bool running() const
Definition http2.cc:2465
~Http2Server()
Definition http2.cc:2428
absl::Status Stop()
Stops the server and releases its resources.
Definition http2.cc:2432
std::uint16_t port() const
Definition http2.cc:2456
bool secure() const
Definition http2.cc:2470
Completion values used by every asynchronous A11 operation.
std::string scheme
Definition http_sse_wire_stream.cc:43
Definition action.h:46
absl::Status ValidateHttpHeaders(const HttpHeaders &headers)
Definition http2.cc:753
std::vector< std::pair< std::string, std::string > > HttpHeaders
An ordered list of (name, value) HTTP/2 header fields.
Definition http2.h:45
void EraseHttpHeader(HttpHeaders *headers, std::string_view name)
Definition http2.cc:740
std::optional< std::string > GetHttpHeader(const HttpHeaders &headers, std::string_view name)
Definition http2.cc:728
void SetHttpHeader(HttpHeaders *headers, std::string name, std::string value)
Definition http2.cc:747
void NormalizeHttpHeaders(HttpHeaders *headers)
Definition http2.cc:721
std::function< a11::Task(HttpRequest request, std::shared_ptr< Http2ResponseWriter > response)> Http2RequestHandler
Callback dispatched for each inbound request, given a response writer.
Definition http2.h:274
Future< Unit > Task
Asynchronous operation whose only successful result is completion itself.
Definition future.h:403
Future< T > SubmitWithCancellationHook(absl::AnyInvocable< absl::StatusOr< T >() && > work, std::function< void()> cancellation_hook, thread::TreeOptions tree_options)
Run work on A11's fiber pool with application-specific cancellation.
Definition executor.h:30
Definition http2.cc:2649
Body-size limits, buffering thresholds, deadline, and TLS for an HTTP/2 client or server.
Definition http2.h:103
size_t max_response_body_size
Response hard limit.
Definition http2.h:105
size_t max_buffered_request_bytes
Request backpressure bound.
Definition http2.h:106
Http2TlsOptions tls
TLS and certificate policy.
Definition http2.h:111
absl::Status Validate() const
Validate size relationships, deadline, and TLS settings.
Definition http2.cc:791
absl::Time deadline
Connection-wide deadline.
Definition http2.h:110
size_t max_buffered_response_bytes
Response backpressure bound.
Definition http2.h:108
size_t max_request_body_size
Request hard limit.
Definition http2.h:104
Definition http2.cc:2295
TLS settings for an HTTP/2 client or server (certificates, peer verification).
Definition http2.h:90
bool verify_peer
Validate the remote certificate and hostname.
Definition http2.h:92
std::string certificate_pem_file
Local certificate chain, if needed.
Definition http2.h:93
std::string ca_certificate_pem_file
Optional custom trust roots.
Definition http2.h:95
std::string key_pem_file
Private key matching the local certificate.
Definition http2.h:94
bool enabled
Negotiate TLS instead of clear-text HTTP/2.
Definition http2.h:91
absl::Status Validate() const
Validate certificate/key combinations before opening a socket.
Definition http2.cc:777
A parsed HTTP/2 request: pseudo-headers, fields, and body.
Definition http2.h:64
std::string body
Fully buffered body for an ordinary request.
Definition http2.h:71
std::shared_ptr< Http2RequestBodyStream > body_stream
Pull stream for an open extended CONNECT request, otherwise null.
Definition http2.h:73
std::string method
HTTP method pseudo-header.
Definition http2.h:65
std::string authority
Target authority/host.
Definition http2.h:68
std::string scheme
Request scheme pseudo-header.
Definition http2.h:67
std::string protocol
Extended CONNECT protocol, if present.
Definition http2.h:66
std::string path
Request path and query.
Definition http2.h:69
HttpHeaders headers
Normal application headers.
Definition http2.h:70
Status line and headers of an HTTP/2 response, without the body.
Definition http2.h:77
int status
Numeric HTTP response status.
Definition http2.h:78
HttpHeaders headers
Response headers, preserving repetitions.
Definition http2.h:79
A fully buffered HTTP/2 response: head plus complete body.
Definition http2.h:83
std::string body
Complete response body.
Definition http2.h:85
HttpResponseHead head
Status and headers.
Definition http2.h:84
const std::shared_ptr< rtc::PeerConnection > connection
Definition webrtc_wire_stream.cc:93
std::string path
Definition websocket_signalling.cc:42