1 // Copyright 2013 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/websockets/websocket_handshake_stream_create_helper.h"
6
7 #include <set>
8 #include <utility>
9
10 #include "base/check.h"
11 #include "base/memory/weak_ptr.h"
12 #include "net/socket/client_socket_handle.h"
13 #include "net/websockets/websocket_basic_handshake_stream.h"
14 #include "net/websockets/websocket_http2_handshake_stream.h"
15 #include "net/websockets/websocket_http3_handshake_stream.h"
16
17 namespace net {
18
WebSocketHandshakeStreamCreateHelper(WebSocketStream::ConnectDelegate * connect_delegate,const std::vector<std::string> & requested_subprotocols,WebSocketStreamRequestAPI * request)19 WebSocketHandshakeStreamCreateHelper::WebSocketHandshakeStreamCreateHelper(
20 WebSocketStream::ConnectDelegate* connect_delegate,
21 const std::vector<std::string>& requested_subprotocols,
22 WebSocketStreamRequestAPI* request)
23 : connect_delegate_(connect_delegate),
24 requested_subprotocols_(requested_subprotocols),
25 request_(request) {
26 DCHECK(connect_delegate_);
27 DCHECK(request_);
28 }
29
30 WebSocketHandshakeStreamCreateHelper::~WebSocketHandshakeStreamCreateHelper() =
31 default;
32
33 std::unique_ptr<WebSocketHandshakeStreamBase>
CreateBasicStream(std::unique_ptr<ClientSocketHandle> connection,bool using_proxy,WebSocketEndpointLockManager * websocket_endpoint_lock_manager)34 WebSocketHandshakeStreamCreateHelper::CreateBasicStream(
35 std::unique_ptr<ClientSocketHandle> connection,
36 bool using_proxy,
37 WebSocketEndpointLockManager* websocket_endpoint_lock_manager) {
38 // The list of supported extensions and parameters is hard-coded.
39 // TODO(ricea): If more extensions are added, consider a more flexible
40 // method.
41 std::vector<std::string> extensions(
42 1, "permessage-deflate; client_max_window_bits");
43 auto stream = std::make_unique<WebSocketBasicHandshakeStream>(
44 std::move(connection), connect_delegate_, using_proxy,
45 requested_subprotocols_, extensions, request_,
46 websocket_endpoint_lock_manager);
47 request_->OnBasicHandshakeStreamCreated(stream.get());
48 return stream;
49 }
50
51 std::unique_ptr<WebSocketHandshakeStreamBase>
CreateHttp2Stream(base::WeakPtr<SpdySession> session,std::set<std::string> dns_aliases)52 WebSocketHandshakeStreamCreateHelper::CreateHttp2Stream(
53 base::WeakPtr<SpdySession> session,
54 std::set<std::string> dns_aliases) {
55 std::vector<std::string> extensions(
56 1, "permessage-deflate; client_max_window_bits");
57 auto stream = std::make_unique<WebSocketHttp2HandshakeStream>(
58 session, connect_delegate_, requested_subprotocols_, extensions, request_,
59 std::move(dns_aliases));
60 request_->OnHttp2HandshakeStreamCreated(stream.get());
61 return stream;
62 }
63
64 std::unique_ptr<WebSocketHandshakeStreamBase>
CreateHttp3Stream(std::unique_ptr<QuicChromiumClientSession::Handle> session,std::set<std::string> dns_aliases)65 WebSocketHandshakeStreamCreateHelper::CreateHttp3Stream(
66 std::unique_ptr<QuicChromiumClientSession::Handle> session,
67 std::set<std::string> dns_aliases) {
68 std::vector<std::string> extensions(
69 1, "permessage-deflate; client_max_window_bits");
70
71 auto stream = std::make_unique<WebSocketHttp3HandshakeStream>(
72 std::move(session), connect_delegate_, requested_subprotocols_,
73 extensions, request_, std::move(dns_aliases));
74 request_->OnHttp3HandshakeStreamCreated(stream.get());
75 return stream;
76 }
77
78 } // namespace net
79