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_CREATE_HELPER_H_
6#define NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_STREAM_CREATE_HELPER_H_
7
8#include <string>
9#include <vector>
10
11#include "base/memory/scoped_ptr.h"
12#include "net/base/net_export.h"
13#include "net/websockets/websocket_handshake_stream_base.h"
14#include "net/websockets/websocket_stream.h"
15
16namespace net {
17
18class WebSocketBasicHandshakeStream;
19
20// Implementation of WebSocketHandshakeStreamBase::CreateHelper. This class is
21// used in the implementation of WebSocketStream::CreateAndConnectStream() and
22// is not intended to be used by itself.
23//
24// Holds the information needed to construct a
25// WebSocketBasicHandshakeStreamBase.
26class NET_EXPORT_PRIVATE WebSocketHandshakeStreamCreateHelper
27    : public WebSocketHandshakeStreamBase::CreateHelper {
28 public:
29  // |connect_delegate| must out-live this object.
30  explicit WebSocketHandshakeStreamCreateHelper(
31      WebSocketStream::ConnectDelegate* connect_delegate,
32      const std::vector<std::string>& requested_subprotocols);
33
34  virtual ~WebSocketHandshakeStreamCreateHelper();
35
36  // WebSocketHandshakeStreamBase::CreateHelper methods
37
38  // Create a WebSocketBasicHandshakeStream.
39  virtual WebSocketHandshakeStreamBase* CreateBasicStream(
40      scoped_ptr<ClientSocketHandle> connection,
41      bool using_proxy) OVERRIDE;
42
43  // Unimplemented as of November 2013.
44  virtual WebSocketHandshakeStreamBase* CreateSpdyStream(
45      const base::WeakPtr<SpdySession>& session,
46      bool use_relative_url) OVERRIDE;
47
48  // Call Upgrade() on the WebSocketHandshakeStream and return the result. This
49  // must only be called if the handshake succeeded.
50  scoped_ptr<WebSocketStream> Upgrade();
51
52  // Set a pointer to the std::string into which to write any failure messages
53  // that are encountered. This method must be called before CreateBasicStream()
54  // or CreateSpdyStream(). The |failure_message| pointer must remain valid as
55  // long as this object exists.
56  void set_failure_message(std::string* failure_message) {
57    failure_message_ = failure_message;
58  }
59
60 protected:
61  // This is used by DeterministicKeyWebSocketHandshakeStreamCreateHelper.
62  // The default implementation does nothing.
63  virtual void OnStreamCreated(WebSocketBasicHandshakeStream* stream);
64
65 private:
66  const std::vector<std::string> requested_subprotocols_;
67
68  // This is owned by the caller of CreateBaseStream() or
69  // CreateSpdyStream(). Both the stream and this object will be destroyed
70  // during the destruction of the URLRequest object associated with the
71  // handshake. This is only guaranteed to be a valid pointer if the handshake
72  // succeeded.
73  WebSocketHandshakeStreamBase* stream_;
74
75  WebSocketStream::ConnectDelegate* connect_delegate_;
76  std::string* failure_message_;
77
78  DISALLOW_COPY_AND_ASSIGN(WebSocketHandshakeStreamCreateHelper);
79};
80
81}  // namespace net
82
83#endif  // NET_WEBSOCKETS_WEBSOCKET_HANDSHAKE_STREAM_CREATE_HELPER_H_
84