1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file.
4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/websockets/websocket_handshake_stream_create_helper.h"
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/logging.h"
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/weak_ptr.h"
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/socket/client_socket_handle.h"
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/spdy/spdy_session.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/websockets/websocket_basic_handshake_stream.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace net {
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebSocketHandshakeStreamCreateHelper::WebSocketHandshakeStreamCreateHelper(
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebSocketStream::ConnectDelegate* connect_delegate,
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::vector<std::string>& requested_subprotocols)
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : requested_subprotocols_(requested_subprotocols),
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      stream_(NULL),
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      connect_delegate_(connect_delegate),
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      failure_message_(NULL) {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(connect_delegate_);
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebSocketHandshakeStreamCreateHelper::~WebSocketHandshakeStreamCreateHelper() {}
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebSocketHandshakeStreamBase*
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebSocketHandshakeStreamCreateHelper::CreateBasicStream(
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    scoped_ptr<ClientSocketHandle> connection,
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool using_proxy) {
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(failure_message_) << "set_failure_message() must be called";
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The list of supported extensions and parameters is hard-coded.
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(ricea): If more extensions are added, consider a more flexible
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // method.
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<std::string> extensions(
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      1, "permessage-deflate; client_max_window_bits");
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebSocketBasicHandshakeStream* stream =
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new WebSocketBasicHandshakeStream(connection.Pass(),
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        connect_delegate_,
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                        using_proxy,
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                        requested_subprotocols_,
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        extensions,
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                        failure_message_);
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OnStreamCreated(stream);
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  stream_ = stream;
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return stream;
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// TODO(ricea): Create a WebSocketSpdyHandshakeStream. crbug.com/323852
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebSocketHandshakeStreamBase*
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WebSocketHandshakeStreamCreateHelper::CreateSpdyStream(
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::WeakPtr<SpdySession>& session,
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool use_relative_url) {
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NOTREACHED() << "Not implemented";
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return NULL;
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<WebSocketStream> WebSocketHandshakeStreamCreateHelper::Upgrade() {
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(stream_);
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebSocketHandshakeStreamBase* stream = stream_;
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  stream_ = NULL;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return stream->Upgrade();
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebSocketHandshakeStreamCreateHelper::OnStreamCreated(
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WebSocketBasicHandshakeStream* stream) {
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace net
71