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