OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/websockets/websocket_stream.h" | 5 #include "net/websockets/websocket_stream.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "net/http/http_request_headers.h" | 10 #include "net/http/http_request_headers.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
59 private: | 59 private: |
60 StreamRequestImpl* owner_; | 60 StreamRequestImpl* owner_; |
61 HandshakeResult result_; | 61 HandshakeResult result_; |
62 }; | 62 }; |
63 | 63 |
64 class StreamRequestImpl : public WebSocketStreamRequest { | 64 class StreamRequestImpl : public WebSocketStreamRequest { |
65 public: | 65 public: |
66 StreamRequestImpl( | 66 StreamRequestImpl( |
67 const GURL& url, | 67 const GURL& url, |
68 const URLRequestContext* context, | 68 const URLRequestContext* context, |
69 const url::Origin& origin, | |
69 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, | 70 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, |
70 WebSocketHandshakeStreamCreateHelper* create_helper) | 71 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) |
71 : delegate_(new Delegate(this)), | 72 : delegate_(new Delegate(this)), |
72 url_request_(url, DEFAULT_PRIORITY, delegate_.get(), context), | 73 url_request_(url, DEFAULT_PRIORITY, delegate_.get(), context), |
73 connect_delegate_(connect_delegate.Pass()), | 74 connect_delegate_(connect_delegate.Pass()), |
74 create_helper_(create_helper) {} | 75 create_helper_(create_helper.get()) { |
Adam Rice
2014/05/22 08:36:14
Suggestion: use .release() here and then use creat
tyoshino (SeeGerritForStatus)
2014/05/22 09:11:00
Done.
| |
76 HttpRequestHeaders headers; | |
77 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); | |
78 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); | |
79 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.string()); | |
80 headers.SetHeader(websockets::kSecWebSocketVersion, | |
81 websockets::kSupportedVersion); | |
82 url_request_.SetExtraRequestHeaders(headers); | |
83 | |
84 url_request_.SetUserData( | |
85 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), | |
86 create_helper.release()); | |
87 url_request_.SetLoadFlags(LOAD_DISABLE_CACHE | | |
88 LOAD_BYPASS_CACHE | | |
89 LOAD_DO_NOT_PROMPT_FOR_LOGIN); | |
90 url_request_.Start(); | |
Adam Rice
2014/05/22 08:36:14
I am not sure about this. On the one hand, it viol
tyoshino (SeeGerritForStatus)
2014/05/22 09:11:00
I was also wondering if Start() should be run outs
Adam Rice
2014/05/22 09:22:02
Agreed.
| |
91 } | |
75 | 92 |
76 // Destroying this object destroys the URLRequest, which cancels the request | 93 // Destroying this object destroys the URLRequest, which cancels the request |
77 // and so terminates the handshake if it is incomplete. | 94 // and so terminates the handshake if it is incomplete. |
78 virtual ~StreamRequestImpl() {} | 95 virtual ~StreamRequestImpl() {} |
79 | 96 |
80 URLRequest* url_request() { return &url_request_; } | |
81 | |
82 void PerformUpgrade() { | 97 void PerformUpgrade() { |
83 connect_delegate_->OnSuccess(create_helper_->stream()->Upgrade()); | 98 connect_delegate_->OnSuccess(create_helper_->stream()->Upgrade()); |
84 } | 99 } |
85 | 100 |
86 void ReportFailure() { | 101 void ReportFailure() { |
87 std::string failure_message; | 102 std::string failure_message; |
88 if (create_helper_->stream()) { | 103 if (create_helper_->stream()) { |
89 failure_message = create_helper_->stream()->GetFailureMessage(); | 104 failure_message = create_helper_->stream()->GetFailureMessage(); |
90 } else { | 105 } else { |
91 switch (url_request_.status().status()) { | 106 switch (url_request_.status().status()) { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
150 void Delegate::OnSSLCertificateError(URLRequest* request, | 165 void Delegate::OnSSLCertificateError(URLRequest* request, |
151 const SSLInfo& ssl_info, | 166 const SSLInfo& ssl_info, |
152 bool fatal) { | 167 bool fatal) { |
153 request->Cancel(); | 168 request->Cancel(); |
154 } | 169 } |
155 | 170 |
156 void Delegate::OnReadCompleted(URLRequest* request, int bytes_read) { | 171 void Delegate::OnReadCompleted(URLRequest* request, int bytes_read) { |
157 NOTREACHED(); | 172 NOTREACHED(); |
158 } | 173 } |
159 | 174 |
160 // Internal implementation of CreateAndConnectStream and | |
161 // CreateAndConnectStreamForTesting. | |
162 scoped_ptr<WebSocketStreamRequest> CreateAndConnectStreamWithCreateHelper( | |
163 const GURL& socket_url, | |
164 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper, | |
165 const url::Origin& origin, | |
166 URLRequestContext* url_request_context, | |
167 const BoundNetLog& net_log, | |
168 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate) { | |
169 scoped_ptr<StreamRequestImpl> request( | |
170 new StreamRequestImpl(socket_url, | |
171 url_request_context, | |
172 connect_delegate.Pass(), | |
173 create_helper.get())); | |
174 HttpRequestHeaders headers; | |
175 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); | |
176 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); | |
177 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.string()); | |
178 headers.SetHeader(websockets::kSecWebSocketVersion, | |
179 websockets::kSupportedVersion); | |
180 request->url_request()->SetExtraRequestHeaders(headers); | |
181 request->url_request()->SetUserData( | |
182 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), | |
183 create_helper.release()); | |
184 request->url_request()->SetLoadFlags(LOAD_DISABLE_CACHE | | |
185 LOAD_BYPASS_CACHE | | |
186 LOAD_DO_NOT_PROMPT_FOR_LOGIN); | |
187 request->url_request()->Start(); | |
188 return request.PassAs<WebSocketStreamRequest>(); | |
189 } | |
190 | |
191 } // namespace | 175 } // namespace |
192 | 176 |
193 WebSocketStreamRequest::~WebSocketStreamRequest() {} | 177 WebSocketStreamRequest::~WebSocketStreamRequest() {} |
194 | 178 |
195 WebSocketStream::WebSocketStream() {} | 179 WebSocketStream::WebSocketStream() {} |
196 WebSocketStream::~WebSocketStream() {} | 180 WebSocketStream::~WebSocketStream() {} |
197 | 181 |
198 WebSocketStream::ConnectDelegate::~ConnectDelegate() {} | 182 WebSocketStream::ConnectDelegate::~ConnectDelegate() {} |
199 | 183 |
200 scoped_ptr<WebSocketStreamRequest> WebSocketStream::CreateAndConnectStream( | 184 scoped_ptr<WebSocketStreamRequest> WebSocketStream::CreateAndConnectStream( |
201 const GURL& socket_url, | 185 const GURL& socket_url, |
202 const std::vector<std::string>& requested_subprotocols, | 186 const std::vector<std::string>& requested_subprotocols, |
203 const url::Origin& origin, | 187 const url::Origin& origin, |
204 URLRequestContext* url_request_context, | 188 URLRequestContext* url_request_context, |
205 const BoundNetLog& net_log, | 189 const BoundNetLog& net_log, |
206 scoped_ptr<ConnectDelegate> connect_delegate) { | 190 scoped_ptr<ConnectDelegate> connect_delegate) { |
207 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper( | 191 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper( |
208 new WebSocketHandshakeStreamCreateHelper(connect_delegate.get(), | 192 new WebSocketHandshakeStreamCreateHelper(connect_delegate.get(), |
209 requested_subprotocols)); | 193 requested_subprotocols)); |
210 return CreateAndConnectStreamWithCreateHelper(socket_url, | 194 scoped_ptr<WebSocketStreamRequest> request( |
211 create_helper.Pass(), | 195 new StreamRequestImpl(socket_url, |
212 origin, | 196 url_request_context, |
213 url_request_context, | 197 origin, |
214 net_log, | 198 connect_delegate.Pass(), |
215 connect_delegate.Pass()); | 199 create_helper.Pass())); |
200 return request.PassAs<WebSocketStreamRequest>(); | |
Adam Rice
2014/05/22 08:36:14
You don't need PassAs<>() here. Plain Pass() shoul
tyoshino (SeeGerritForStatus)
2014/05/22 09:11:00
Oh, right! As I separated Start() call on URLReque
Adam Rice
2014/05/22 09:22:02
I did have the evil idea of having Start() return
| |
216 } | 201 } |
217 | 202 |
218 // This is declared in websocket_test_util.h. | 203 // This is declared in websocket_test_util.h. |
219 scoped_ptr<WebSocketStreamRequest> CreateAndConnectStreamForTesting( | 204 scoped_ptr<WebSocketStreamRequest> CreateAndConnectStreamForTesting( |
220 const GURL& socket_url, | 205 const GURL& socket_url, |
221 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper, | 206 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper, |
222 const url::Origin& origin, | 207 const url::Origin& origin, |
223 URLRequestContext* url_request_context, | 208 URLRequestContext* url_request_context, |
224 const BoundNetLog& net_log, | 209 const BoundNetLog& net_log, |
225 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate) { | 210 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate) { |
226 return CreateAndConnectStreamWithCreateHelper(socket_url, | 211 scoped_ptr<WebSocketStreamRequest> request( |
227 create_helper.Pass(), | 212 new StreamRequestImpl(socket_url, |
228 origin, | 213 url_request_context, |
229 url_request_context, | 214 origin, |
230 net_log, | 215 connect_delegate.Pass(), |
231 connect_delegate.Pass()); | 216 create_helper.Pass())); |
217 return request.PassAs<WebSocketStreamRequest>(); | |
232 } | 218 } |
233 | 219 |
234 } // namespace net | 220 } // namespace net |
OLD | NEW |