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