1 // Copyright 2021 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/quic/web_transport_client.h"
6
7 #include <string_view>
8
9 #include "base/memory/raw_ptr.h"
10 #include "net/quic/dedicated_web_transport_http3_client.h"
11
12 namespace net {
13
14 namespace {
15 // A WebTransport client that starts out in an error state.
16 class FailedWebTransportClient : public WebTransportClient {
17 public:
FailedWebTransportClient(int net_error,WebTransportClientVisitor * visitor)18 explicit FailedWebTransportClient(int net_error,
19 WebTransportClientVisitor* visitor)
20 : error_(net_error,
21 quic::QUIC_NO_ERROR,
22 ErrorToString(net_error),
23 /*safe_to_report_details=*/true),
24 visitor_(visitor) {}
Connect()25 void Connect() override { visitor_->OnConnectionFailed(error_); }
Close(const std::optional<WebTransportCloseInfo> & close_info)26 void Close(const std::optional<WebTransportCloseInfo>& close_info) override {
27 NOTREACHED();
28 }
29
session()30 quic::WebTransportSession* session() override { return nullptr; }
31
32 private:
33 WebTransportError error_;
34 raw_ptr<WebTransportClientVisitor> visitor_;
35 };
36 } // namespace
37
operator <<(std::ostream & os,WebTransportState state)38 std::ostream& operator<<(std::ostream& os, WebTransportState state) {
39 os << WebTransportStateString(state);
40 return os;
41 }
42
WebTransportStateString(WebTransportState state)43 const char* WebTransportStateString(WebTransportState state) {
44 switch (state) {
45 case WebTransportState::NEW:
46 return "NEW";
47 case WebTransportState::CONNECTING:
48 return "CONNECTING";
49 case WebTransportState::CONNECTED:
50 return "CONNECTED";
51 case WebTransportState::CLOSED:
52 return "CLOSED";
53 case WebTransportState::FAILED:
54 return "FAILED";
55 case WebTransportState::NUM_STATES:
56 return "UNKNOWN";
57 }
58 }
59
60 WebTransportCloseInfo::WebTransportCloseInfo() = default;
WebTransportCloseInfo(uint32_t code,std::string_view reason)61 WebTransportCloseInfo::WebTransportCloseInfo(uint32_t code,
62 std::string_view reason)
63 : code(code), reason(reason) {}
64 WebTransportCloseInfo::~WebTransportCloseInfo() = default;
operator ==(const WebTransportCloseInfo & other) const65 bool WebTransportCloseInfo::operator==(
66 const WebTransportCloseInfo& other) const {
67 return code == other.code && reason == other.reason;
68 }
69
70 WebTransportClientVisitor::~WebTransportClientVisitor() = default;
71
72 WebTransportParameters::WebTransportParameters() = default;
73 WebTransportParameters::~WebTransportParameters() = default;
74 WebTransportParameters::WebTransportParameters(const WebTransportParameters&) =
75 default;
76 WebTransportParameters::WebTransportParameters(WebTransportParameters&&) =
77 default;
78
CreateWebTransportClient(const GURL & url,const url::Origin & origin,WebTransportClientVisitor * visitor,const NetworkAnonymizationKey & anonymization_key,URLRequestContext * context,const WebTransportParameters & parameters)79 std::unique_ptr<WebTransportClient> CreateWebTransportClient(
80 const GURL& url,
81 const url::Origin& origin,
82 WebTransportClientVisitor* visitor,
83 const NetworkAnonymizationKey& anonymization_key,
84 URLRequestContext* context,
85 const WebTransportParameters& parameters) {
86 if (url.scheme() == url::kHttpsScheme) {
87 if (!parameters.enable_web_transport_http3) {
88 return std::make_unique<FailedWebTransportClient>(
89 ERR_DISALLOWED_URL_SCHEME, visitor);
90 }
91 return std::make_unique<DedicatedWebTransportHttp3Client>(
92 url, origin, visitor, anonymization_key, context, parameters);
93 }
94
95 return std::make_unique<FailedWebTransportClient>(ERR_UNKNOWN_URL_SCHEME,
96 visitor);
97 }
98
99 } // namespace net
100