summaryrefslogtreecommitdiffstats
path: root/net/url_request
diff options
context:
space:
mode:
Diffstat (limited to 'net/url_request')
-rw-r--r--net/url_request/url_request_http_job.cc45
-rw-r--r--net/url_request/url_request_http_job.h9
-rw-r--r--net/url_request/url_request_unittest.cc38
3 files changed, 79 insertions, 13 deletions
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 4007282..f404ea3 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -4,6 +4,7 @@
#include "net/url_request/url_request_http_job.h"
+#include "base/bind.h"
#include "base/base_switches.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
@@ -16,7 +17,7 @@
#include "base/string_util.h"
#include "base/time.h"
#include "net/base/cert_status_flags.h"
-#include "net/base/cookie_store.h"
+#include "net/base/cookie_monster.h"
#include "net/base/filter.h"
#include "net/base/host_port_pair.h"
#include "net/base/load_flags.h"
@@ -521,17 +522,27 @@ void URLRequestHttpJob::AddCookieHeaderAndStart() {
if (request_->context()->cookie_store() && allow) {
CookieOptions options;
options.set_include_httponly();
- std::string cookie_line;
- std::vector<CookieStore::CookieInfo> cookie_infos;
- request_->context()->cookie_store()->GetCookiesWithInfo(
- request_->url(), options, &cookie_line, &cookie_infos);
- if (!cookie_line.empty()) {
- request_info_.extra_headers.SetHeader(
- HttpRequestHeaders::kCookie, cookie_line);
- }
- if (URLRequest::AreMacCookiesEnabled())
- AddAuthorizationHeader(cookie_infos, &request_info_);
+ request_->context()->cookie_store()->GetCookiesWithInfoAsync(
+ request_->url(), options,
+ base::Bind(&URLRequestHttpJob::OnCookiesLoaded, this));
+ } else {
+ DoStartTransaction();
+ }
+}
+
+void URLRequestHttpJob::OnCookiesLoaded(
+ std::string* cookie_line,
+ std::vector<net::CookieStore::CookieInfo>* cookie_infos) {
+ if (!cookie_line->empty()) {
+ request_info_.extra_headers.SetHeader(
+ HttpRequestHeaders::kCookie, *cookie_line);
}
+ if (URLRequest::AreMacCookiesEnabled())
+ AddAuthorizationHeader(*cookie_infos, &request_info_);
+ DoStartTransaction();
+}
+
+void URLRequestHttpJob::DoStartTransaction() {
// We may have been canceled within CanGetCookies.
if (GetStatus().is_success()) {
StartTransaction();
@@ -575,12 +586,20 @@ void URLRequestHttpJob::SaveNextCookie() {
options.set_include_httponly();
if (CanSetCookie(
response_cookies_[response_cookies_save_index_], &options)) {
- request_->context()->cookie_store()->SetCookieWithOptions(
+ request_->context()->cookie_store()->SetCookieWithOptionsAsync(
request_->url(), response_cookies_[response_cookies_save_index_],
- options);
+ options, base::Bind(&URLRequestHttpJob::OnCookieSaved, this));
+ return;
}
}
+ CookieHandled();
+}
+
+void URLRequestHttpJob::OnCookieSaved(bool cookie_status) {
+ CookieHandled();
+}
+void URLRequestHttpJob::CookieHandled() {
response_cookies_save_index_++;
// We may have been canceled within OnSetCookie.
if (GetStatus().is_success()) {
diff --git a/net/url_request/url_request_http_job.h b/net/url_request/url_request_http_job.h
index c5b045d..94fb83f 100644
--- a/net/url_request/url_request_http_job.h
+++ b/net/url_request/url_request_http_job.h
@@ -15,6 +15,7 @@
#include "base/time.h"
#include "net/base/auth.h"
#include "net/base/completion_callback.h"
+#include "net/base/cookie_store.h"
#include "net/http/http_request_info.h"
#include "net/url_request/url_request_job.h"
#include "net/url_request/url_request_throttler_entry_interface.h"
@@ -161,6 +162,14 @@ class URLRequestHttpJob : public URLRequestJob {
void RecordPerfHistograms(CompletionCause reason);
void DoneWithRequest(CompletionCause reason);
+ // Callback functions for Cookie Monster
+ void OnCookiesLoaded(
+ std::string* cookie_line,
+ std::vector<CookieStore::CookieInfo>* cookie_infos);
+ void DoStartTransaction();
+ void OnCookieSaved(bool cookie_status);
+ void CookieHandled();
+
// Some servers send the body compressed, but specify the content length as
// the uncompressed size. If this is the case, we return true in order
// to request to work around this non-adherence to the HTTP standard.
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 7fe23bf..f6721ba 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -25,6 +25,7 @@
#include "base/stringprintf.h"
#include "base/utf_string_conversions.h"
#include "net/base/cookie_monster.h"
+#include "net/base/cookie_store_test_helpers.h"
#include "net/base/load_flags.h"
#include "net/base/mock_host_resolver.h"
#include "net/base/net_errors.h"
@@ -1631,6 +1632,43 @@ TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) {
}
}
+TEST_F(URLRequestTest, DelayedCookieCallback) {
+ TestServer test_server(TestServer::TYPE_HTTP, FilePath());
+ ASSERT_TRUE(test_server.Start());
+
+ scoped_refptr<URLRequestContext> context(new TestURLRequestContext());
+ scoped_refptr<DelayedCookieMonster> delayed_cm =
+ new DelayedCookieMonster();
+ scoped_refptr<CookieStore> cookie_store = delayed_cm;
+ context->set_cookie_store(delayed_cm);
+
+ // Set up a cookie.
+ {
+ TestDelegate d;
+ URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), &d);
+ req.set_context(context);
+ req.Start();
+ MessageLoop::current()->Run();
+ EXPECT_EQ(0, d.blocked_get_cookies_count());
+ EXPECT_EQ(0, d.blocked_set_cookie_count());
+ EXPECT_EQ(1, d.set_cookie_count());
+ }
+
+ // Verify that the cookie is set.
+ {
+ TestDelegate d;
+ TestURLRequest req(test_server.GetURL("echoheader?Cookie"), &d);
+ req.set_context(context);
+ req.Start();
+ MessageLoop::current()->Run();
+
+ EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
+ != std::string::npos);
+ EXPECT_EQ(0, d.blocked_get_cookies_count());
+ EXPECT_EQ(0, d.blocked_set_cookie_count());
+ }
+}
+
TEST_F(URLRequestTest, DoNotSendCookies) {
TestServer test_server(TestServer::TYPE_HTTP, FilePath());
ASSERT_TRUE(test_server.Start());