xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/web_transport/web_transport_headers.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2023 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef QUICHE_WEB_TRANSPORT_WEB_TRANSPORT_HEADERS_H_
6 #define QUICHE_WEB_TRANSPORT_WEB_TRANSPORT_HEADERS_H_
7 
8 #include <cstdint>
9 #include <string>
10 #include <vector>
11 
12 #include "absl/status/statusor.h"
13 #include "absl/strings/string_view.h"
14 #include "absl/types/span.h"
15 #include "quiche/common/platform/api/quiche_export.h"
16 
17 namespace webtransport {
18 
19 inline constexpr absl::string_view kSubprotocolRequestHeader =
20     "WebTransport-Subprotocols-Available";
21 inline constexpr absl::string_view kSubprotocolResponseHeader =
22     "WebTransport-Subprotocol";
23 
24 QUICHE_EXPORT absl::StatusOr<std::vector<std::string>>
25 ParseSubprotocolRequestHeader(absl::string_view value);
26 QUICHE_EXPORT absl::StatusOr<std::string> SerializeSubprotocolRequestHeader(
27     absl::Span<const std::string> subprotocols);
28 QUICHE_EXPORT absl::StatusOr<std::string> ParseSubprotocolResponseHeader(
29     absl::string_view value);
30 QUICHE_EXPORT absl::StatusOr<std::string> SerializeSubprotocolResponseHeader(
31     absl::string_view subprotocol);
32 
33 inline constexpr absl::string_view kInitHeader = "WebTransport-Init";
34 
35 // A deserialized representation of WebTransport-Init header that is used to
36 // indicate the initial stream flow control windows in WebTransport over HTTP/2.
37 // Specification:
38 // https://www.ietf.org/archive/id/draft-ietf-webtrans-http2-07.html#name-flow-control-header-field
39 struct QUICHE_EXPORT WebTransportInitHeader {
40   // Initial flow control window for unidirectional streams opened by the
41   // header's recipient.
42   uint64_t initial_unidi_limit = 0;
43   // Initial flow control window for bidirectional streams opened by the
44   // header's recipient.
45   uint64_t initial_incoming_bidi_limit = 0;
46   // Initial flow control window for bidirectional streams opened by the
47   // header's sender.
48   uint64_t initial_outgoing_bidi_limit = 0;
49 
50   bool operator==(const WebTransportInitHeader& other) const {
51     return initial_unidi_limit == other.initial_unidi_limit &&
52            initial_incoming_bidi_limit == other.initial_incoming_bidi_limit &&
53            initial_outgoing_bidi_limit == other.initial_outgoing_bidi_limit;
54   }
55 };
56 
57 QUICHE_EXPORT absl::StatusOr<WebTransportInitHeader> ParseInitHeader(
58     absl::string_view header);
59 QUICHE_EXPORT absl::StatusOr<std::string> SerializeInitHeader(
60     const WebTransportInitHeader& header);
61 
62 }  // namespace webtransport
63 
64 #endif  // QUICHE_WEB_TRANSPORT_WEB_TRANSPORT_HEADERS_H_
65