| // Copyright 2017 The Cobalt Authors. All Rights Reserved. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #ifndef COBALT_WEBSOCKET_COBALT_WEB_SOCKET_EVENT_HANDLER_H_ | |
| #define COBALT_WEBSOCKET_COBALT_WEB_SOCKET_EVENT_HANDLER_H_ | |
| #include <string> | |
| #include <utility> | |
| #include <vector> | |
| #include "base/basictypes.h" | |
| #include "cobalt/websocket/web_socket_frame_container.h" | |
| #include "cobalt/websocket/web_socket_handshake_helper.h" | |
| #include "net/base/io_buffer.h" | |
| #include "net/websockets/websocket_event_interface.h" | |
| #include "net/websockets/websocket_frame_parser.h" | |
| namespace cobalt { | |
| namespace websocket { | |
| class WebSocketImpl; | |
| // This is the event interface that net takes to process all the events that | |
| // happen during websocket connections. | |
| // The lifetime of a connection process sometimes is shorter than the websocket | |
| // so it has to be another class different from WebSocketChannel's creator | |
| // which is our WebSocketImpl. | |
| class CobaltWebSocketEventHandler : public net::WebSocketEventInterface { | |
| public: | |
| explicit CobaltWebSocketEventHandler(WebSocketImpl* creator) | |
| : creator_(creator) { | |
| DCHECK(creator); | |
| } | |
| // Called when a URLRequest is created for handshaking. | |
| void OnCreateURLRequest(net::URLRequest* request) override {} | |
| // Called in response to an AddChannelRequest. This means that a response has | |
| // been received from the remote server. | |
| void OnAddChannelResponse(const std::string& selected_subprotocol, | |
| const std::string& extensions) override; | |
| // Called when a data frame has been received from the remote host and needs | |
| // to be forwarded to the renderer process. | |
| void OnDataFrame(bool fin, WebSocketMessageType type, | |
| scoped_refptr<net::IOBuffer> buffer, | |
| size_t buffer_size) override; | |
| // Called to provide more send quota for this channel to the renderer | |
| // process. Currently the quota units are always bytes of message body | |
| // data. In future it might depend on the type of multiplexing in use. | |
| void OnFlowControl(int64_t quota) override; | |
| // 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. | |
| void OnClosingHandshake() override; | |
| // 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 preceded 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 WebSocketMessageType 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. | |
| void OnDropChannel(bool was_clean, uint16_t code, | |
| const std::string& reason) override; | |
| // Called when the browser fails the channel, as specified in the spec. | |
| // | |
| // The channel should not be used again after OnFailChannel() has been | |
| // called. | |
| // | |
| // This function deletes the Channel. | |
| void OnFailChannel(const std::string& message) override; | |
| // Called when the browser starts the WebSocket Opening Handshake. | |
| void OnStartOpeningHandshake( | |
| std::unique_ptr<net::WebSocketHandshakeRequestInfo> request) override {} | |
| // Called when the browser finishes the WebSocket Opening Handshake. | |
| void OnFinishOpeningHandshake( | |
| std::unique_ptr<net::WebSocketHandshakeResponseInfo> response) override {} | |
| // 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. | |
| void OnSSLCertificateError( | |
| std::unique_ptr<net::WebSocketEventInterface::SSLErrorCallbacks> | |
| ssl_error_callbacks, | |
| const GURL& url, const net::SSLInfo& ssl_info, bool fatal) override; | |
| // 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. | |
| int OnAuthRequired( | |
| scoped_refptr<net::AuthChallengeInfo> auth_info, | |
| scoped_refptr<net::HttpResponseHeaders> response_headers, | |
| const net::HostPortPair& host_port_pair, | |
| base::OnceCallback<void(const net::AuthCredentials*)> callback, | |
| base::Optional<net::AuthCredentials>* credentials) override; | |
| // Called when a write completes, and |bytes_written| indicates how many bytes | |
| // were written. | |
| void OnWriteDone(uint64_t bytes_written) override; | |
| protected: | |
| CobaltWebSocketEventHandler() {} | |
| private: | |
| // For now, we forward most event to the impl to handle. We might want to | |
| // move more thing | |
| WebSocketImpl* creator_; | |
| // This vector should store data of data frames from the same message. | |
| typedef std::vector<std::pair<scoped_refptr<net::IOBuffer>, size_t>> | |
| FrameDataVector; | |
| FrameDataVector frame_data_; | |
| WebSocketMessageType message_type_ = | |
| net::WebSocketFrameHeader::kOpCodeControlUnused; | |
| DISALLOW_COPY_AND_ASSIGN(CobaltWebSocketEventHandler); | |
| }; | |
| } // namespace websocket | |
| } // namespace cobalt | |
| #endif // COBALT_WEBSOCKET_COBALT_WEB_SOCKET_EVENT_HANDLER_H_ |