xref: /aosp_15_r20/external/cronet/net/quic/web_transport_client.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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