// Copyright 2013 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_WEBSOCKETS_WEBSOCKET_EVENT_INTERFACE_H_ #define NET_WEBSOCKETS_WEBSOCKET_EVENT_INTERFACE_H_ #include #include #include #include #include #include "base/containers/span.h" #include "base/functional/callback_forward.h" #include "base/memory/scoped_refptr.h" #include "net/base/net_export.h" class GURL; namespace net { class AuthChallengeInfo; class AuthCredentials; class IPEndPoint; class HttpResponseHeaders; class SSLInfo; class URLRequest; struct TransportInfo; struct WebSocketHandshakeRequestInfo; struct WebSocketHandshakeResponseInfo; // Interface for events sent from the network layer to the content layer. These // events will generally be sent as-is to the renderer process. class NET_EXPORT WebSocketEventInterface { public: typedef int WebSocketMessageType; WebSocketEventInterface(const WebSocketEventInterface&) = delete; WebSocketEventInterface& operator=(const WebSocketEventInterface&) = delete; virtual ~WebSocketEventInterface() = default; // Called when a URLRequest is created for handshaking. virtual void OnCreateURLRequest(URLRequest* request) = 0; // Called when OnConnected is called on the URLRequest for handshaking. virtual void OnURLRequestConnected(URLRequest* request, const TransportInfo& info) = 0; // Called in response to an AddChannelRequest. This means that a response has // been received from the remote server. virtual void OnAddChannelResponse( std::unique_ptr response, const std::string& selected_subprotocol, const std::string& extensions) = 0; // Called when a data frame has been received from the remote host and needs // to be forwarded to the renderer process. // |payload| stays valid as long as both // - the associated WebSocketChannel is valid. // - no further ReadFrames() is called on the associated WebSocketChannel. virtual void OnDataFrame(bool fin, WebSocketMessageType type, base::span payload) = 0; // Returns true if data pipe is full and waiting the renderer process read // out. The network service should not read more from network until that. virtual bool HasPendingDataFrames() = 0; // Called once for each call to SendFrame() once the frame has been passed to // the OS. virtual void OnSendDataFrameDone() = 0; // Called when the remote server has Started the WebSocket Closing // Handshake. The client should not attempt to send any more messages after // receiving this message. It will be followed by OnDropChannel() when the // closing handshake is complete. virtual void OnClosingHandshake() = 0; // Called when the channel has been dropped, either due to a network close, a // network error, or a protocol error. This may or may not be preceeded by a // call to OnClosingHandshake(). // // Warning: Both the |code| and |reason| are passed through to Javascript, so // callers must take care not to provide details that could be useful to // attackers attempting to use WebSockets to probe networks. // // |was_clean| should be true if the closing handshake completed successfully. // // The channel should not be used again after OnDropChannel() has been // called. // // This function deletes the Channel. virtual void OnDropChannel(bool was_clean, uint16_t code, const std::string& reason) = 0; // Called when the browser fails the channel, as specified in the spec. // // The channel should not be used again after OnFailChannel() has been // called. // // |message| is a human readable string describing the failure. (It may be // empty.) |net_error| contains the network error code for the failure, which // may be |OK| if the failure was at a higher level. |response_code| contains // the HTTP status code that caused the failure, or |std::nullopt| if the // attempt didn't get that far. // // This function deletes the Channel. virtual void OnFailChannel(const std::string& message, int net_error, std::optional response_code) = 0; // Called when the browser starts the WebSocket Opening Handshake. virtual void OnStartOpeningHandshake( std::unique_ptr request) = 0; // Callbacks to be used in response to a call to OnSSLCertificateError. Very // similar to content::SSLErrorHandler::Delegate (which we can't use directly // due to layering constraints). class NET_EXPORT SSLErrorCallbacks { public: virtual ~SSLErrorCallbacks() = default; // Cancels the SSL response in response to the error. virtual void CancelSSLRequest(int error, const SSLInfo* ssl_info) = 0; // Continue with the SSL connection despite the error. virtual void ContinueSSLRequest() = 0; }; // Called on SSL Certificate Error during the SSL handshake. Should result in // a call to either ssl_error_callbacks->ContinueSSLRequest() or // ssl_error_callbacks->CancelSSLRequest(). Normally the implementation of // this method will delegate to content::SSLManager::OnSSLCertificateError to // make the actual decision. The callbacks must not be called after the // WebSocketChannel has been destroyed. virtual void OnSSLCertificateError( std::unique_ptr ssl_error_callbacks, const GURL& url, int net_error, const SSLInfo& ssl_info, bool fatal) = 0; // Called when authentication is required. Returns a net error. The opening // handshake is blocked when this function returns ERR_IO_PENDING. // In that case calling |callback| resumes the handshake. |callback| can be // called during the opening handshake. An implementation can rewrite // |*credentials| (in the sync case) or provide new credentials (in the // async case). // Providing null credentials (nullopt in the sync case and nullptr in the // async case) cancels authentication. Otherwise the new credentials are set // and the opening handshake will be retried with the credentials. virtual int OnAuthRequired( const AuthChallengeInfo& auth_info, scoped_refptr response_headers, const IPEndPoint& socket_address, base::OnceCallback callback, std::optional* credentials) = 0; protected: WebSocketEventInterface() = default; }; } // namespace net #endif // NET_WEBSOCKETS_WEBSOCKET_EVENT_INTERFACE_H_