15#ifndef A11_NET_HTTP2_H_
16#define A11_NET_HTTP2_H_
28#include <absl/base/nullability.h>
29#include <absl/status/status.h>
30#include <absl/status/statusor.h>
31#include <absl/time/time.h>
37class Http2RequestBodyStream;
45using HttpHeaders = std::vector<std::pair<std::string, std::string>>;
51 std::string_view name);
126 :
public std::enable_shared_from_this<Http2RequestBodyStream> {
134 absl::Status
Cancel(absl::Status status = absl::CancelledError(
135 "HTTP/2 request body cancelled"));
143 : state_(std::move(state)) {}
145 std::shared_ptr<State> state_;
158 :
public std::enable_shared_from_this<Http2ResponseStream> {
169 absl::Status status = absl::CancelledError(
"HTTP/2 request cancelled"));
177 : state_(std::move(state)) {}
179 std::shared_ptr<State> state_;
193 :
public std::enable_shared_from_this<Http2DuplexStream> {
201 absl::Status
Write(std::string data);
205 absl::Status
Abort(absl::Status status = absl::CancelledError(
206 "HTTP/2 duplex stream cancelled"));
214 std::shared_ptr<Http2ResponseStream> response)
215 : connection_(std::move(
connection)), response_(std::move(response)) {}
217 std::weak_ptr<Http2Connection> connection_;
218 std::shared_ptr<Http2ResponseStream> response_;
232 :
public std::enable_shared_from_this<Http2ResponseWriter> {
237 absl::Status
Write(std::string data);
242 std::string body = {});
244 absl::Status
Abort(absl::Status status);
260 std::int32_t
stream_id, std::shared_ptr<State> state)
263 state_(std::
move(state)) {}
265 std::weak_ptr<Http2Connection> connection_;
266 std::int32_t stream_id_;
267 std::shared_ptr<State> state_;
274 HttpRequest request, std::shared_ptr<Http2ResponseWriter> response)>;
282class Http2Server :
public std::enable_shared_from_this<Http2Server> {
293 static absl::StatusOr<std::shared_ptr<Http2Server>>
Create(
316 : state_(std::move(state)) {}
318 std::shared_ptr<State> state_;
328class Http2Client :
public std::enable_shared_from_this<Http2Client> {
344 absl::StatusOr<std::shared_ptr<Http2ResponseStream>>
RequestStream(
346 std::string body = {}, std::string
scheme = {});
354 std::string body = {},
357 absl::Status
Close();
372 static constexpr size_t kImplSize = 272;
373 static constexpr size_t kImplAlignment =
alignof(std::max_align_t);
381 alignas(kImplAlignment) std::byte impl_[kImplSize];
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
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
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
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
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