| 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/url_request/url_request_http_job.h" | 5 #include "net/url_request/url_request_http_job.h" |
| 6 | 6 |
| 7 #include "base/base_switches.h" | 7 #include "base/base_switches.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 DCHECK(transaction_.get()); | 559 DCHECK(transaction_.get()); |
| 560 | 560 |
| 561 const HttpResponseInfo* response_info = transaction_->GetResponseInfo(); | 561 const HttpResponseInfo* response_info = transaction_->GetResponseInfo(); |
| 562 DCHECK(response_info); | 562 DCHECK(response_info); |
| 563 | 563 |
| 564 response_cookies_.clear(); | 564 response_cookies_.clear(); |
| 565 response_cookies_save_index_ = 0; | 565 response_cookies_save_index_ = 0; |
| 566 | 566 |
| 567 FetchResponseCookies(&response_cookies_); | 567 FetchResponseCookies(&response_cookies_); |
| 568 | 568 |
| 569 if (!GetResponseHeaders()->GetDateValue(&response_date_)) |
| 570 response_date_ = base::Time(); |
| 571 |
| 569 // Now, loop over the response cookies, and attempt to persist each. | 572 // Now, loop over the response cookies, and attempt to persist each. |
| 570 SaveNextCookie(); | 573 SaveNextCookie(); |
| 571 } | 574 } |
| 572 | 575 |
| 573 // If the save occurs synchronously, SaveNextCookie will loop and save the next | 576 // If the save occurs synchronously, SaveNextCookie will loop and save the next |
| 574 // cookie. If the save is deferred, the callback is responsible for continuing | 577 // cookie. If the save is deferred, the callback is responsible for continuing |
| 575 // to iterate through the cookies. | 578 // to iterate through the cookies. |
| 576 // TODO(erikwright): Modify the CookieStore API to indicate via return value | 579 // TODO(erikwright): Modify the CookieStore API to indicate via return value |
| 577 // whether it completed synchronously or asynchronously. | 580 // whether it completed synchronously or asynchronously. |
| 578 // See http://crbug.com/131066. | 581 // See http://crbug.com/131066. |
| 579 void URLRequestHttpJob::SaveNextCookie() { | 582 void URLRequestHttpJob::SaveNextCookie() { |
| 580 // No matter what, we want to report our status as IO pending since we will | 583 // No matter what, we want to report our status as IO pending since we will |
| 581 // be notifying our consumer asynchronously via OnStartCompleted. | 584 // be notifying our consumer asynchronously via OnStartCompleted. |
| 582 SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); | 585 SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); |
| 583 | 586 |
| 584 // Used to communicate with the callback. See the implementation of | 587 // Used to communicate with the callback. See the implementation of |
| 585 // OnCookieSaved. | 588 // OnCookieSaved. |
| 586 scoped_refptr<SharedBoolean> callback_pending = new SharedBoolean(false); | 589 scoped_refptr<SharedBoolean> callback_pending = new SharedBoolean(false); |
| 587 scoped_refptr<SharedBoolean> save_next_cookie_running = | 590 scoped_refptr<SharedBoolean> save_next_cookie_running = |
| 588 new SharedBoolean(true); | 591 new SharedBoolean(true); |
| 589 | 592 |
| 590 if (!(request_info_.load_flags & LOAD_DO_NOT_SAVE_COOKIES) && | 593 if (!(request_info_.load_flags & LOAD_DO_NOT_SAVE_COOKIES) && |
| 591 request_->context()->cookie_store() && | 594 request_->context()->cookie_store() && |
| 592 response_cookies_.size() > 0) { | 595 response_cookies_.size() > 0) { |
| 593 CookieOptions options; | 596 CookieOptions options; |
| 594 options.set_include_httponly(); | 597 options.set_include_httponly(); |
| 598 options.set_server_time(response_date_); |
| 595 | 599 |
| 596 net::CookieStore::SetCookiesCallback callback( | 600 net::CookieStore::SetCookiesCallback callback( |
| 597 base::Bind(&URLRequestHttpJob::OnCookieSaved, | 601 base::Bind(&URLRequestHttpJob::OnCookieSaved, |
| 598 weak_factory_.GetWeakPtr(), | 602 weak_factory_.GetWeakPtr(), |
| 599 save_next_cookie_running, | 603 save_next_cookie_running, |
| 600 callback_pending)); | 604 callback_pending)); |
| 601 | 605 |
| 602 // Loop through the cookies as long as SetCookieWithOptionsAsync completes | 606 // Loop through the cookies as long as SetCookieWithOptionsAsync completes |
| 603 // synchronously. | 607 // synchronously. |
| 604 while (!callback_pending->data && | 608 while (!callback_pending->data && |
| (...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1515 | 1519 |
| 1516 void URLRequestHttpJob::NotifyURLRequestDestroyed() { | 1520 void URLRequestHttpJob::NotifyURLRequestDestroyed() { |
| 1517 awaiting_callback_ = false; | 1521 awaiting_callback_ = false; |
| 1518 } | 1522 } |
| 1519 | 1523 |
| 1520 void URLRequestHttpJob::OnDetachRequest() { | 1524 void URLRequestHttpJob::OnDetachRequest() { |
| 1521 http_transaction_delegate_->OnDetachRequest(); | 1525 http_transaction_delegate_->OnDetachRequest(); |
| 1522 } | 1526 } |
| 1523 | 1527 |
| 1524 } // namespace net | 1528 } // namespace net |
| OLD | NEW |