// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/quic/web_transport_client.h" #include #include "base/memory/raw_ptr.h" #include "net/quic/dedicated_web_transport_http3_client.h" namespace net { namespace { // A WebTransport client that starts out in an error state. class FailedWebTransportClient : public WebTransportClient { public: explicit FailedWebTransportClient(int net_error, WebTransportClientVisitor* visitor) : error_(net_error, quic::QUIC_NO_ERROR, ErrorToString(net_error), /*safe_to_report_details=*/true), visitor_(visitor) {} void Connect() override { visitor_->OnConnectionFailed(error_); } void Close(const std::optional& close_info) override { NOTREACHED(); } quic::WebTransportSession* session() override { return nullptr; } private: WebTransportError error_; raw_ptr visitor_; }; } // namespace std::ostream& operator<<(std::ostream& os, WebTransportState state) { os << WebTransportStateString(state); return os; } const char* WebTransportStateString(WebTransportState state) { switch (state) { case WebTransportState::NEW: return "NEW"; case WebTransportState::CONNECTING: return "CONNECTING"; case WebTransportState::CONNECTED: return "CONNECTED"; case WebTransportState::CLOSED: return "CLOSED"; case WebTransportState::FAILED: return "FAILED"; case WebTransportState::NUM_STATES: return "UNKNOWN"; } } WebTransportCloseInfo::WebTransportCloseInfo() = default; WebTransportCloseInfo::WebTransportCloseInfo(uint32_t code, std::string_view reason) : code(code), reason(reason) {} WebTransportCloseInfo::~WebTransportCloseInfo() = default; bool WebTransportCloseInfo::operator==( const WebTransportCloseInfo& other) const { return code == other.code && reason == other.reason; } WebTransportClientVisitor::~WebTransportClientVisitor() = default; WebTransportParameters::WebTransportParameters() = default; WebTransportParameters::~WebTransportParameters() = default; WebTransportParameters::WebTransportParameters(const WebTransportParameters&) = default; WebTransportParameters::WebTransportParameters(WebTransportParameters&&) = default; std::unique_ptr CreateWebTransportClient( const GURL& url, const url::Origin& origin, WebTransportClientVisitor* visitor, const NetworkAnonymizationKey& anonymization_key, URLRequestContext* context, const WebTransportParameters& parameters) { if (url.scheme() == url::kHttpsScheme) { if (!parameters.enable_web_transport_http3) { return std::make_unique( ERR_DISALLOWED_URL_SCHEME, visitor); } return std::make_unique( url, origin, visitor, anonymization_key, context, parameters); } return std::make_unique(ERR_UNKNOWN_URL_SCHEME, visitor); } } // namespace net