| 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 <utility> |
| 8 |
| 7 #include "base/logging.h" | 9 #include "base/logging.h" |
| 8 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/metrics/sparse_histogram.h" | 12 #include "base/metrics/sparse_histogram.h" |
| 11 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
| 12 #include "base/time/time.h" | 14 #include "base/time/time.h" |
| 13 #include "base/timer/timer.h" | 15 #include "base/timer/timer.h" |
| 14 #include "net/base/load_flags.h" | 16 #include "net/base/load_flags.h" |
| 15 #include "net/http/http_request_headers.h" | 17 #include "net/http/http_request_headers.h" |
| 16 #include "net/http/http_response_headers.h" | 18 #include "net/http/http_response_headers.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 public: | 83 public: |
| 82 StreamRequestImpl( | 84 StreamRequestImpl( |
| 83 const GURL& url, | 85 const GURL& url, |
| 84 const URLRequestContext* context, | 86 const URLRequestContext* context, |
| 85 const url::Origin& origin, | 87 const url::Origin& origin, |
| 86 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, | 88 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, |
| 87 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) | 89 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) |
| 88 : delegate_(new Delegate(this)), | 90 : delegate_(new Delegate(this)), |
| 89 url_request_( | 91 url_request_( |
| 90 context->CreateRequest(url, DEFAULT_PRIORITY, delegate_.get())), | 92 context->CreateRequest(url, DEFAULT_PRIORITY, delegate_.get())), |
| 91 connect_delegate_(connect_delegate.Pass()), | 93 connect_delegate_(std::move(connect_delegate)), |
| 92 create_helper_(create_helper.release()) { | 94 create_helper_(create_helper.release()) { |
| 93 create_helper_->set_failure_message(&failure_message_); | 95 create_helper_->set_failure_message(&failure_message_); |
| 94 HttpRequestHeaders headers; | 96 HttpRequestHeaders headers; |
| 95 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); | 97 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); |
| 96 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); | 98 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); |
| 97 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.Serialize()); | 99 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.Serialize()); |
| 98 headers.SetHeader(websockets::kSecWebSocketVersion, | 100 headers.SetHeader(websockets::kSecWebSocketVersion, |
| 99 websockets::kSupportedVersion); | 101 websockets::kSupportedVersion); |
| 100 url_request_->SetExtraRequestHeaders(headers); | 102 url_request_->SetExtraRequestHeaders(headers); |
| 101 | 103 |
| 102 // This passes the ownership of |create_helper_| to |url_request_|. | 104 // This passes the ownership of |create_helper_| to |url_request_|. |
| 103 url_request_->SetUserData( | 105 url_request_->SetUserData( |
| 104 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), | 106 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), |
| 105 create_helper_); | 107 create_helper_); |
| 106 url_request_->SetLoadFlags(LOAD_DISABLE_CACHE | LOAD_BYPASS_CACHE); | 108 url_request_->SetLoadFlags(LOAD_DISABLE_CACHE | LOAD_BYPASS_CACHE); |
| 107 } | 109 } |
| 108 | 110 |
| 109 // Destroying this object destroys the URLRequest, which cancels the request | 111 // Destroying this object destroys the URLRequest, which cancels the request |
| 110 // and so terminates the handshake if it is incomplete. | 112 // and so terminates the handshake if it is incomplete. |
| 111 ~StreamRequestImpl() override {} | 113 ~StreamRequestImpl() override {} |
| 112 | 114 |
| 113 void Start(scoped_ptr<base::Timer> timer) { | 115 void Start(scoped_ptr<base::Timer> timer) { |
| 114 DCHECK(timer); | 116 DCHECK(timer); |
| 115 base::TimeDelta timeout(base::TimeDelta::FromSeconds( | 117 base::TimeDelta timeout(base::TimeDelta::FromSeconds( |
| 116 kHandshakeTimeoutIntervalInSeconds)); | 118 kHandshakeTimeoutIntervalInSeconds)); |
| 117 timer_ = timer.Pass(); | 119 timer_ = std::move(timer); |
| 118 timer_->Start(FROM_HERE, timeout, | 120 timer_->Start(FROM_HERE, timeout, |
| 119 base::Bind(&StreamRequestImpl::OnTimeout, | 121 base::Bind(&StreamRequestImpl::OnTimeout, |
| 120 base::Unretained(this))); | 122 base::Unretained(this))); |
| 121 url_request_->Start(); | 123 url_request_->Start(); |
| 122 } | 124 } |
| 123 | 125 |
| 124 void PerformUpgrade() { | 126 void PerformUpgrade() { |
| 125 DCHECK(timer_); | 127 DCHECK(timer_); |
| 126 timer_->Stop(); | 128 timer_->Stop(); |
| 127 connect_delegate_->OnSuccess(create_helper_->Upgrade()); | 129 connect_delegate_->OnSuccess(create_helper_->Upgrade()); |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 scoped_ptr<WebSocketStreamRequest> WebSocketStream::CreateAndConnectStream( | 331 scoped_ptr<WebSocketStreamRequest> WebSocketStream::CreateAndConnectStream( |
| 330 const GURL& socket_url, | 332 const GURL& socket_url, |
| 331 const std::vector<std::string>& requested_subprotocols, | 333 const std::vector<std::string>& requested_subprotocols, |
| 332 const url::Origin& origin, | 334 const url::Origin& origin, |
| 333 URLRequestContext* url_request_context, | 335 URLRequestContext* url_request_context, |
| 334 const BoundNetLog& net_log, | 336 const BoundNetLog& net_log, |
| 335 scoped_ptr<ConnectDelegate> connect_delegate) { | 337 scoped_ptr<ConnectDelegate> connect_delegate) { |
| 336 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper( | 338 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper( |
| 337 new WebSocketHandshakeStreamCreateHelper(connect_delegate.get(), | 339 new WebSocketHandshakeStreamCreateHelper(connect_delegate.get(), |
| 338 requested_subprotocols)); | 340 requested_subprotocols)); |
| 339 scoped_ptr<StreamRequestImpl> request( | 341 scoped_ptr<StreamRequestImpl> request(new StreamRequestImpl( |
| 340 new StreamRequestImpl(socket_url, | 342 socket_url, url_request_context, origin, std::move(connect_delegate), |
| 341 url_request_context, | 343 std::move(create_helper))); |
| 342 origin, | |
| 343 connect_delegate.Pass(), | |
| 344 create_helper.Pass())); | |
| 345 request->Start(scoped_ptr<base::Timer>(new base::Timer(false, false))); | 344 request->Start(scoped_ptr<base::Timer>(new base::Timer(false, false))); |
| 346 return request.Pass(); | 345 return std::move(request); |
| 347 } | 346 } |
| 348 | 347 |
| 349 // This is declared in websocket_test_util.h. | 348 // This is declared in websocket_test_util.h. |
| 350 scoped_ptr<WebSocketStreamRequest> CreateAndConnectStreamForTesting( | 349 scoped_ptr<WebSocketStreamRequest> CreateAndConnectStreamForTesting( |
| 351 const GURL& socket_url, | 350 const GURL& socket_url, |
| 352 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper, | 351 scoped_ptr<WebSocketHandshakeStreamCreateHelper> create_helper, |
| 353 const url::Origin& origin, | 352 const url::Origin& origin, |
| 354 URLRequestContext* url_request_context, | 353 URLRequestContext* url_request_context, |
| 355 const BoundNetLog& net_log, | 354 const BoundNetLog& net_log, |
| 356 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, | 355 scoped_ptr<WebSocketStream::ConnectDelegate> connect_delegate, |
| 357 scoped_ptr<base::Timer> timer) { | 356 scoped_ptr<base::Timer> timer) { |
| 358 scoped_ptr<StreamRequestImpl> request( | 357 scoped_ptr<StreamRequestImpl> request(new StreamRequestImpl( |
| 359 new StreamRequestImpl(socket_url, | 358 socket_url, url_request_context, origin, std::move(connect_delegate), |
| 360 url_request_context, | 359 std::move(create_helper))); |
| 361 origin, | 360 request->Start(std::move(timer)); |
| 362 connect_delegate.Pass(), | 361 return std::move(request); |
| 363 create_helper.Pass())); | |
| 364 request->Start(timer.Pass()); | |
| 365 return request.Pass(); | |
| 366 } | 362 } |
| 367 | 363 |
| 368 void WebSocketDispatchOnFinishOpeningHandshake( | 364 void WebSocketDispatchOnFinishOpeningHandshake( |
| 369 WebSocketStream::ConnectDelegate* connect_delegate, | 365 WebSocketStream::ConnectDelegate* connect_delegate, |
| 370 const GURL& url, | 366 const GURL& url, |
| 371 const scoped_refptr<HttpResponseHeaders>& headers, | 367 const scoped_refptr<HttpResponseHeaders>& headers, |
| 372 base::Time response_time) { | 368 base::Time response_time) { |
| 373 DCHECK(connect_delegate); | 369 DCHECK(connect_delegate); |
| 374 if (headers.get()) { | 370 if (headers.get()) { |
| 375 connect_delegate->OnFinishOpeningHandshake(make_scoped_ptr( | 371 connect_delegate->OnFinishOpeningHandshake(make_scoped_ptr( |
| 376 new WebSocketHandshakeResponseInfo(url, | 372 new WebSocketHandshakeResponseInfo(url, |
| 377 headers->response_code(), | 373 headers->response_code(), |
| 378 headers->GetStatusText(), | 374 headers->GetStatusText(), |
| 379 headers, | 375 headers, |
| 380 response_time))); | 376 response_time))); |
| 381 } | 377 } |
| 382 } | 378 } |
| 383 | 379 |
| 384 } // namespace net | 380 } // namespace net |
| OLD | NEW |