| // Copyright 2023 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef QUICHE_WEB_TRANSPORT_WEB_TRANSPORT_HEADERS_H_ | |
| #define QUICHE_WEB_TRANSPORT_WEB_TRANSPORT_HEADERS_H_ | |
| #include <cstdint> | |
| #include <string> | |
| #include <vector> | |
| #include "absl/status/statusor.h" | |
| #include "absl/strings/string_view.h" | |
| #include "absl/types/span.h" | |
| #include "quiche/common/platform/api/quiche_export.h" | |
| namespace webtransport { | |
| inline constexpr absl::string_view kSubprotocolRequestHeader = | |
| "wt-available-protocols"; | |
| inline constexpr absl::string_view kSubprotocolResponseHeader = "wt-protocol"; | |
| QUICHE_EXPORT absl::StatusOr<std::vector<std::string>> | |
| ParseSubprotocolRequestHeader(absl::string_view value); | |
| QUICHE_EXPORT absl::StatusOr<std::string> SerializeSubprotocolRequestHeader( | |
| absl::Span<const std::string> subprotocols); | |
| QUICHE_EXPORT absl::StatusOr<std::string> ParseSubprotocolResponseHeader( | |
| absl::string_view value); | |
| QUICHE_EXPORT absl::StatusOr<std::string> SerializeSubprotocolResponseHeader( | |
| absl::string_view subprotocol); | |
| QUICHE_EXPORT bool ValidateSubprotocolName(absl::string_view name); | |
| QUICHE_EXPORT bool ValidateSubprotocolList( | |
| absl::Span<const absl::string_view> list); | |
| QUICHE_EXPORT bool ValidateSubprotocolList(absl::Span<const std::string> list); | |
| inline constexpr absl::string_view kInitHeader = "WebTransport-Init"; | |
| // A deserialized representation of WebTransport-Init header that is used to | |
| // indicate the initial stream flow control windows in WebTransport over HTTP/2. | |
| // Specification: | |
| // https://www.ietf.org/archive/id/draft-ietf-webtrans-http2-07.html#name-flow-control-header-field | |
| struct QUICHE_EXPORT WebTransportInitHeader { | |
| // Initial flow control window for unidirectional streams opened by the | |
| // header's recipient. | |
| uint64_t initial_unidi_limit = 0; | |
| // Initial flow control window for bidirectional streams opened by the | |
| // header's recipient. | |
| uint64_t initial_incoming_bidi_limit = 0; | |
| // Initial flow control window for bidirectional streams opened by the | |
| // header's sender. | |
| uint64_t initial_outgoing_bidi_limit = 0; | |
| bool operator==(const WebTransportInitHeader& other) const { | |
| return initial_unidi_limit == other.initial_unidi_limit && | |
| initial_incoming_bidi_limit == other.initial_incoming_bidi_limit && | |
| initial_outgoing_bidi_limit == other.initial_outgoing_bidi_limit; | |
| } | |
| }; | |
| QUICHE_EXPORT absl::StatusOr<WebTransportInitHeader> ParseInitHeader( | |
| absl::string_view header); | |
| QUICHE_EXPORT absl::StatusOr<std::string> SerializeInitHeader( | |
| const WebTransportInitHeader& header); | |
| } // namespace webtransport | |
| #endif // QUICHE_WEB_TRANSPORT_WEB_TRANSPORT_HEADERS_H_ |