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