Home | History | Annotate | Download | only in websockets
      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