| 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 <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 StreamRequestImpl* owner_; | 79 StreamRequestImpl* owner_; |
| 80 HandshakeResult result_; | 80 HandshakeResult result_; |
| 81 }; | 81 }; |
| 82 | 82 |
| 83 class StreamRequestImpl : public WebSocketStreamRequest { | 83 class StreamRequestImpl : public WebSocketStreamRequest { |
| 84 public: | 84 public: |
| 85 StreamRequestImpl( | 85 StreamRequestImpl( |
| 86 const GURL& url, | 86 const GURL& url, |
| 87 const URLRequestContext* context, | 87 const URLRequestContext* context, |
| 88 const url::Origin& origin, | 88 const url::Origin& origin, |
| 89 const GURL& first_party_for_cookies, |
| 89 const std::string& additional_headers, | 90 const std::string& additional_headers, |
| 90 std::unique_ptr<WebSocketStream::ConnectDelegate> connect_delegate, | 91 std::unique_ptr<WebSocketStream::ConnectDelegate> connect_delegate, |
| 91 std::unique_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) | 92 std::unique_ptr<WebSocketHandshakeStreamCreateHelper> create_helper) |
| 92 : delegate_(new Delegate(this)), | 93 : delegate_(new Delegate(this)), |
| 93 url_request_( | 94 url_request_( |
| 94 context->CreateRequest(url, DEFAULT_PRIORITY, delegate_.get())), | 95 context->CreateRequest(url, DEFAULT_PRIORITY, delegate_.get())), |
| 95 connect_delegate_(std::move(connect_delegate)), | 96 connect_delegate_(std::move(connect_delegate)), |
| 96 create_helper_(create_helper.release()) { | 97 create_helper_(create_helper.release()) { |
| 97 create_helper_->set_failure_message(&failure_message_); | 98 create_helper_->set_failure_message(&failure_message_); |
| 98 HttpRequestHeaders headers; | 99 HttpRequestHeaders headers; |
| 99 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); | 100 headers.SetHeader(websockets::kUpgrade, websockets::kWebSocketLowercase); |
| 100 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); | 101 headers.SetHeader(HttpRequestHeaders::kConnection, websockets::kUpgrade); |
| 101 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.Serialize()); | 102 headers.SetHeader(HttpRequestHeaders::kOrigin, origin.Serialize()); |
| 102 headers.SetHeader(websockets::kSecWebSocketVersion, | 103 headers.SetHeader(websockets::kSecWebSocketVersion, |
| 103 websockets::kSupportedVersion); | 104 websockets::kSupportedVersion); |
| 104 | 105 |
| 105 headers.AddHeadersFromString(additional_headers); | 106 headers.AddHeadersFromString(additional_headers); |
| 106 | 107 |
| 107 url_request_->SetExtraRequestHeaders(headers); | 108 url_request_->SetExtraRequestHeaders(headers); |
| 109 url_request_->set_initiator(origin); |
| 110 url_request_->set_first_party_for_cookies(first_party_for_cookies); |
| 108 | 111 |
| 109 // This passes the ownership of |create_helper_| to |url_request_|. | 112 // This passes the ownership of |create_helper_| to |url_request_|. |
| 110 url_request_->SetUserData( | 113 url_request_->SetUserData( |
| 111 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), | 114 WebSocketHandshakeStreamBase::CreateHelper::DataKey(), |
| 112 create_helper_); | 115 create_helper_); |
| 113 url_request_->SetLoadFlags(LOAD_DISABLE_CACHE | LOAD_BYPASS_CACHE); | 116 url_request_->SetLoadFlags(LOAD_DISABLE_CACHE | LOAD_BYPASS_CACHE); |
| 114 } | 117 } |
| 115 | 118 |
| 116 // Destroying this object destroys the URLRequest, which cancels the request | 119 // Destroying this object destroys the URLRequest, which cancels the request |
| 117 // and so terminates the handshake if it is incomplete. | 120 // and so terminates the handshake if it is incomplete. |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 | 332 |
| 330 WebSocketStream::WebSocketStream() {} | 333 WebSocketStream::WebSocketStream() {} |
| 331 WebSocketStream::~WebSocketStream() {} | 334 WebSocketStream::~WebSocketStream() {} |
| 332 | 335 |
| 333 WebSocketStream::ConnectDelegate::~ConnectDelegate() {} | 336 WebSocketStream::ConnectDelegate::~ConnectDelegate() {} |
| 334 | 337 |
| 335 std::unique_ptr<WebSocketStreamRequest> WebSocketStream::CreateAndConnectStream( | 338 std::unique_ptr<WebSocketStreamRequest> WebSocketStream::CreateAndConnectStream( |
| 336 const GURL& socket_url, | 339 const GURL& socket_url, |
| 337 const std::vector<std::string>& requested_subprotocols, | 340 const std::vector<std::string>& requested_subprotocols, |
| 338 const url::Origin& origin, | 341 const url::Origin& origin, |
| 342 const GURL& first_party_for_cookies, |
| 339 const std::string& additional_headers, | 343 const std::string& additional_headers, |
| 340 URLRequestContext* url_request_context, | 344 URLRequestContext* url_request_context, |
| 341 const BoundNetLog& net_log, | 345 const BoundNetLog& net_log, |
| 342 std::unique_ptr<ConnectDelegate> connect_delegate) { | 346 std::unique_ptr<ConnectDelegate> connect_delegate) { |
| 343 std::unique_ptr<WebSocketHandshakeStreamCreateHelper> create_helper( | 347 std::unique_ptr<WebSocketHandshakeStreamCreateHelper> create_helper( |
| 344 new WebSocketHandshakeStreamCreateHelper(connect_delegate.get(), | 348 new WebSocketHandshakeStreamCreateHelper(connect_delegate.get(), |
| 345 requested_subprotocols)); | 349 requested_subprotocols)); |
| 346 std::unique_ptr<StreamRequestImpl> request(new StreamRequestImpl( | 350 std::unique_ptr<StreamRequestImpl> request(new StreamRequestImpl( |
| 347 socket_url, url_request_context, origin, additional_headers, | 351 socket_url, url_request_context, origin, first_party_for_cookies, |
| 348 std::move(connect_delegate), std::move(create_helper))); | 352 additional_headers, std::move(connect_delegate), |
| 353 std::move(create_helper))); |
| 349 request->Start(std::unique_ptr<base::Timer>(new base::Timer(false, false))); | 354 request->Start(std::unique_ptr<base::Timer>(new base::Timer(false, false))); |
| 350 return std::move(request); | 355 return std::move(request); |
| 351 } | 356 } |
| 352 | 357 |
| 353 // This is declared in websocket_test_util.h. | 358 // This is declared in websocket_test_util.h. |
| 354 std::unique_ptr<WebSocketStreamRequest> CreateAndConnectStreamForTesting( | 359 std::unique_ptr<WebSocketStreamRequest> CreateAndConnectStreamForTesting( |
| 355 const GURL& socket_url, | 360 const GURL& socket_url, |
| 356 std::unique_ptr<WebSocketHandshakeStreamCreateHelper> create_helper, | 361 std::unique_ptr<WebSocketHandshakeStreamCreateHelper> create_helper, |
| 357 const url::Origin& origin, | 362 const url::Origin& origin, |
| 363 const GURL& first_party_for_cookies, |
| 358 const std::string& additional_headers, | 364 const std::string& additional_headers, |
| 359 URLRequestContext* url_request_context, | 365 URLRequestContext* url_request_context, |
| 360 const BoundNetLog& net_log, | 366 const BoundNetLog& net_log, |
| 361 std::unique_ptr<WebSocketStream::ConnectDelegate> connect_delegate, | 367 std::unique_ptr<WebSocketStream::ConnectDelegate> connect_delegate, |
| 362 std::unique_ptr<base::Timer> timer) { | 368 std::unique_ptr<base::Timer> timer) { |
| 363 std::unique_ptr<StreamRequestImpl> request(new StreamRequestImpl( | 369 std::unique_ptr<StreamRequestImpl> request(new StreamRequestImpl( |
| 364 socket_url, url_request_context, origin, additional_headers, | 370 socket_url, url_request_context, origin, first_party_for_cookies, |
| 365 std::move(connect_delegate), std::move(create_helper))); | 371 additional_headers, std::move(connect_delegate), |
| 372 std::move(create_helper))); |
| 366 request->Start(std::move(timer)); | 373 request->Start(std::move(timer)); |
| 367 return std::move(request); | 374 return std::move(request); |
| 368 } | 375 } |
| 369 | 376 |
| 370 void WebSocketDispatchOnFinishOpeningHandshake( | 377 void WebSocketDispatchOnFinishOpeningHandshake( |
| 371 WebSocketStream::ConnectDelegate* connect_delegate, | 378 WebSocketStream::ConnectDelegate* connect_delegate, |
| 372 const GURL& url, | 379 const GURL& url, |
| 373 const scoped_refptr<HttpResponseHeaders>& headers, | 380 const scoped_refptr<HttpResponseHeaders>& headers, |
| 374 base::Time response_time) { | 381 base::Time response_time) { |
| 375 DCHECK(connect_delegate); | 382 DCHECK(connect_delegate); |
| 376 if (headers.get()) { | 383 if (headers.get()) { |
| 377 connect_delegate->OnFinishOpeningHandshake( | 384 connect_delegate->OnFinishOpeningHandshake( |
| 378 base::WrapUnique(new WebSocketHandshakeResponseInfo( | 385 base::WrapUnique(new WebSocketHandshakeResponseInfo( |
| 379 url, headers->response_code(), headers->GetStatusText(), headers, | 386 url, headers->response_code(), headers->GetStatusText(), headers, |
| 380 response_time))); | 387 response_time))); |
| 381 } | 388 } |
| 382 } | 389 } |
| 383 | 390 |
| 384 } // namespace net | 391 } // namespace net |
| OLD | NEW |