| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_job.h" | 5 #include "net/websockets/websocket_job.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 | 360 |
| 361 // handshake message is completed. | 361 // handshake message is completed. |
| 362 handshake_response_->set_protocol_version( | 362 handshake_response_->set_protocol_version( |
| 363 handshake_request_->protocol_version()); | 363 handshake_request_->protocol_version()); |
| 364 AddCookieHeaderAndSend(); | 364 AddCookieHeaderAndSend(); |
| 365 return true; | 365 return true; |
| 366 } | 366 } |
| 367 | 367 |
| 368 void WebSocketJob::AddCookieHeaderAndSend() { | 368 void WebSocketJob::AddCookieHeaderAndSend() { |
| 369 bool allow = true; | 369 bool allow = true; |
| 370 GURL url_for_cookies(socket_->url_for_cookies()); | 370 if (delegate_ && !delegate_->CanGetCookies(socket_.get(), GetURLForCookies())) |
| 371 if (delegate_ && !delegate_->CanGetCookies(socket_.get(), url_for_cookies)) | |
| 372 allow = false; | 371 allow = false; |
| 373 | 372 |
| 374 if (socket_.get() && delegate_ && state_ == CONNECTING) { | 373 if (socket_.get() && delegate_ && state_ == CONNECTING) { |
| 375 handshake_request_->RemoveHeaders(kCookieHeaders, | 374 handshake_request_->RemoveHeaders(kCookieHeaders, |
| 376 arraysize(kCookieHeaders)); | 375 arraysize(kCookieHeaders)); |
| 377 if (allow && socket_->context()->cookie_store()) { | 376 if (allow && socket_->context()->cookie_store()) { |
| 378 // Add cookies, including HttpOnly cookies. | 377 // Add cookies, including HttpOnly cookies. |
| 379 CookieOptions cookie_options; | 378 CookieOptions cookie_options; |
| 380 cookie_options.set_include_httponly(); | 379 cookie_options.set_include_httponly(); |
| 381 socket_->context()->cookie_store()->GetCookiesWithOptionsAsync( | 380 socket_->context()->cookie_store()->GetCookiesWithOptionsAsync( |
| 382 url_for_cookies, | 381 GetURLForCookies(), cookie_options, |
| 383 cookie_options, | |
| 384 base::Bind(&WebSocketJob::LoadCookieCallback, | 382 base::Bind(&WebSocketJob::LoadCookieCallback, |
| 385 weak_ptr_factory_.GetWeakPtr())); | 383 weak_ptr_factory_.GetWeakPtr())); |
| 386 } else { | 384 } else { |
| 387 DoSendData(); | 385 DoSendData(); |
| 388 } | 386 } |
| 389 } | 387 } |
| 390 } | 388 } |
| 391 | 389 |
| 392 void WebSocketJob::LoadCookieCallback(const std::string& cookie) { | 390 void WebSocketJob::LoadCookieCallback(const std::string& cookie) { |
| 393 if (!cookie.empty()) | 391 if (!cookie.empty()) |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 } | 502 } |
| 505 | 503 |
| 506 void WebSocketJob::SaveNextCookie() { | 504 void WebSocketJob::SaveNextCookie() { |
| 507 if (!socket_.get() || !delegate_ || state_ != CONNECTING) | 505 if (!socket_.get() || !delegate_ || state_ != CONNECTING) |
| 508 return; | 506 return; |
| 509 | 507 |
| 510 callback_pending_ = false; | 508 callback_pending_ = false; |
| 511 save_next_cookie_running_ = true; | 509 save_next_cookie_running_ = true; |
| 512 | 510 |
| 513 if (socket_->context()->cookie_store()) { | 511 if (socket_->context()->cookie_store()) { |
| 514 GURL url_for_cookies(socket_->url_for_cookies()); | 512 GURL url_for_cookies = GetURLForCookies(); |
| 515 | 513 |
| 516 CookieOptions options; | 514 CookieOptions options; |
| 517 options.set_include_httponly(); | 515 options.set_include_httponly(); |
| 518 | 516 |
| 519 // Loop as long as SetCookieWithOptionsAsync completes synchronously. Since | 517 // Loop as long as SetCookieWithOptionsAsync completes synchronously. Since |
| 520 // CookieMonster's asynchronous operation APIs queue the callback to run it | 518 // CookieMonster's asynchronous operation APIs queue the callback to run it |
| 521 // on the thread where the API was called, there won't be race. I.e. unless | 519 // on the thread where the API was called, there won't be race. I.e. unless |
| 522 // the callback is run synchronously, it won't be run in parallel with this | 520 // the callback is run synchronously, it won't be run in parallel with this |
| 523 // method. | 521 // method. |
| 524 while (!callback_pending_ && | 522 while (!callback_pending_ && |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 callback_pending_ = false; | 556 callback_pending_ = false; |
| 559 | 557 |
| 560 // Resume SaveNextCookie if the caller of SetCookieWithOptionsAsync() exited | 558 // Resume SaveNextCookie if the caller of SetCookieWithOptionsAsync() exited |
| 561 // the loop. Otherwise, return. | 559 // the loop. Otherwise, return. |
| 562 if (save_next_cookie_running_) | 560 if (save_next_cookie_running_) |
| 563 return; | 561 return; |
| 564 | 562 |
| 565 SaveNextCookie(); | 563 SaveNextCookie(); |
| 566 } | 564 } |
| 567 | 565 |
| 566 GURL WebSocketJob::GetURLForCookies() const { |
| 567 GURL url = socket_->url(); |
| 568 std::string scheme = socket_->is_secure() ? "https" : "http"; |
| 569 url_canon::Replacements<char> replacements; |
| 570 replacements.SetScheme(scheme.c_str(), |
| 571 url_parse::Component(0, scheme.length())); |
| 572 return url.ReplaceComponents(replacements); |
| 573 } |
| 574 |
| 568 const AddressList& WebSocketJob::address_list() const { | 575 const AddressList& WebSocketJob::address_list() const { |
| 569 return addresses_; | 576 return addresses_; |
| 570 } | 577 } |
| 571 | 578 |
| 572 int WebSocketJob::TrySpdyStream() { | 579 int WebSocketJob::TrySpdyStream() { |
| 573 if (!socket_.get()) | 580 if (!socket_.get()) |
| 574 return ERR_FAILED; | 581 return ERR_FAILED; |
| 575 | 582 |
| 576 if (!websocket_over_spdy_enabled_) | 583 if (!websocket_over_spdy_enabled_) |
| 577 return OK; | 584 return OK; |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 | 695 |
| 689 scoped_refptr<IOBufferWithSize> next_buffer = send_buffer_queue_.front(); | 696 scoped_refptr<IOBufferWithSize> next_buffer = send_buffer_queue_.front(); |
| 690 send_buffer_queue_.pop_front(); | 697 send_buffer_queue_.pop_front(); |
| 691 current_send_buffer_ = | 698 current_send_buffer_ = |
| 692 new DrainableIOBuffer(next_buffer.get(), next_buffer->size()); | 699 new DrainableIOBuffer(next_buffer.get(), next_buffer->size()); |
| 693 SendDataInternal(current_send_buffer_->data(), | 700 SendDataInternal(current_send_buffer_->data(), |
| 694 current_send_buffer_->BytesRemaining()); | 701 current_send_buffer_->BytesRemaining()); |
| 695 } | 702 } |
| 696 | 703 |
| 697 } // namespace net | 704 } // namespace net |
| OLD | NEW |