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