blob: 91cbfa19a26bdb335f1af1d6925f04eefdcd6c60 [file] [log] [blame]
// 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 <string_view>
#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<WebTransportCloseInfo>& close_info) override {
NOTREACHED();
}
quic::WebTransportSession* session() override { return nullptr; }
private:
WebTransportError error_;
raw_ptr<WebTransportClientVisitor> 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<WebTransportClient> 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<FailedWebTransportClient>(
ERR_DISALLOWED_URL_SCHEME, visitor);
}
return std::make_unique<DedicatedWebTransportHttp3Client>(
url, origin, visitor, anonymization_key, context, parameters);
}
return std::make_unique<FailedWebTransportClient>(ERR_UNKNOWN_URL_SCHEME,
visitor);
}
} // namespace net