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