blob: af734454cec46e6b7501fcea6b0691d04a72374d [file] [log] [blame]
Bence Béky46bfbc12018-02-22 19:28:201// Copyright 2018 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_HTTP2_HANDSHAKE_STREAM_H_
6#define NET_WEBSOCKETS_WEBSOCKET_HTTP2_HANDSHAKE_STREAM_H_
7
8#include <stdint.h>
9
10#include <memory>
11#include <string>
12#include <vector>
13
14#include "base/macros.h"
15#include "base/memory/weak_ptr.h"
16#include "net/base/completion_once_callback.h"
17#include "net/base/io_buffer.h"
18#include "net/base/net_export.h"
19#include "net/base/request_priority.h"
20#include "net/log/net_log_with_source.h"
Victor Vasiliev27cc7712019-01-24 11:50:1421#include "net/third_party/quiche/src/spdy/core/spdy_header_block.h"
Bence Béky46bfbc12018-02-22 19:28:2022#include "net/websockets/websocket_basic_stream_adapters.h"
23#include "net/websockets/websocket_handshake_stream_base.h"
24#include "net/websockets/websocket_stream.h"
25
Bence Béky46bfbc12018-02-22 19:28:2026namespace net {
27
28struct LoadTimingInfo;
29class SSLInfo;
30class IOBuffer;
31class SSLCertRequestInfo;
32class IPEndPoint;
33class HttpNetworkSession;
34struct NetErrorDetails;
35class HttpStream;
36class HttpResponseHeaders;
37struct HttpRequestInfo;
38class HttpResponseInfo;
39class SpdySession;
40struct AlternativeService;
41class SpdyStreamRequest;
42struct WebSocketExtensionParams;
43
44class NET_EXPORT_PRIVATE WebSocketHttp2HandshakeStream
45 : public WebSocketHandshakeStreamBase,
46 public WebSocketSpdyStreamAdapter::Delegate {
47 public:
48 // |connect_delegate| and |request| must out-live this object.
49 WebSocketHttp2HandshakeStream(
50 base::WeakPtr<SpdySession> session,
51 WebSocketStream::ConnectDelegate* connect_delegate,
52 std::vector<std::string> requested_sub_protocols,
53 std::vector<std::string> requested_extensions,
Adam Rice6f75c0f2018-06-04 08:00:0554 WebSocketStreamRequestAPI* request);
Bence Béky46bfbc12018-02-22 19:28:2055
56 ~WebSocketHttp2HandshakeStream() override;
57
58 // HttpStream methods.
59 int InitializeStream(const HttpRequestInfo* request_info,
60 bool can_send_early,
61 RequestPriority priority,
62 const NetLogWithSource& net_log,
63 CompletionOnceCallback callback) override;
64 int SendRequest(const HttpRequestHeaders& request_headers,
65 HttpResponseInfo* response,
66 CompletionOnceCallback callback) override;
67 int ReadResponseHeaders(CompletionOnceCallback callback) override;
68 int ReadResponseBody(IOBuffer* buf,
69 int buf_len,
70 CompletionOnceCallback callback) override;
71 void Close(bool not_reusable) override;
72 bool IsResponseBodyComplete() const override;
73 bool IsConnectionReused() const override;
74 void SetConnectionReused() override;
75 bool CanReuseConnection() const override;
76 int64_t GetTotalReceivedBytes() const override;
77 int64_t GetTotalSentBytes() const override;
78 bool GetAlternativeService(
79 AlternativeService* alternative_service) const override;
80 bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override;
81 void GetSSLInfo(SSLInfo* ssl_info) override;
82 void GetSSLCertRequestInfo(SSLCertRequestInfo* cert_request_info) override;
83 bool GetRemoteEndpoint(IPEndPoint* endpoint) override;
Bence Béky46bfbc12018-02-22 19:28:2084 void Drain(HttpNetworkSession* session) override;
85 void SetPriority(RequestPriority priority) override;
86 void PopulateNetErrorDetails(NetErrorDetails* details) override;
87 HttpStream* RenewStreamForAuth() override;
88
89 // WebSocketHandshakeStreamBase methods.
90
91 // This is called from the top level once correct handshake response headers
92 // have been received. It creates an appropriate subclass of WebSocketStream
93 // depending on what extensions were negotiated. This object is unusable after
94 // Upgrade() has been called and should be disposed of as soon as possible.
95 std::unique_ptr<WebSocketStream> Upgrade() override;
96
Bence Békyca0da432019-01-24 15:03:2097 base::WeakPtr<WebSocketHandshakeStreamBase> GetWeakPtr() override;
98
Bence Béky46bfbc12018-02-22 19:28:2099 // WebSocketSpdyStreamAdapter::Delegate methods.
100 void OnHeadersSent() override;
Ryan Hamilton0239aac2018-05-19 00:03:13101 void OnHeadersReceived(
102 const spdy::SpdyHeaderBlock& response_headers) override;
Bence Béky46bfbc12018-02-22 19:28:20103 void OnClose(int status) override;
104
105 // Called by |spdy_stream_request_| when requested stream is ready.
106 void StartRequestCallback(int rv);
107
108 private:
109 // Validates the response and sends the finished handshake event.
110 int ValidateResponse();
111
112 // Check that the headers are well-formed and have a 200 status code,
113 // in which case returns OK, otherwise returns ERR_INVALID_RESPONSE.
114 int ValidateUpgradeResponse(const HttpResponseHeaders* headers);
115
116 void OnFinishOpeningHandshake();
117
118 void OnFailure(const std::string& message);
119
Bence Békyde0be312018-03-13 17:51:58120 HandshakeResult result_;
121
Bence Béky46bfbc12018-02-22 19:28:20122 // The connection to open the Websocket stream on.
123 base::WeakPtr<SpdySession> session_;
124
125 // Owned by another object.
126 // |connect_delegate| will live during the lifetime of this object.
127 WebSocketStream::ConnectDelegate* const connect_delegate_;
128
129 HttpResponseInfo* http_response_info_;
130
Ryan Hamilton0239aac2018-05-19 00:03:13131 spdy::SpdyHeaderBlock http2_request_headers_;
Bence Béky46bfbc12018-02-22 19:28:20132
133 // The sub-protocols we requested.
134 std::vector<std::string> requested_sub_protocols_;
135
136 // The extensions we requested.
137 std::vector<std::string> requested_extensions_;
138
Adam Rice6f75c0f2018-06-04 08:00:05139 WebSocketStreamRequestAPI* const stream_request_;
Bence Béky46bfbc12018-02-22 19:28:20140
141 const HttpRequestInfo* request_info_;
142
143 RequestPriority priority_;
144
145 NetLogWithSource net_log_;
146
147 // SpdyStreamRequest that will create the stream.
148 std::unique_ptr<SpdyStreamRequest> spdy_stream_request_;
149
150 // SpdyStream corresponding to the request.
151 base::WeakPtr<SpdyStream> stream_;
152
153 // WebSocketSpdyStreamAdapter holding a WeakPtr to |stream_|.
154 // This can be passed on to WebSocketBasicStream when created.
155 std::unique_ptr<WebSocketSpdyStreamAdapter> stream_adapter_;
156
157 // True if |stream_| has been created then closed.
158 bool stream_closed_;
159
160 // The error code corresponding to the reason for closing the stream.
161 // Only meaningful if |stream_closed_| is true.
162 int stream_error_;
163
164 // True if complete response headers have been received.
165 bool response_headers_complete_;
166
167 // Save callback provided in asynchronous HttpStream methods.
168 CompletionOnceCallback callback_;
169
170 // The sub-protocol selected by the server.
171 std::string sub_protocol_;
172
173 // The extension(s) selected by the server.
174 std::string extensions_;
175
176 // The extension parameters. The class is defined in the implementation file
177 // to avoid including extension-related header files here.
178 std::unique_ptr<WebSocketExtensionParams> extension_params_;
179
Bence Békyca0da432019-01-24 15:03:20180 base::WeakPtrFactory<WebSocketHttp2HandshakeStream> weak_ptr_factory_;
181
Bence Béky46bfbc12018-02-22 19:28:20182 DISALLOW_COPY_AND_ASSIGN(WebSocketHttp2HandshakeStream);
183};
184
185} // namespace net
186
187#endif // NET_WEBSOCKETS_WEBSOCKET_HTTP2_HANDSHAKE_STREAM_H_