1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_STREAM_BASE_H_ 6 #define NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_STREAM_BASE_H_ 7 8 // This file is included from net/http files. 9 // Since net/http can be built without linking net/websockets code, 10 // this file must not introduce any link-time dependencies on websockets. 11 12 #include <string> 13 14 #include "base/basictypes.h" 15 #include "base/memory/scoped_ptr.h" 16 #include "base/memory/weak_ptr.h" 17 #include "base/supports_user_data.h" 18 #include "net/http/http_stream_base.h" 19 #include "net/url_request/websocket_handshake_userdata_key.h" 20 #include "net/websockets/websocket_stream.h" 21 22 namespace net { 23 24 class ClientSocketHandle; 25 class SpdySession; 26 27 // WebSocketHandshakeStreamBase is the base class of 28 // WebSocketBasicHandshakeStream. net/http code uses this interface to handle 29 // WebSocketBasicHandshakeStream when it needs to be treated differently from 30 // HttpStreamBase. 31 class NET_EXPORT WebSocketHandshakeStreamBase : public HttpStreamBase { 32 public: 33 // An object that stores data needed for the creation of a 34 // WebSocketBasicHandshakeStream object. A new CreateHelper is used for each 35 // WebSocket connection. 36 class NET_EXPORT_PRIVATE CreateHelper : public base::SupportsUserData::Data { 37 public: 38 // Returns a key to use to lookup this object in a URLRequest object. It is 39 // different from any other key that is supplied to 40 // URLRequest::SetUserData(). 41 static const void* DataKey() { return kWebSocketHandshakeUserDataKey; } 42 43 virtual ~CreateHelper() {} 44 45 // Create a WebSocketBasicHandshakeStream. This is called after the 46 // underlying connection has been established but before any handshake data 47 // has been transferred. This can be called more than once in the case that 48 // HTTP authentication is needed. 49 virtual WebSocketHandshakeStreamBase* CreateBasicStream( 50 scoped_ptr<ClientSocketHandle> connection, 51 bool using_proxy) = 0; 52 53 // Create a WebSocketSpdyHandshakeStream (unimplemented as of October 2013) 54 virtual WebSocketHandshakeStreamBase* CreateSpdyStream( 55 const base::WeakPtr<SpdySession>& session, 56 bool use_relative_url) = 0; 57 }; 58 59 // This has to have an inline implementation so that the net/url_request/ 60 // tests do not fail on iOS. 61 virtual ~WebSocketHandshakeStreamBase() {} 62 63 // After the handshake has completed, this method creates a WebSocketStream 64 // (of the appropriate type) from the WebSocketHandshakeStreamBase object. 65 // The WebSocketHandshakeStreamBase object is unusable after Upgrade() has 66 // been called. 67 virtual scoped_ptr<WebSocketStream> Upgrade() = 0; 68 69 protected: 70 // As with the destructor, this must be inline. 71 WebSocketHandshakeStreamBase() {} 72 73 private: 74 DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeStreamBase); 75 }; 76 77 } // namespace net 78 79 #endif // NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_STREAM_BASE_H_ 80