xref: /aosp_15_r20/external/cronet/net/websockets/websocket_event_interface.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_WEBSOCKETS_WEBSOCKET_EVENT_INTERFACE_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_WEBSOCKETS_WEBSOCKET_EVENT_INTERFACE_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <memory>
11*6777b538SAndroid Build Coastguard Worker #include <optional>
12*6777b538SAndroid Build Coastguard Worker #include <string>
13*6777b538SAndroid Build Coastguard Worker #include <vector>
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker class GURL;
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker namespace net {
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker class AuthChallengeInfo;
25*6777b538SAndroid Build Coastguard Worker class AuthCredentials;
26*6777b538SAndroid Build Coastguard Worker class IPEndPoint;
27*6777b538SAndroid Build Coastguard Worker class HttpResponseHeaders;
28*6777b538SAndroid Build Coastguard Worker class SSLInfo;
29*6777b538SAndroid Build Coastguard Worker class URLRequest;
30*6777b538SAndroid Build Coastguard Worker struct TransportInfo;
31*6777b538SAndroid Build Coastguard Worker struct WebSocketHandshakeRequestInfo;
32*6777b538SAndroid Build Coastguard Worker struct WebSocketHandshakeResponseInfo;
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker // Interface for events sent from the network layer to the content layer. These
35*6777b538SAndroid Build Coastguard Worker // events will generally be sent as-is to the renderer process.
36*6777b538SAndroid Build Coastguard Worker class NET_EXPORT WebSocketEventInterface {
37*6777b538SAndroid Build Coastguard Worker  public:
38*6777b538SAndroid Build Coastguard Worker   typedef int WebSocketMessageType;
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker   WebSocketEventInterface(const WebSocketEventInterface&) = delete;
41*6777b538SAndroid Build Coastguard Worker   WebSocketEventInterface& operator=(const WebSocketEventInterface&) = delete;
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker   virtual ~WebSocketEventInterface() = default;
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   // Called when a URLRequest is created for handshaking.
46*6777b538SAndroid Build Coastguard Worker   virtual void OnCreateURLRequest(URLRequest* request) = 0;
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   // Called when OnConnected is called on the URLRequest for handshaking.
49*6777b538SAndroid Build Coastguard Worker   virtual void OnURLRequestConnected(URLRequest* request,
50*6777b538SAndroid Build Coastguard Worker                                      const TransportInfo& info) = 0;
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker   // Called in response to an AddChannelRequest. This means that a response has
53*6777b538SAndroid Build Coastguard Worker   // been received from the remote server.
54*6777b538SAndroid Build Coastguard Worker   virtual void OnAddChannelResponse(
55*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<WebSocketHandshakeResponseInfo> response,
56*6777b538SAndroid Build Coastguard Worker       const std::string& selected_subprotocol,
57*6777b538SAndroid Build Coastguard Worker       const std::string& extensions) = 0;
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   // Called when a data frame has been received from the remote host and needs
60*6777b538SAndroid Build Coastguard Worker   // to be forwarded to the renderer process.
61*6777b538SAndroid Build Coastguard Worker   // |payload| stays valid as long as both
62*6777b538SAndroid Build Coastguard Worker   // - the associated WebSocketChannel is valid.
63*6777b538SAndroid Build Coastguard Worker   // - no further ReadFrames() is called on the associated WebSocketChannel.
64*6777b538SAndroid Build Coastguard Worker   virtual void OnDataFrame(bool fin,
65*6777b538SAndroid Build Coastguard Worker                            WebSocketMessageType type,
66*6777b538SAndroid Build Coastguard Worker                            base::span<const char> payload) = 0;
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker   // Returns true if data pipe is full and waiting the renderer process read
69*6777b538SAndroid Build Coastguard Worker   // out. The network service should not read more from network until that.
70*6777b538SAndroid Build Coastguard Worker   virtual bool HasPendingDataFrames() = 0;
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   // Called once for each call to SendFrame() once the frame has been passed to
73*6777b538SAndroid Build Coastguard Worker   // the OS.
74*6777b538SAndroid Build Coastguard Worker   virtual void OnSendDataFrameDone() = 0;
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker   // Called when the remote server has Started the WebSocket Closing
77*6777b538SAndroid Build Coastguard Worker   // Handshake. The client should not attempt to send any more messages after
78*6777b538SAndroid Build Coastguard Worker   // receiving this message. It will be followed by OnDropChannel() when the
79*6777b538SAndroid Build Coastguard Worker   // closing handshake is complete.
80*6777b538SAndroid Build Coastguard Worker   virtual void OnClosingHandshake() = 0;
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker   // Called when the channel has been dropped, either due to a network close, a
83*6777b538SAndroid Build Coastguard Worker   // network error, or a protocol error. This may or may not be preceeded by a
84*6777b538SAndroid Build Coastguard Worker   // call to OnClosingHandshake().
85*6777b538SAndroid Build Coastguard Worker   //
86*6777b538SAndroid Build Coastguard Worker   // Warning: Both the |code| and |reason| are passed through to Javascript, so
87*6777b538SAndroid Build Coastguard Worker   // callers must take care not to provide details that could be useful to
88*6777b538SAndroid Build Coastguard Worker   // attackers attempting to use WebSockets to probe networks.
89*6777b538SAndroid Build Coastguard Worker   //
90*6777b538SAndroid Build Coastguard Worker   // |was_clean| should be true if the closing handshake completed successfully.
91*6777b538SAndroid Build Coastguard Worker   //
92*6777b538SAndroid Build Coastguard Worker   // The channel should not be used again after OnDropChannel() has been
93*6777b538SAndroid Build Coastguard Worker   // called.
94*6777b538SAndroid Build Coastguard Worker   //
95*6777b538SAndroid Build Coastguard Worker   // This function deletes the Channel.
96*6777b538SAndroid Build Coastguard Worker   virtual void OnDropChannel(bool was_clean,
97*6777b538SAndroid Build Coastguard Worker                              uint16_t code,
98*6777b538SAndroid Build Coastguard Worker                              const std::string& reason) = 0;
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker   // Called when the browser fails the channel, as specified in the spec.
101*6777b538SAndroid Build Coastguard Worker   //
102*6777b538SAndroid Build Coastguard Worker   // The channel should not be used again after OnFailChannel() has been
103*6777b538SAndroid Build Coastguard Worker   // called.
104*6777b538SAndroid Build Coastguard Worker   //
105*6777b538SAndroid Build Coastguard Worker   // |message| is a human readable string describing the failure. (It may be
106*6777b538SAndroid Build Coastguard Worker   // empty.) |net_error| contains the network error code for the failure, which
107*6777b538SAndroid Build Coastguard Worker   // may be |OK| if the failure was at a higher level. |response_code| contains
108*6777b538SAndroid Build Coastguard Worker   // the HTTP status code that caused the failure, or |std::nullopt| if the
109*6777b538SAndroid Build Coastguard Worker   // attempt didn't get that far.
110*6777b538SAndroid Build Coastguard Worker   //
111*6777b538SAndroid Build Coastguard Worker   // This function deletes the Channel.
112*6777b538SAndroid Build Coastguard Worker   virtual void OnFailChannel(const std::string& message,
113*6777b538SAndroid Build Coastguard Worker                              int net_error,
114*6777b538SAndroid Build Coastguard Worker                              std::optional<int> response_code) = 0;
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker   // Called when the browser starts the WebSocket Opening Handshake.
117*6777b538SAndroid Build Coastguard Worker   virtual void OnStartOpeningHandshake(
118*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<WebSocketHandshakeRequestInfo> request) = 0;
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker   // Callbacks to be used in response to a call to OnSSLCertificateError. Very
121*6777b538SAndroid Build Coastguard Worker   // similar to content::SSLErrorHandler::Delegate (which we can't use directly
122*6777b538SAndroid Build Coastguard Worker   // due to layering constraints).
123*6777b538SAndroid Build Coastguard Worker   class NET_EXPORT SSLErrorCallbacks {
124*6777b538SAndroid Build Coastguard Worker    public:
125*6777b538SAndroid Build Coastguard Worker     virtual ~SSLErrorCallbacks() = default;
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker     // Cancels the SSL response in response to the error.
128*6777b538SAndroid Build Coastguard Worker     virtual void CancelSSLRequest(int error, const SSLInfo* ssl_info) = 0;
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker     // Continue with the SSL connection despite the error.
131*6777b538SAndroid Build Coastguard Worker     virtual void ContinueSSLRequest() = 0;
132*6777b538SAndroid Build Coastguard Worker   };
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker   // Called on SSL Certificate Error during the SSL handshake. Should result in
135*6777b538SAndroid Build Coastguard Worker   // a call to either ssl_error_callbacks->ContinueSSLRequest() or
136*6777b538SAndroid Build Coastguard Worker   // ssl_error_callbacks->CancelSSLRequest(). Normally the implementation of
137*6777b538SAndroid Build Coastguard Worker   // this method will delegate to content::SSLManager::OnSSLCertificateError to
138*6777b538SAndroid Build Coastguard Worker   // make the actual decision. The callbacks must not be called after the
139*6777b538SAndroid Build Coastguard Worker   // WebSocketChannel has been destroyed.
140*6777b538SAndroid Build Coastguard Worker   virtual void OnSSLCertificateError(
141*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<SSLErrorCallbacks> ssl_error_callbacks,
142*6777b538SAndroid Build Coastguard Worker       const GURL& url,
143*6777b538SAndroid Build Coastguard Worker       int net_error,
144*6777b538SAndroid Build Coastguard Worker       const SSLInfo& ssl_info,
145*6777b538SAndroid Build Coastguard Worker       bool fatal) = 0;
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker   // Called when authentication is required. Returns a net error. The opening
148*6777b538SAndroid Build Coastguard Worker   // handshake is blocked when this function returns ERR_IO_PENDING.
149*6777b538SAndroid Build Coastguard Worker   // In that case calling |callback| resumes the handshake. |callback| can be
150*6777b538SAndroid Build Coastguard Worker   // called during the opening handshake. An implementation can rewrite
151*6777b538SAndroid Build Coastguard Worker   // |*credentials| (in the sync case) or provide new credentials (in the
152*6777b538SAndroid Build Coastguard Worker   // async case).
153*6777b538SAndroid Build Coastguard Worker   // Providing null credentials (nullopt in the sync case and nullptr in the
154*6777b538SAndroid Build Coastguard Worker   // async case) cancels authentication. Otherwise the new credentials are set
155*6777b538SAndroid Build Coastguard Worker   // and the opening handshake will be retried with the credentials.
156*6777b538SAndroid Build Coastguard Worker   virtual int OnAuthRequired(
157*6777b538SAndroid Build Coastguard Worker       const AuthChallengeInfo& auth_info,
158*6777b538SAndroid Build Coastguard Worker       scoped_refptr<HttpResponseHeaders> response_headers,
159*6777b538SAndroid Build Coastguard Worker       const IPEndPoint& socket_address,
160*6777b538SAndroid Build Coastguard Worker       base::OnceCallback<void(const AuthCredentials*)> callback,
161*6777b538SAndroid Build Coastguard Worker       std::optional<AuthCredentials>* credentials) = 0;
162*6777b538SAndroid Build Coastguard Worker 
163*6777b538SAndroid Build Coastguard Worker  protected:
164*6777b538SAndroid Build Coastguard Worker   WebSocketEventInterface() = default;
165*6777b538SAndroid Build Coastguard Worker };
166*6777b538SAndroid Build Coastguard Worker 
167*6777b538SAndroid Build Coastguard Worker }  // namespace net
168*6777b538SAndroid Build Coastguard Worker 
169*6777b538SAndroid Build Coastguard Worker #endif  // NET_WEBSOCKETS_WEBSOCKET_EVENT_INTERFACE_H_
170