blob: 6cf16ee601cce3ecadf8b0e9c320c64c34fb654c [file] [log] [blame]
// 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 =
"WebTransport-Subprotocols-Available";
inline constexpr absl::string_view kSubprotocolResponseHeader =
"WebTransport-Subprotocol";
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);
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_