Home | History | Annotate | Download | only in url_request
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "build/build_config.h"
      6 
      7 #if defined(OS_WIN)
      8 #include <shlobj.h>
      9 #include <windows.h>
     10 #endif
     11 
     12 #include <algorithm>
     13 #include <string>
     14 
     15 #include "base/file_util.h"
     16 #include "base/format_macros.h"
     17 #include "base/message_loop.h"
     18 #include "base/path_service.h"
     19 #include "base/process_util.h"
     20 #include "base/string_number_conversions.h"
     21 #include "base/string_piece.h"
     22 #include "base/string_util.h"
     23 #include "base/stringprintf.h"
     24 #include "base/utf_string_conversions.h"
     25 #include "net/base/cookie_monster.h"
     26 #include "net/base/cookie_policy.h"
     27 #include "net/base/load_flags.h"
     28 #include "net/base/mock_host_resolver.h"
     29 #include "net/base/net_errors.h"
     30 #include "net/base/net_log.h"
     31 #include "net/base/net_log_unittest.h"
     32 #include "net/base/net_module.h"
     33 #include "net/base/net_util.h"
     34 #include "net/base/ssl_connection_status_flags.h"
     35 #include "net/base/upload_data.h"
     36 #include "net/disk_cache/disk_cache.h"
     37 #include "net/ftp/ftp_network_layer.h"
     38 #include "net/http/http_cache.h"
     39 #include "net/http/http_network_layer.h"
     40 #include "net/http/http_request_headers.h"
     41 #include "net/http/http_response_headers.h"
     42 #include "net/proxy/proxy_service.h"
     43 #include "net/test/test_server.h"
     44 #include "net/url_request/url_request.h"
     45 #include "net/url_request/url_request_file_dir_job.h"
     46 #include "net/url_request/url_request_http_job.h"
     47 #include "net/url_request/url_request_test_job.h"
     48 #include "net/url_request/url_request_test_util.h"
     49 #include "testing/gtest/include/gtest/gtest.h"
     50 #include "testing/platform_test.h"
     51 
     52 using base::Time;
     53 
     54 // We don't need a refcount because we are guaranteed the test will not proceed
     55 // until its task is run.
     56 namespace net {
     57 class BlockingNetworkDelegate;
     58 }  // namespace net
     59 DISABLE_RUNNABLE_METHOD_REFCOUNT(net::BlockingNetworkDelegate);
     60 
     61 namespace net {
     62 
     63 namespace {
     64 
     65 const string16 kChrome(ASCIIToUTF16("chrome"));
     66 const string16 kSecret(ASCIIToUTF16("secret"));
     67 const string16 kUser(ASCIIToUTF16("user"));
     68 
     69 base::StringPiece TestNetResourceProvider(int key) {
     70   return "header";
     71 }
     72 
     73 // Do a case-insensitive search through |haystack| for |needle|.
     74 bool ContainsString(const std::string& haystack, const char* needle) {
     75   std::string::const_iterator it =
     76       std::search(haystack.begin(),
     77                   haystack.end(),
     78                   needle,
     79                   needle + strlen(needle),
     80                   base::CaseInsensitiveCompare<char>());
     81   return it != haystack.end();
     82 }
     83 
     84 void FillBuffer(char* buffer, size_t len) {
     85   static bool called = false;
     86   if (!called) {
     87     called = true;
     88     int seed = static_cast<int>(Time::Now().ToInternalValue());
     89     srand(seed);
     90   }
     91 
     92   for (size_t i = 0; i < len; i++) {
     93     buffer[i] = static_cast<char>(rand());
     94     if (!buffer[i])
     95       buffer[i] = 'g';
     96   }
     97 }
     98 
     99 scoped_refptr<UploadData> CreateSimpleUploadData(const char* data) {
    100   scoped_refptr<UploadData> upload(new UploadData);
    101   upload->AppendBytes(data, strlen(data));
    102   return upload;
    103 }
    104 
    105 // Verify that the SSLInfo of a successful SSL connection has valid values.
    106 void CheckSSLInfo(const SSLInfo& ssl_info) {
    107   // Allow ChromeFrame fake SSLInfo to get through.
    108   if (ssl_info.cert.get() &&
    109       ssl_info.cert.get()->issuer().GetDisplayName() == "Chrome Internal") {
    110     // -1 means unknown.
    111     EXPECT_EQ(ssl_info.security_bits, -1);
    112     return;
    113   }
    114 
    115   // -1 means unknown.  0 means no encryption.
    116   EXPECT_GT(ssl_info.security_bits, 0);
    117 
    118   // The cipher suite TLS_NULL_WITH_NULL_NULL (0) must not be negotiated.
    119   int cipher_suite = SSLConnectionStatusToCipherSuite(
    120       ssl_info.connection_status);
    121   EXPECT_NE(0, cipher_suite);
    122 }
    123 
    124 }  // namespace
    125 
    126 // A network delegate that blocks requests, optionally cancelling or redirecting
    127 // them.
    128 class BlockingNetworkDelegate : public TestNetworkDelegate {
    129  public:
    130   BlockingNetworkDelegate() : callback_retval_(net::OK) {}
    131 
    132   void set_callback_retval(int retval) { callback_retval_ = retval; }
    133   void set_redirect_url(const GURL& url) { redirect_url_ = url; }
    134 
    135  private:
    136   // TestNetworkDelegate:
    137   virtual int OnBeforeURLRequest(net::URLRequest* request,
    138                                  net::CompletionCallback* callback,
    139                                  GURL* new_url) {
    140     TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url);
    141 
    142     if (!redirect_url_.is_empty())
    143       *new_url = redirect_url_;
    144     MessageLoop::current()->PostTask(FROM_HERE,
    145         NewRunnableMethod(this, &BlockingNetworkDelegate::DoCallback,
    146                           callback));
    147     return net::ERR_IO_PENDING;
    148   }
    149 
    150   void DoCallback(net::CompletionCallback* callback) {
    151     callback->Run(callback_retval_);
    152   }
    153 
    154   int callback_retval_;
    155   GURL redirect_url_;
    156 };
    157 
    158 // Inherit PlatformTest since we require the autorelease pool on Mac OS X.f
    159 class URLRequestTest : public PlatformTest {
    160  public:
    161   static void SetUpTestCase() {
    162     URLRequest::AllowFileAccess();
    163   }
    164 };
    165 
    166 class URLRequestTestHTTP : public URLRequestTest {
    167  public:
    168   URLRequestTestHTTP()
    169       : test_server_(TestServer::TYPE_HTTP,
    170                      FilePath(FILE_PATH_LITERAL(
    171                                   "net/data/url_request_unittest"))) {
    172   }
    173 
    174  protected:
    175   void HTTPUploadDataOperationTest(const std::string& method) {
    176     const int kMsgSize = 20000;  // multiple of 10
    177     const int kIterations = 50;
    178     char *uploadBytes = new char[kMsgSize+1];
    179     char *ptr = uploadBytes;
    180     char marker = 'a';
    181     for (int idx = 0; idx < kMsgSize/10; idx++) {
    182       memcpy(ptr, "----------", 10);
    183       ptr += 10;
    184       if (idx % 100 == 0) {
    185         ptr--;
    186         *ptr++ = marker;
    187         if (++marker > 'z')
    188           marker = 'a';
    189       }
    190     }
    191     uploadBytes[kMsgSize] = '\0';
    192 
    193     scoped_refptr<URLRequestContext> context(new TestURLRequestContext());
    194 
    195     for (int i = 0; i < kIterations; ++i) {
    196       TestDelegate d;
    197       URLRequest r(test_server_.GetURL("echo"), &d);
    198       r.set_context(context);
    199       r.set_method(method.c_str());
    200 
    201       r.AppendBytesToUpload(uploadBytes, kMsgSize);
    202 
    203       r.Start();
    204       EXPECT_TRUE(r.is_pending());
    205 
    206       MessageLoop::current()->Run();
    207 
    208       ASSERT_EQ(1, d.response_started_count()) << "request failed: " <<
    209           (int) r.status().status() << ", os error: " << r.status().os_error();
    210 
    211       EXPECT_FALSE(d.received_data_before_response());
    212       EXPECT_EQ(uploadBytes, d.data_received());
    213       EXPECT_EQ(memcmp(uploadBytes, d.data_received().c_str(), kMsgSize), 0);
    214       EXPECT_EQ(d.data_received().compare(uploadBytes), 0);
    215     }
    216     delete[] uploadBytes;
    217   }
    218 
    219   void AddChunksToUpload(TestURLRequest* r) {
    220     r->AppendChunkToUpload("a", 1, false);
    221     r->AppendChunkToUpload("bcd", 3, false);
    222     r->AppendChunkToUpload("this is a longer chunk than before.", 35, false);
    223     r->AppendChunkToUpload("\r\n\r\n", 4, false);
    224     r->AppendChunkToUpload("0", 1, false);
    225     r->AppendChunkToUpload("2323", 4, true);
    226   }
    227 
    228   void VerifyReceivedDataMatchesChunks(TestURLRequest* r, TestDelegate* d) {
    229     // This should match the chunks sent by AddChunksToUpload().
    230     const char* expected_data =
    231         "abcdthis is a longer chunk than before.\r\n\r\n02323";
    232 
    233     ASSERT_EQ(1, d->response_started_count()) << "request failed: " <<
    234         (int) r->status().status() << ", os error: " << r->status().os_error();
    235 
    236     EXPECT_FALSE(d->received_data_before_response());
    237 
    238     ASSERT_EQ(strlen(expected_data), static_cast<size_t>(d->bytes_received()));
    239     EXPECT_EQ(0, memcmp(d->data_received().c_str(), expected_data,
    240                         strlen(expected_data)));
    241   }
    242 
    243   TestServer test_server_;
    244 };
    245 
    246 // In this unit test, we're using the HTTPTestServer as a proxy server and
    247 // issuing a CONNECT request with the magic host name "www.redirect.com".
    248 // The HTTPTestServer will return a 302 response, which we should not
    249 // follow.
    250 TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) {
    251   ASSERT_TRUE(test_server_.Start());
    252 
    253   TestDelegate d;
    254   {
    255     URLRequest r(GURL("https://www.redirect.com/"), &d);
    256     r.set_context(
    257         new TestURLRequestContext(test_server_.host_port_pair().ToString()));
    258 
    259     r.Start();
    260     EXPECT_TRUE(r.is_pending());
    261 
    262     MessageLoop::current()->Run();
    263 
    264     EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
    265     EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().os_error());
    266     EXPECT_EQ(1, d.response_started_count());
    267     // We should not have followed the redirect.
    268     EXPECT_EQ(0, d.received_redirect_count());
    269   }
    270 }
    271 
    272 // This is the same as the previous test, but checks that the network delegate
    273 // registers the error.
    274 TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) {
    275   ASSERT_TRUE(test_server_.Start());
    276 
    277   TestDelegate d;
    278   {
    279     TestNetworkDelegate network_delegate;  // must outlive URLRequest
    280     URLRequest r(GURL("https://www.redirect.com/"), &d);
    281     scoped_refptr<TestURLRequestContext> context(
    282         new TestURLRequestContext(test_server_.host_port_pair().ToString()));
    283     context->set_network_delegate(&network_delegate);
    284     r.set_context(context);
    285 
    286     r.Start();
    287     EXPECT_TRUE(r.is_pending());
    288 
    289     MessageLoop::current()->Run();
    290 
    291     EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
    292     EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().os_error());
    293     EXPECT_EQ(1, d.response_started_count());
    294     // We should not have followed the redirect.
    295     EXPECT_EQ(0, d.received_redirect_count());
    296 
    297     EXPECT_EQ(1, network_delegate.error_count());
    298     EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED,
    299               network_delegate.last_os_error());
    300   }
    301 }
    302 
    303 // Tests that the network delegate can block and cancel a request.
    304 TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequest) {
    305   ASSERT_TRUE(test_server_.Start());
    306 
    307   TestDelegate d;
    308   BlockingNetworkDelegate network_delegate;
    309   network_delegate.set_callback_retval(ERR_EMPTY_RESPONSE);
    310 
    311   {
    312     TestURLRequest r(test_server_.GetURL(""), &d);
    313     scoped_refptr<TestURLRequestContext> context(
    314         new TestURLRequestContext(test_server_.host_port_pair().ToString()));
    315     context->set_network_delegate(&network_delegate);
    316     r.set_context(context);
    317 
    318     r.Start();
    319     MessageLoop::current()->Run();
    320 
    321     EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
    322     EXPECT_EQ(ERR_EMPTY_RESPONSE, r.status().os_error());
    323     EXPECT_EQ(1, network_delegate.created_requests());
    324     EXPECT_EQ(0, network_delegate.destroyed_requests());
    325   }
    326   EXPECT_EQ(1, network_delegate.destroyed_requests());
    327 }
    328 
    329 // Tests that the network delegate can block and redirect a request to a new
    330 // URL.
    331 TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequest) {
    332   ASSERT_TRUE(test_server_.Start());
    333 
    334   TestDelegate d;
    335   BlockingNetworkDelegate network_delegate;
    336   GURL redirect_url(test_server_.GetURL("simple.html"));
    337   network_delegate.set_redirect_url(redirect_url);
    338 
    339   {
    340     GURL original_url(test_server_.GetURL("empty.html"));
    341     TestURLRequest r(original_url, &d);
    342     scoped_refptr<TestURLRequestContext> context(
    343         new TestURLRequestContext(test_server_.host_port_pair().ToString()));
    344     context->set_network_delegate(&network_delegate);
    345     r.set_context(context);
    346 
    347     r.Start();
    348     MessageLoop::current()->Run();
    349 
    350     EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
    351     EXPECT_EQ(0, r.status().os_error());
    352     EXPECT_EQ(redirect_url, r.url());
    353     EXPECT_EQ(original_url, r.original_url());
    354     EXPECT_EQ(2U, r.url_chain().size());
    355     EXPECT_EQ(1, network_delegate.created_requests());
    356     EXPECT_EQ(0, network_delegate.destroyed_requests());
    357   }
    358   EXPECT_EQ(1, network_delegate.destroyed_requests());
    359 }
    360 
    361 // In this unit test, we're using the HTTPTestServer as a proxy server and
    362 // issuing a CONNECT request with the magic host name "www.server-auth.com".
    363 // The HTTPTestServer will return a 401 response, which we should balk at.
    364 TEST_F(URLRequestTestHTTP, UnexpectedServerAuthTest) {
    365   ASSERT_TRUE(test_server_.Start());
    366 
    367   TestDelegate d;
    368   {
    369     URLRequest r(GURL("https://www.server-auth.com/"), &d);
    370     r.set_context(
    371         new TestURLRequestContext(test_server_.host_port_pair().ToString()));
    372 
    373     r.Start();
    374     EXPECT_TRUE(r.is_pending());
    375 
    376     MessageLoop::current()->Run();
    377 
    378     EXPECT_EQ(URLRequestStatus::FAILED, r.status().status());
    379     EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, r.status().os_error());
    380   }
    381 }
    382 
    383 TEST_F(URLRequestTestHTTP, GetTest_NoCache) {
    384   ASSERT_TRUE(test_server_.Start());
    385 
    386   TestDelegate d;
    387   {
    388     TestURLRequest r(test_server_.GetURL(""), &d);
    389 
    390     r.Start();
    391     EXPECT_TRUE(r.is_pending());
    392 
    393     MessageLoop::current()->Run();
    394 
    395     EXPECT_EQ(1, d.response_started_count());
    396     EXPECT_FALSE(d.received_data_before_response());
    397     EXPECT_NE(0, d.bytes_received());
    398     EXPECT_EQ(test_server_.host_port_pair().host(),
    399               r.GetSocketAddress().host());
    400     EXPECT_EQ(test_server_.host_port_pair().port(),
    401               r.GetSocketAddress().port());
    402 
    403     // TODO(eroman): Add back the NetLog tests...
    404   }
    405 }
    406 
    407 TEST_F(URLRequestTestHTTP, GetTest) {
    408   ASSERT_TRUE(test_server_.Start());
    409 
    410   TestDelegate d;
    411   {
    412     TestURLRequest r(test_server_.GetURL(""), &d);
    413 
    414     r.Start();
    415     EXPECT_TRUE(r.is_pending());
    416 
    417     MessageLoop::current()->Run();
    418 
    419     EXPECT_EQ(1, d.response_started_count());
    420     EXPECT_FALSE(d.received_data_before_response());
    421     EXPECT_NE(0, d.bytes_received());
    422     EXPECT_EQ(test_server_.host_port_pair().host(),
    423               r.GetSocketAddress().host());
    424     EXPECT_EQ(test_server_.host_port_pair().port(),
    425               r.GetSocketAddress().port());
    426   }
    427 }
    428 
    429 TEST_F(URLRequestTestHTTP, HTTPSToHTTPRedirectNoRefererTest) {
    430   ASSERT_TRUE(test_server_.Start());
    431 
    432   TestServer https_test_server(
    433       TestServer::TYPE_HTTPS, FilePath(FILE_PATH_LITERAL("net/data/ssl")));
    434   ASSERT_TRUE(https_test_server.Start());
    435 
    436   // An https server is sent a request with an https referer,
    437   // and responds with a redirect to an http url. The http
    438   // server should not be sent the referer.
    439   GURL http_destination = test_server_.GetURL("");
    440   TestDelegate d;
    441   TestURLRequest req(https_test_server.GetURL(
    442       "server-redirect?" + http_destination.spec()), &d);
    443   req.set_referrer("https://www.referrer.com/");
    444   req.Start();
    445   MessageLoop::current()->Run();
    446 
    447   EXPECT_EQ(1, d.response_started_count());
    448   EXPECT_EQ(1, d.received_redirect_count());
    449   EXPECT_EQ(http_destination, req.url());
    450   EXPECT_EQ(std::string(), req.referrer());
    451 }
    452 
    453 TEST_F(URLRequestTestHTTP, MultipleRedirectTest) {
    454   ASSERT_TRUE(test_server_.Start());
    455 
    456   GURL destination_url = test_server_.GetURL("");
    457   GURL middle_redirect_url = test_server_.GetURL(
    458       "server-redirect?" + destination_url.spec());
    459   GURL original_url = test_server_.GetURL(
    460       "server-redirect?" + middle_redirect_url.spec());
    461   TestDelegate d;
    462   TestURLRequest req(original_url, &d);
    463   req.Start();
    464   MessageLoop::current()->Run();
    465 
    466   EXPECT_EQ(1, d.response_started_count());
    467   EXPECT_EQ(2, d.received_redirect_count());
    468   EXPECT_EQ(destination_url, req.url());
    469   EXPECT_EQ(original_url, req.original_url());
    470   ASSERT_EQ(3U, req.url_chain().size());
    471   EXPECT_EQ(original_url, req.url_chain()[0]);
    472   EXPECT_EQ(middle_redirect_url, req.url_chain()[1]);
    473   EXPECT_EQ(destination_url, req.url_chain()[2]);
    474 }
    475 
    476 class HTTPSRequestTest : public testing::Test {
    477 };
    478 
    479 TEST_F(HTTPSRequestTest, HTTPSGetTest) {
    480   TestServer test_server(TestServer::TYPE_HTTPS,
    481                               FilePath(FILE_PATH_LITERAL("net/data/ssl")));
    482   ASSERT_TRUE(test_server.Start());
    483 
    484   TestDelegate d;
    485   {
    486     TestURLRequest r(test_server.GetURL(""), &d);
    487 
    488     r.Start();
    489     EXPECT_TRUE(r.is_pending());
    490 
    491     MessageLoop::current()->Run();
    492 
    493     EXPECT_EQ(1, d.response_started_count());
    494     EXPECT_FALSE(d.received_data_before_response());
    495     EXPECT_NE(0, d.bytes_received());
    496     CheckSSLInfo(r.ssl_info());
    497     EXPECT_EQ(test_server.host_port_pair().host(),
    498               r.GetSocketAddress().host());
    499     EXPECT_EQ(test_server.host_port_pair().port(),
    500               r.GetSocketAddress().port());
    501   }
    502 }
    503 
    504 TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) {
    505   TestServer::HTTPSOptions https_options(
    506       TestServer::HTTPSOptions::CERT_MISMATCHED_NAME);
    507   TestServer test_server(https_options,
    508                               FilePath(FILE_PATH_LITERAL("net/data/ssl")));
    509   ASSERT_TRUE(test_server.Start());
    510 
    511   bool err_allowed = true;
    512   for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
    513     TestDelegate d;
    514     {
    515       d.set_allow_certificate_errors(err_allowed);
    516       TestURLRequest r(test_server.GetURL(""), &d);
    517 
    518       r.Start();
    519       EXPECT_TRUE(r.is_pending());
    520 
    521       MessageLoop::current()->Run();
    522 
    523       EXPECT_EQ(1, d.response_started_count());
    524       EXPECT_FALSE(d.received_data_before_response());
    525       EXPECT_TRUE(d.have_certificate_errors());
    526       if (err_allowed) {
    527         EXPECT_NE(0, d.bytes_received());
    528         CheckSSLInfo(r.ssl_info());
    529       } else {
    530         EXPECT_EQ(0, d.bytes_received());
    531       }
    532     }
    533   }
    534 }
    535 
    536 TEST_F(HTTPSRequestTest, HTTPSExpiredTest) {
    537   TestServer::HTTPSOptions https_options(
    538       TestServer::HTTPSOptions::CERT_EXPIRED);
    539   TestServer test_server(https_options,
    540                               FilePath(FILE_PATH_LITERAL("net/data/ssl")));
    541   ASSERT_TRUE(test_server.Start());
    542 
    543   // Iterate from false to true, just so that we do the opposite of the
    544   // previous test in order to increase test coverage.
    545   bool err_allowed = false;
    546   for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
    547     TestDelegate d;
    548     {
    549       d.set_allow_certificate_errors(err_allowed);
    550       TestURLRequest r(test_server.GetURL(""), &d);
    551 
    552       r.Start();
    553       EXPECT_TRUE(r.is_pending());
    554 
    555       MessageLoop::current()->Run();
    556 
    557       EXPECT_EQ(1, d.response_started_count());
    558       EXPECT_FALSE(d.received_data_before_response());
    559       EXPECT_TRUE(d.have_certificate_errors());
    560       if (err_allowed) {
    561         EXPECT_NE(0, d.bytes_received());
    562         CheckSSLInfo(r.ssl_info());
    563       } else {
    564         EXPECT_EQ(0, d.bytes_received());
    565       }
    566     }
    567   }
    568 }
    569 
    570 namespace {
    571 
    572 class SSLClientAuthTestDelegate : public TestDelegate {
    573  public:
    574   SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) {
    575   }
    576   virtual void OnCertificateRequested(
    577       URLRequest* request,
    578       SSLCertRequestInfo* cert_request_info) {
    579     on_certificate_requested_count_++;
    580     MessageLoop::current()->Quit();
    581   }
    582   int on_certificate_requested_count() {
    583     return on_certificate_requested_count_;
    584   }
    585  private:
    586   int on_certificate_requested_count_;
    587 };
    588 
    589 }  // namespace
    590 
    591 // TODO(davidben): Test the rest of the code. Specifically,
    592 // - Filtering which certificates to select.
    593 // - Sending a certificate back.
    594 // - Getting a certificate request in an SSL renegotiation sending the
    595 //   HTTP request.
    596 TEST_F(HTTPSRequestTest, ClientAuthTest) {
    597   TestServer::HTTPSOptions https_options;
    598   https_options.request_client_certificate = true;
    599   TestServer test_server(https_options,
    600                               FilePath(FILE_PATH_LITERAL("net/data/ssl")));
    601   ASSERT_TRUE(test_server.Start());
    602 
    603   SSLClientAuthTestDelegate d;
    604   {
    605     TestURLRequest r(test_server.GetURL(""), &d);
    606 
    607     r.Start();
    608     EXPECT_TRUE(r.is_pending());
    609 
    610     MessageLoop::current()->Run();
    611 
    612     EXPECT_EQ(1, d.on_certificate_requested_count());
    613     EXPECT_FALSE(d.received_data_before_response());
    614     EXPECT_EQ(0, d.bytes_received());
    615 
    616     // Send no certificate.
    617     // TODO(davidben): Get temporary client cert import (with keys) working on
    618     // all platforms so we can test sending a cert as well.
    619     r.ContinueWithCertificate(NULL);
    620 
    621     MessageLoop::current()->Run();
    622 
    623     EXPECT_EQ(1, d.response_started_count());
    624     EXPECT_FALSE(d.received_data_before_response());
    625     EXPECT_NE(0, d.bytes_received());
    626   }
    627 }
    628 
    629 TEST_F(URLRequestTestHTTP, CancelTest) {
    630   TestDelegate d;
    631   {
    632     TestURLRequest r(GURL("http://www.google.com/"), &d);
    633 
    634     r.Start();
    635     EXPECT_TRUE(r.is_pending());
    636 
    637     r.Cancel();
    638 
    639     MessageLoop::current()->Run();
    640 
    641     // We expect to receive OnResponseStarted even though the request has been
    642     // cancelled.
    643     EXPECT_EQ(1, d.response_started_count());
    644     EXPECT_EQ(0, d.bytes_received());
    645     EXPECT_FALSE(d.received_data_before_response());
    646   }
    647 }
    648 
    649 TEST_F(URLRequestTestHTTP, CancelTest2) {
    650   ASSERT_TRUE(test_server_.Start());
    651 
    652   TestDelegate d;
    653   {
    654     TestURLRequest r(test_server_.GetURL(""), &d);
    655 
    656     d.set_cancel_in_response_started(true);
    657 
    658     r.Start();
    659     EXPECT_TRUE(r.is_pending());
    660 
    661     MessageLoop::current()->Run();
    662 
    663     EXPECT_EQ(1, d.response_started_count());
    664     EXPECT_EQ(0, d.bytes_received());
    665     EXPECT_FALSE(d.received_data_before_response());
    666     EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
    667   }
    668 }
    669 
    670 TEST_F(URLRequestTestHTTP, CancelTest3) {
    671   ASSERT_TRUE(test_server_.Start());
    672 
    673   TestDelegate d;
    674   {
    675     TestURLRequest r(test_server_.GetURL(""), &d);
    676 
    677     d.set_cancel_in_received_data(true);
    678 
    679     r.Start();
    680     EXPECT_TRUE(r.is_pending());
    681 
    682     MessageLoop::current()->Run();
    683 
    684     EXPECT_EQ(1, d.response_started_count());
    685     // There is no guarantee about how much data was received
    686     // before the cancel was issued.  It could have been 0 bytes,
    687     // or it could have been all the bytes.
    688     // EXPECT_EQ(0, d.bytes_received());
    689     EXPECT_FALSE(d.received_data_before_response());
    690     EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
    691   }
    692 }
    693 
    694 TEST_F(URLRequestTestHTTP, CancelTest4) {
    695   ASSERT_TRUE(test_server_.Start());
    696 
    697   TestDelegate d;
    698   {
    699     TestURLRequest r(test_server_.GetURL(""), &d);
    700 
    701     r.Start();
    702     EXPECT_TRUE(r.is_pending());
    703 
    704     // The request will be implicitly canceled when it is destroyed. The
    705     // test delegate must not post a quit message when this happens because
    706     // this test doesn't actually have a message loop. The quit message would
    707     // get put on this thread's message queue and the next test would exit
    708     // early, causing problems.
    709     d.set_quit_on_complete(false);
    710   }
    711   // expect things to just cleanup properly.
    712 
    713   // we won't actually get a received reponse here because we've never run the
    714   // message loop
    715   EXPECT_FALSE(d.received_data_before_response());
    716   EXPECT_EQ(0, d.bytes_received());
    717 }
    718 
    719 TEST_F(URLRequestTestHTTP, CancelTest5) {
    720   ASSERT_TRUE(test_server_.Start());
    721 
    722   scoped_refptr<URLRequestContext> context(new TestURLRequestContext());
    723 
    724   // populate cache
    725   {
    726     TestDelegate d;
    727     URLRequest r(test_server_.GetURL("cachetime"), &d);
    728     r.set_context(context);
    729     r.Start();
    730     MessageLoop::current()->Run();
    731     EXPECT_EQ(URLRequestStatus::SUCCESS, r.status().status());
    732   }
    733 
    734   // cancel read from cache (see bug 990242)
    735   {
    736     TestDelegate d;
    737     URLRequest r(test_server_.GetURL("cachetime"), &d);
    738     r.set_context(context);
    739     r.Start();
    740     r.Cancel();
    741     MessageLoop::current()->Run();
    742 
    743     EXPECT_EQ(URLRequestStatus::CANCELED, r.status().status());
    744     EXPECT_EQ(1, d.response_started_count());
    745     EXPECT_EQ(0, d.bytes_received());
    746     EXPECT_FALSE(d.received_data_before_response());
    747   }
    748 }
    749 
    750 TEST_F(URLRequestTestHTTP, PostTest) {
    751   ASSERT_TRUE(test_server_.Start());
    752   HTTPUploadDataOperationTest("POST");
    753 }
    754 
    755 TEST_F(URLRequestTestHTTP, PutTest) {
    756   ASSERT_TRUE(test_server_.Start());
    757   HTTPUploadDataOperationTest("PUT");
    758 }
    759 
    760 TEST_F(URLRequestTestHTTP, PostEmptyTest) {
    761   ASSERT_TRUE(test_server_.Start());
    762 
    763   TestDelegate d;
    764   {
    765     TestURLRequest r(test_server_.GetURL("echo"), &d);
    766     r.set_method("POST");
    767 
    768     r.Start();
    769     EXPECT_TRUE(r.is_pending());
    770 
    771     MessageLoop::current()->Run();
    772 
    773     ASSERT_EQ(1, d.response_started_count()) << "request failed: " <<
    774         (int) r.status().status() << ", os error: " << r.status().os_error();
    775 
    776     EXPECT_FALSE(d.received_data_before_response());
    777     EXPECT_TRUE(d.data_received().empty());
    778   }
    779 }
    780 
    781 TEST_F(URLRequestTestHTTP, PostFileTest) {
    782   ASSERT_TRUE(test_server_.Start());
    783 
    784   TestDelegate d;
    785   {
    786     TestURLRequest r(test_server_.GetURL("echo"), &d);
    787     r.set_method("POST");
    788 
    789     FilePath dir;
    790     PathService::Get(base::DIR_EXE, &dir);
    791     file_util::SetCurrentDirectory(dir);
    792 
    793     FilePath path;
    794     PathService::Get(base::DIR_SOURCE_ROOT, &path);
    795     path = path.Append(FILE_PATH_LITERAL("net"));
    796     path = path.Append(FILE_PATH_LITERAL("data"));
    797     path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
    798     path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
    799     r.AppendFileToUpload(path);
    800 
    801     // This file should just be ignored in the upload stream.
    802     r.AppendFileToUpload(FilePath(FILE_PATH_LITERAL(
    803         "c:\\path\\to\\non\\existant\\file.randomness.12345")));
    804 
    805     r.Start();
    806     EXPECT_TRUE(r.is_pending());
    807 
    808     MessageLoop::current()->Run();
    809 
    810     int64 longsize;
    811     ASSERT_EQ(true, file_util::GetFileSize(path, &longsize));
    812     int size = static_cast<int>(longsize);
    813     scoped_array<char> buf(new char[size]);
    814 
    815     int size_read = static_cast<int>(file_util::ReadFile(path,
    816         buf.get(), size));
    817     ASSERT_EQ(size, size_read);
    818 
    819     ASSERT_EQ(1, d.response_started_count()) << "request failed: " <<
    820         (int) r.status().status() << ", os error: " << r.status().os_error();
    821 
    822     EXPECT_FALSE(d.received_data_before_response());
    823 
    824     ASSERT_EQ(size, d.bytes_received());
    825     EXPECT_EQ(0, memcmp(d.data_received().c_str(), buf.get(), size));
    826   }
    827 }
    828 
    829 TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) {
    830   ASSERT_TRUE(test_server_.Start());
    831 
    832   TestDelegate d;
    833   {
    834     TestURLRequest r(test_server_.GetURL("echo"), &d);
    835     r.EnableChunkedUpload();
    836     r.set_method("POST");
    837     AddChunksToUpload(&r);
    838     r.Start();
    839     EXPECT_TRUE(r.is_pending());
    840 
    841     MessageLoop::current()->Run();
    842 
    843     VerifyReceivedDataMatchesChunks(&r, &d);
    844   }
    845 }
    846 
    847 TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) {
    848   ASSERT_TRUE(test_server_.Start());
    849 
    850   TestDelegate d;
    851   {
    852     TestURLRequest r(test_server_.GetURL("echo"), &d);
    853     r.EnableChunkedUpload();
    854     r.set_method("POST");
    855     r.Start();
    856     EXPECT_TRUE(r.is_pending());
    857 
    858     MessageLoop::current()->RunAllPending();
    859     AddChunksToUpload(&r);
    860     MessageLoop::current()->Run();
    861 
    862     VerifyReceivedDataMatchesChunks(&r, &d);
    863   }
    864 }
    865 
    866 TEST_F(URLRequestTest, AboutBlankTest) {
    867   TestDelegate d;
    868   {
    869     TestURLRequest r(GURL("about:blank"), &d);
    870 
    871     r.Start();
    872     EXPECT_TRUE(r.is_pending());
    873 
    874     MessageLoop::current()->Run();
    875 
    876     EXPECT_TRUE(!r.is_pending());
    877     EXPECT_FALSE(d.received_data_before_response());
    878     EXPECT_EQ(d.bytes_received(), 0);
    879     EXPECT_EQ("", r.GetSocketAddress().host());
    880     EXPECT_EQ(0, r.GetSocketAddress().port());
    881   }
    882 }
    883 
    884 TEST_F(URLRequestTest, DataURLImageTest) {
    885   TestDelegate d;
    886   {
    887     // Use our nice little Chrome logo.
    888     TestURLRequest r(GURL(
    889         "data:image/png;base64,"
    890         "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUBBjG3"
    891         "w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQxIEVxitD"
    892         "5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI5MpCVdW0gO7t"
    893         "vNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKzMx1+fg9bAgK6zHq9"
    894         "cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7CkIMDxQpF7r/MWq12UctI1"
    895         "dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0WYUqt57yWf2McHTObYPbVD+Z"
    896         "wbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2HQQcm43XwmtoYM6vVKleh0uoWvnzW"
    897         "3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nkDFHF9ZS+uYVjRUasMeHUmyLYtcklTvzW"
    898         "GFZnNOXczThvpKIzjcahSqIzkvDLayDq6D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTb"
    899         "xXX1T5xsV9tm9r4TQwHLiZw/pdDZJea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5"
    900         "MrVvMzNaI3+ERHfrFzPKQukrQGI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gV"
    901         "Md6q5c8GdosynKmSeRuGzpjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq"
    902         "/uxxZKzNiZFGD0wRC3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7F"
    903         "Ux1qLnV7MGF40smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufB"
    904         "JbsysjjW4kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJM"
    905         "nlm2O34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfm"
    906         "moRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV5En"
    907         "hORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="),
    908         &d);
    909 
    910     r.Start();
    911     EXPECT_TRUE(r.is_pending());
    912 
    913     MessageLoop::current()->Run();
    914 
    915     EXPECT_TRUE(!r.is_pending());
    916     EXPECT_FALSE(d.received_data_before_response());
    917     EXPECT_EQ(d.bytes_received(), 911);
    918     EXPECT_EQ("", r.GetSocketAddress().host());
    919     EXPECT_EQ(0, r.GetSocketAddress().port());
    920   }
    921 }
    922 
    923 TEST_F(URLRequestTest, FileTest) {
    924   FilePath app_path;
    925   PathService::Get(base::FILE_EXE, &app_path);
    926   GURL app_url = FilePathToFileURL(app_path);
    927 
    928   TestDelegate d;
    929   {
    930     TestURLRequest r(app_url, &d);
    931 
    932     r.Start();
    933     EXPECT_TRUE(r.is_pending());
    934 
    935     MessageLoop::current()->Run();
    936 
    937     int64 file_size = -1;
    938     EXPECT_TRUE(file_util::GetFileSize(app_path, &file_size));
    939 
    940     EXPECT_TRUE(!r.is_pending());
    941     EXPECT_EQ(1, d.response_started_count());
    942     EXPECT_FALSE(d.received_data_before_response());
    943     EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
    944     EXPECT_EQ("", r.GetSocketAddress().host());
    945     EXPECT_EQ(0, r.GetSocketAddress().port());
    946   }
    947 }
    948 
    949 TEST_F(URLRequestTest, FileTestFullSpecifiedRange) {
    950   const size_t buffer_size = 4000;
    951   scoped_array<char> buffer(new char[buffer_size]);
    952   FillBuffer(buffer.get(), buffer_size);
    953 
    954   FilePath temp_path;
    955   EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
    956   GURL temp_url = FilePathToFileURL(temp_path);
    957   EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
    958 
    959   int64 file_size;
    960   EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
    961 
    962   const size_t first_byte_position = 500;
    963   const size_t last_byte_position = buffer_size - first_byte_position;
    964   const size_t content_length = last_byte_position - first_byte_position + 1;
    965   std::string partial_buffer_string(buffer.get() + first_byte_position,
    966                                     buffer.get() + last_byte_position + 1);
    967 
    968   TestDelegate d;
    969   {
    970     TestURLRequest r(temp_url, &d);
    971 
    972     HttpRequestHeaders headers;
    973     headers.SetHeader(HttpRequestHeaders::kRange,
    974                       base::StringPrintf(
    975                            "bytes=%" PRIuS "-%" PRIuS,
    976                            first_byte_position, last_byte_position));
    977     r.SetExtraRequestHeaders(headers);
    978     r.Start();
    979     EXPECT_TRUE(r.is_pending());
    980 
    981     MessageLoop::current()->Run();
    982     EXPECT_TRUE(!r.is_pending());
    983     EXPECT_EQ(1, d.response_started_count());
    984     EXPECT_FALSE(d.received_data_before_response());
    985     EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
    986     // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
    987     EXPECT_TRUE(partial_buffer_string == d.data_received());
    988   }
    989 
    990   EXPECT_TRUE(file_util::Delete(temp_path, false));
    991 }
    992 
    993 TEST_F(URLRequestTest, FileTestHalfSpecifiedRange) {
    994   const size_t buffer_size = 4000;
    995   scoped_array<char> buffer(new char[buffer_size]);
    996   FillBuffer(buffer.get(), buffer_size);
    997 
    998   FilePath temp_path;
    999   EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
   1000   GURL temp_url = FilePathToFileURL(temp_path);
   1001   EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
   1002 
   1003   int64 file_size;
   1004   EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
   1005 
   1006   const size_t first_byte_position = 500;
   1007   const size_t last_byte_position = buffer_size - 1;
   1008   const size_t content_length = last_byte_position - first_byte_position + 1;
   1009   std::string partial_buffer_string(buffer.get() + first_byte_position,
   1010                                     buffer.get() + last_byte_position + 1);
   1011 
   1012   TestDelegate d;
   1013   {
   1014     TestURLRequest r(temp_url, &d);
   1015 
   1016     HttpRequestHeaders headers;
   1017     headers.SetHeader(HttpRequestHeaders::kRange,
   1018                       base::StringPrintf("bytes=%" PRIuS "-",
   1019                                          first_byte_position));
   1020     r.SetExtraRequestHeaders(headers);
   1021     r.Start();
   1022     EXPECT_TRUE(r.is_pending());
   1023 
   1024     MessageLoop::current()->Run();
   1025     EXPECT_TRUE(!r.is_pending());
   1026     EXPECT_EQ(1, d.response_started_count());
   1027     EXPECT_FALSE(d.received_data_before_response());
   1028     EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
   1029     // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
   1030     EXPECT_TRUE(partial_buffer_string == d.data_received());
   1031   }
   1032 
   1033   EXPECT_TRUE(file_util::Delete(temp_path, false));
   1034 }
   1035 
   1036 TEST_F(URLRequestTest, FileTestMultipleRanges) {
   1037   const size_t buffer_size = 400000;
   1038   scoped_array<char> buffer(new char[buffer_size]);
   1039   FillBuffer(buffer.get(), buffer_size);
   1040 
   1041   FilePath temp_path;
   1042   EXPECT_TRUE(file_util::CreateTemporaryFile(&temp_path));
   1043   GURL temp_url = FilePathToFileURL(temp_path);
   1044   EXPECT_TRUE(file_util::WriteFile(temp_path, buffer.get(), buffer_size));
   1045 
   1046   int64 file_size;
   1047   EXPECT_TRUE(file_util::GetFileSize(temp_path, &file_size));
   1048 
   1049   TestDelegate d;
   1050   {
   1051     TestURLRequest r(temp_url, &d);
   1052 
   1053     HttpRequestHeaders headers;
   1054     headers.SetHeader(HttpRequestHeaders::kRange,
   1055                       "bytes=0-0,10-200,200-300");
   1056     r.SetExtraRequestHeaders(headers);
   1057     r.Start();
   1058     EXPECT_TRUE(r.is_pending());
   1059 
   1060     MessageLoop::current()->Run();
   1061     EXPECT_TRUE(d.request_failed());
   1062   }
   1063 
   1064   EXPECT_TRUE(file_util::Delete(temp_path, false));
   1065 }
   1066 
   1067 TEST_F(URLRequestTest, InvalidUrlTest) {
   1068   TestDelegate d;
   1069   {
   1070     TestURLRequest r(GURL("invalid url"), &d);
   1071 
   1072     r.Start();
   1073     EXPECT_TRUE(r.is_pending());
   1074 
   1075     MessageLoop::current()->Run();
   1076     EXPECT_TRUE(d.request_failed());
   1077   }
   1078 }
   1079 
   1080 TEST_F(URLRequestTestHTTP, ResponseHeadersTest) {
   1081   ASSERT_TRUE(test_server_.Start());
   1082 
   1083   TestDelegate d;
   1084   TestURLRequest req(test_server_.GetURL("files/with-headers.html"), &d);
   1085   req.Start();
   1086   MessageLoop::current()->Run();
   1087 
   1088   const HttpResponseHeaders* headers = req.response_headers();
   1089 
   1090   // Simple sanity check that response_info() accesses the same data.
   1091   EXPECT_EQ(headers, req.response_info().headers.get());
   1092 
   1093   std::string header;
   1094   EXPECT_TRUE(headers->GetNormalizedHeader("cache-control", &header));
   1095   EXPECT_EQ("private", header);
   1096 
   1097   header.clear();
   1098   EXPECT_TRUE(headers->GetNormalizedHeader("content-type", &header));
   1099   EXPECT_EQ("text/html; charset=ISO-8859-1", header);
   1100 
   1101   // The response has two "X-Multiple-Entries" headers.
   1102   // This verfies our output has them concatenated together.
   1103   header.clear();
   1104   EXPECT_TRUE(headers->GetNormalizedHeader("x-multiple-entries", &header));
   1105   EXPECT_EQ("a, b", header);
   1106 }
   1107 
   1108 #if defined(OS_WIN)
   1109 TEST_F(URLRequestTest, ResolveShortcutTest) {
   1110   FilePath app_path;
   1111   PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
   1112   app_path = app_path.AppendASCII("net");
   1113   app_path = app_path.AppendASCII("data");
   1114   app_path = app_path.AppendASCII("url_request_unittest");
   1115   app_path = app_path.AppendASCII("with-headers.html");
   1116 
   1117   std::wstring lnk_path = app_path.value() + L".lnk";
   1118 
   1119   HRESULT result;
   1120   IShellLink *shell = NULL;
   1121   IPersistFile *persist = NULL;
   1122 
   1123   CoInitialize(NULL);
   1124   // Temporarily create a shortcut for test
   1125   result = CoCreateInstance(CLSID_ShellLink, NULL,
   1126                             CLSCTX_INPROC_SERVER, IID_IShellLink,
   1127                             reinterpret_cast<LPVOID*>(&shell));
   1128   ASSERT_TRUE(SUCCEEDED(result));
   1129   result = shell->QueryInterface(IID_IPersistFile,
   1130                                 reinterpret_cast<LPVOID*>(&persist));
   1131   ASSERT_TRUE(SUCCEEDED(result));
   1132   result = shell->SetPath(app_path.value().c_str());
   1133   EXPECT_TRUE(SUCCEEDED(result));
   1134   result = shell->SetDescription(L"ResolveShortcutTest");
   1135   EXPECT_TRUE(SUCCEEDED(result));
   1136   result = persist->Save(lnk_path.c_str(), TRUE);
   1137   EXPECT_TRUE(SUCCEEDED(result));
   1138   if (persist)
   1139     persist->Release();
   1140   if (shell)
   1141     shell->Release();
   1142 
   1143   TestDelegate d;
   1144   {
   1145     TestURLRequest r(FilePathToFileURL(FilePath(lnk_path)), &d);
   1146 
   1147     r.Start();
   1148     EXPECT_TRUE(r.is_pending());
   1149 
   1150     MessageLoop::current()->Run();
   1151 
   1152     WIN32_FILE_ATTRIBUTE_DATA data;
   1153     GetFileAttributesEx(app_path.value().c_str(),
   1154                         GetFileExInfoStandard, &data);
   1155     HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ,
   1156                              FILE_SHARE_READ, NULL, OPEN_EXISTING,
   1157                              FILE_ATTRIBUTE_NORMAL, NULL);
   1158     EXPECT_NE(INVALID_HANDLE_VALUE, file);
   1159     scoped_array<char> buffer(new char[data.nFileSizeLow]);
   1160     DWORD read_size;
   1161     BOOL result;
   1162     result = ReadFile(file, buffer.get(), data.nFileSizeLow,
   1163                       &read_size, NULL);
   1164     std::string content(buffer.get(), read_size);
   1165     CloseHandle(file);
   1166 
   1167     EXPECT_TRUE(!r.is_pending());
   1168     EXPECT_EQ(1, d.received_redirect_count());
   1169     EXPECT_EQ(content, d.data_received());
   1170   }
   1171 
   1172   // Clean the shortcut
   1173   DeleteFile(lnk_path.c_str());
   1174   CoUninitialize();
   1175 }
   1176 #endif  // defined(OS_WIN)
   1177 
   1178 TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) {
   1179   ASSERT_TRUE(test_server_.Start());
   1180 
   1181   TestDelegate d;
   1182   TestURLRequest req(test_server_.GetURL(
   1183       "files/content-type-normalization.html"), &d);
   1184   req.Start();
   1185   MessageLoop::current()->Run();
   1186 
   1187   std::string mime_type;
   1188   req.GetMimeType(&mime_type);
   1189   EXPECT_EQ("text/html", mime_type);
   1190 
   1191   std::string charset;
   1192   req.GetCharset(&charset);
   1193   EXPECT_EQ("utf-8", charset);
   1194   req.Cancel();
   1195 }
   1196 
   1197 TEST_F(URLRequestTest, FileDirCancelTest) {
   1198   // Put in mock resource provider.
   1199   NetModule::SetResourceProvider(TestNetResourceProvider);
   1200 
   1201   TestDelegate d;
   1202   {
   1203     FilePath file_path;
   1204     PathService::Get(base::DIR_SOURCE_ROOT, &file_path);
   1205     file_path = file_path.Append(FILE_PATH_LITERAL("net"));
   1206     file_path = file_path.Append(FILE_PATH_LITERAL("data"));
   1207 
   1208     TestURLRequest req(FilePathToFileURL(file_path), &d);
   1209     req.Start();
   1210     EXPECT_TRUE(req.is_pending());
   1211 
   1212     d.set_cancel_in_received_data_pending(true);
   1213 
   1214     MessageLoop::current()->Run();
   1215   }
   1216 
   1217   // Take out mock resource provider.
   1218   NetModule::SetResourceProvider(NULL);
   1219 }
   1220 
   1221 TEST_F(URLRequestTest, FileDirRedirectNoCrash) {
   1222   // There is an implicit redirect when loading a file path that matches a
   1223   // directory and does not end with a slash.  Ensure that following such
   1224   // redirects does not crash.  See http://crbug.com/18686.
   1225 
   1226   FilePath path;
   1227   PathService::Get(base::DIR_SOURCE_ROOT, &path);
   1228   path = path.Append(FILE_PATH_LITERAL("net"));
   1229   path = path.Append(FILE_PATH_LITERAL("data"));
   1230   path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
   1231 
   1232   TestDelegate d;
   1233   TestURLRequest req(FilePathToFileURL(path), &d);
   1234   req.Start();
   1235   MessageLoop::current()->Run();
   1236 
   1237   ASSERT_EQ(1, d.received_redirect_count());
   1238   ASSERT_LT(0, d.bytes_received());
   1239   ASSERT_FALSE(d.request_failed());
   1240   ASSERT_TRUE(req.status().is_success());
   1241 }
   1242 
   1243 #if defined(OS_WIN)
   1244 // Don't accept the url "file:///" on windows. See http://crbug.com/1474.
   1245 TEST_F(URLRequestTest, FileDirRedirectSingleSlash) {
   1246   TestDelegate d;
   1247   TestURLRequest req(GURL("file:///"), &d);
   1248   req.Start();
   1249   MessageLoop::current()->Run();
   1250 
   1251   ASSERT_EQ(1, d.received_redirect_count());
   1252   ASSERT_FALSE(req.status().is_success());
   1253 }
   1254 #endif
   1255 
   1256 TEST_F(URLRequestTestHTTP, RestrictRedirects) {
   1257   ASSERT_TRUE(test_server_.Start());
   1258 
   1259   TestDelegate d;
   1260   TestURLRequest req(test_server_.GetURL(
   1261       "files/redirect-to-file.html"), &d);
   1262   req.Start();
   1263   MessageLoop::current()->Run();
   1264 
   1265   EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
   1266   EXPECT_EQ(ERR_UNSAFE_REDIRECT, req.status().os_error());
   1267 }
   1268 
   1269 TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) {
   1270   ASSERT_TRUE(test_server_.Start());
   1271 
   1272   TestDelegate d;
   1273   TestURLRequest req(test_server_.GetURL(
   1274       "files/redirect-to-invalid-url.html"), &d);
   1275   req.Start();
   1276   MessageLoop::current()->Run();
   1277 
   1278   EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
   1279   EXPECT_EQ(ERR_INVALID_URL, req.status().os_error());
   1280 }
   1281 
   1282 TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) {
   1283   ASSERT_TRUE(test_server_.Start());
   1284 
   1285   TestDelegate d;
   1286   TestURLRequest req(test_server_.GetURL(
   1287       "echoheader?Referer"), &d);
   1288   req.set_referrer("http://user:pass@foo.com/");
   1289   req.Start();
   1290   MessageLoop::current()->Run();
   1291 
   1292   EXPECT_EQ(std::string("http://foo.com/"), d.data_received());
   1293 }
   1294 
   1295 TEST_F(URLRequestTestHTTP, CancelRedirect) {
   1296   ASSERT_TRUE(test_server_.Start());
   1297 
   1298   TestDelegate d;
   1299   {
   1300     d.set_cancel_in_received_redirect(true);
   1301     TestURLRequest req(test_server_.GetURL(
   1302         "files/redirect-test.html"), &d);
   1303     req.Start();
   1304     MessageLoop::current()->Run();
   1305 
   1306     EXPECT_EQ(1, d.response_started_count());
   1307     EXPECT_EQ(0, d.bytes_received());
   1308     EXPECT_FALSE(d.received_data_before_response());
   1309     EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
   1310   }
   1311 }
   1312 
   1313 TEST_F(URLRequestTestHTTP, DeferredRedirect) {
   1314   ASSERT_TRUE(test_server_.Start());
   1315 
   1316   TestDelegate d;
   1317   {
   1318     d.set_quit_on_redirect(true);
   1319     TestURLRequest req(test_server_.GetURL(
   1320         "files/redirect-test.html"), &d);
   1321     req.Start();
   1322     MessageLoop::current()->Run();
   1323 
   1324     EXPECT_EQ(1, d.received_redirect_count());
   1325 
   1326     req.FollowDeferredRedirect();
   1327     MessageLoop::current()->Run();
   1328 
   1329     EXPECT_EQ(1, d.response_started_count());
   1330     EXPECT_FALSE(d.received_data_before_response());
   1331     EXPECT_EQ(URLRequestStatus::SUCCESS, req.status().status());
   1332 
   1333     FilePath path;
   1334     PathService::Get(base::DIR_SOURCE_ROOT, &path);
   1335     path = path.Append(FILE_PATH_LITERAL("net"));
   1336     path = path.Append(FILE_PATH_LITERAL("data"));
   1337     path = path.Append(FILE_PATH_LITERAL("url_request_unittest"));
   1338     path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
   1339 
   1340     std::string contents;
   1341     EXPECT_TRUE(file_util::ReadFileToString(path, &contents));
   1342     EXPECT_EQ(contents, d.data_received());
   1343   }
   1344 }
   1345 
   1346 TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) {
   1347   ASSERT_TRUE(test_server_.Start());
   1348 
   1349   TestDelegate d;
   1350   {
   1351     d.set_quit_on_redirect(true);
   1352     TestURLRequest req(test_server_.GetURL(
   1353         "files/redirect-test.html"), &d);
   1354     req.Start();
   1355     MessageLoop::current()->Run();
   1356 
   1357     EXPECT_EQ(1, d.received_redirect_count());
   1358 
   1359     req.Cancel();
   1360     MessageLoop::current()->Run();
   1361 
   1362     EXPECT_EQ(1, d.response_started_count());
   1363     EXPECT_EQ(0, d.bytes_received());
   1364     EXPECT_FALSE(d.received_data_before_response());
   1365     EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
   1366   }
   1367 }
   1368 
   1369 TEST_F(URLRequestTestHTTP, VaryHeader) {
   1370   ASSERT_TRUE(test_server_.Start());
   1371 
   1372   scoped_refptr<URLRequestContext> context(new TestURLRequestContext());
   1373 
   1374   // populate the cache
   1375   {
   1376     TestDelegate d;
   1377     URLRequest req(test_server_.GetURL("echoheadercache?foo"), &d);
   1378     req.set_context(context);
   1379     HttpRequestHeaders headers;
   1380     headers.SetHeader("foo", "1");
   1381     req.SetExtraRequestHeaders(headers);
   1382     req.Start();
   1383     MessageLoop::current()->Run();
   1384   }
   1385 
   1386   // expect a cache hit
   1387   {
   1388     TestDelegate d;
   1389     URLRequest req(test_server_.GetURL("echoheadercache?foo"), &d);
   1390     req.set_context(context);
   1391     HttpRequestHeaders headers;
   1392     headers.SetHeader("foo", "1");
   1393     req.SetExtraRequestHeaders(headers);
   1394     req.Start();
   1395     MessageLoop::current()->Run();
   1396 
   1397     EXPECT_TRUE(req.was_cached());
   1398   }
   1399 
   1400   // expect a cache miss
   1401   {
   1402     TestDelegate d;
   1403     URLRequest req(test_server_.GetURL("echoheadercache?foo"), &d);
   1404     req.set_context(context);
   1405     HttpRequestHeaders headers;
   1406     headers.SetHeader("foo", "2");
   1407     req.SetExtraRequestHeaders(headers);
   1408     req.Start();
   1409     MessageLoop::current()->Run();
   1410 
   1411     EXPECT_FALSE(req.was_cached());
   1412   }
   1413 }
   1414 
   1415 TEST_F(URLRequestTestHTTP, BasicAuth) {
   1416   ASSERT_TRUE(test_server_.Start());
   1417 
   1418   scoped_refptr<URLRequestContext> context(new TestURLRequestContext());
   1419 
   1420   // populate the cache
   1421   {
   1422     TestDelegate d;
   1423     d.set_username(kUser);
   1424     d.set_password(kSecret);
   1425 
   1426     URLRequest r(test_server_.GetURL("auth-basic"), &d);
   1427     r.set_context(context);
   1428     r.Start();
   1429 
   1430     MessageLoop::current()->Run();
   1431 
   1432     EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
   1433   }
   1434 
   1435   // repeat request with end-to-end validation.  since auth-basic results in a
   1436   // cachable page, we expect this test to result in a 304.  in which case, the
   1437   // response should be fetched from the cache.
   1438   {
   1439     TestDelegate d;
   1440     d.set_username(kUser);
   1441     d.set_password(kSecret);
   1442 
   1443     URLRequest r(test_server_.GetURL("auth-basic"), &d);
   1444     r.set_context(context);
   1445     r.set_load_flags(LOAD_VALIDATE_CACHE);
   1446     r.Start();
   1447 
   1448     MessageLoop::current()->Run();
   1449 
   1450     EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
   1451 
   1452     // Should be the same cached document.
   1453     EXPECT_TRUE(r.was_cached());
   1454   }
   1455 }
   1456 
   1457 // Check that Set-Cookie headers in 401 responses are respected.
   1458 // http://crbug.com/6450
   1459 TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) {
   1460   ASSERT_TRUE(test_server_.Start());
   1461 
   1462   GURL url_requiring_auth =
   1463       test_server_.GetURL("auth-basic?set-cookie-if-challenged");
   1464 
   1465   // Request a page that will give a 401 containing a Set-Cookie header.
   1466   // Verify that when the transaction is restarted, it includes the new cookie.
   1467   {
   1468     scoped_refptr<URLRequestContext> context(new TestURLRequestContext());
   1469     TestDelegate d;
   1470     d.set_username(kUser);
   1471     d.set_password(kSecret);
   1472 
   1473     URLRequest r(url_requiring_auth, &d);
   1474     r.set_context(context);
   1475     r.Start();
   1476 
   1477     MessageLoop::current()->Run();
   1478 
   1479     EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
   1480 
   1481     // Make sure we sent the cookie in the restarted transaction.
   1482     EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
   1483         != std::string::npos);
   1484   }
   1485 
   1486   // Same test as above, except this time the restart is initiated earlier
   1487   // (without user intervention since identity is embedded in the URL).
   1488   {
   1489     scoped_refptr<URLRequestContext> context(new TestURLRequestContext());
   1490     TestDelegate d;
   1491 
   1492     GURL::Replacements replacements;
   1493     std::string username("user2");
   1494     std::string password("secret");
   1495     replacements.SetUsernameStr(username);
   1496     replacements.SetPasswordStr(password);
   1497     GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements);
   1498 
   1499     URLRequest r(url_with_identity, &d);
   1500     r.set_context(context);
   1501     r.Start();
   1502 
   1503     MessageLoop::current()->Run();
   1504 
   1505     EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos);
   1506 
   1507     // Make sure we sent the cookie in the restarted transaction.
   1508     EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
   1509         != std::string::npos);
   1510   }
   1511 }
   1512 
   1513 TEST_F(URLRequestTest, DoNotSendCookies) {
   1514   TestServer test_server(TestServer::TYPE_HTTP, FilePath());
   1515   ASSERT_TRUE(test_server.Start());
   1516 
   1517   scoped_refptr<URLRequestContext> context(new TestURLRequestContext());
   1518 
   1519   // Set up a cookie.
   1520   {
   1521     TestDelegate d;
   1522     URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), &d);
   1523     req.set_context(context);
   1524     req.Start();
   1525     MessageLoop::current()->Run();
   1526     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1527     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1528   }
   1529 
   1530   // Verify that the cookie is set.
   1531   {
   1532     TestDelegate d;
   1533     TestURLRequest req(test_server.GetURL("echoheader?Cookie"), &d);
   1534     req.set_context(context);
   1535     req.Start();
   1536     MessageLoop::current()->Run();
   1537 
   1538     EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
   1539                 != std::string::npos);
   1540     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1541     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1542   }
   1543 
   1544   // Verify that the cookie isn't sent when LOAD_DO_NOT_SEND_COOKIES is set.
   1545   {
   1546     TestDelegate d;
   1547     TestURLRequest req(test_server.GetURL("echoheader?Cookie"), &d);
   1548     req.set_load_flags(LOAD_DO_NOT_SEND_COOKIES);
   1549     req.set_context(context);
   1550     req.Start();
   1551     MessageLoop::current()->Run();
   1552 
   1553     EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
   1554                 == std::string::npos);
   1555 
   1556     // LOAD_DO_NOT_SEND_COOKIES does not trigger OnGetCookies.
   1557     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1558     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1559   }
   1560 }
   1561 
   1562 TEST_F(URLRequestTest, DoNotSaveCookies) {
   1563   TestServer test_server(TestServer::TYPE_HTTP, FilePath());
   1564   ASSERT_TRUE(test_server.Start());
   1565 
   1566   scoped_refptr<URLRequestContext> context(new TestURLRequestContext());
   1567 
   1568   // Set up a cookie.
   1569   {
   1570     TestDelegate d;
   1571     URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
   1572                         &d);
   1573     req.set_context(context);
   1574     req.Start();
   1575     MessageLoop::current()->Run();
   1576 
   1577     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1578     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1579     EXPECT_EQ(1, d.set_cookie_count());
   1580   }
   1581 
   1582   // Try to set-up another cookie and update the previous cookie.
   1583   {
   1584     TestDelegate d;
   1585     URLRequest req(test_server.GetURL(
   1586         "set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), &d);
   1587     req.set_load_flags(LOAD_DO_NOT_SAVE_COOKIES);
   1588     req.set_context(context);
   1589     req.Start();
   1590 
   1591     MessageLoop::current()->Run();
   1592 
   1593     // LOAD_DO_NOT_SAVE_COOKIES does not trigger OnSetCookie.
   1594     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1595     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1596     EXPECT_EQ(0, d.set_cookie_count());
   1597   }
   1598 
   1599   // Verify the cookies weren't saved or updated.
   1600   {
   1601     TestDelegate d;
   1602     TestURLRequest req(test_server.GetURL("echoheader?Cookie"), &d);
   1603     req.set_context(context);
   1604     req.Start();
   1605     MessageLoop::current()->Run();
   1606 
   1607     EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
   1608                 == std::string::npos);
   1609     EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
   1610                 != std::string::npos);
   1611 
   1612     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1613     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1614     EXPECT_EQ(0, d.set_cookie_count());
   1615   }
   1616 }
   1617 
   1618 TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy) {
   1619   TestServer test_server(TestServer::TYPE_HTTP, FilePath());
   1620   ASSERT_TRUE(test_server.Start());
   1621 
   1622   scoped_refptr<TestURLRequestContext> context(new TestURLRequestContext());
   1623 
   1624   // Set up a cookie.
   1625   {
   1626     TestDelegate d;
   1627     URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), &d);
   1628     req.set_context(context);
   1629     req.Start();
   1630     MessageLoop::current()->Run();
   1631 
   1632     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1633     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1634   }
   1635 
   1636   // Verify that the cookie is set.
   1637   {
   1638     TestDelegate d;
   1639     TestURLRequest req(test_server.GetURL("echoheader?Cookie"), &d);
   1640     req.set_context(context);
   1641     req.Start();
   1642     MessageLoop::current()->Run();
   1643 
   1644     EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
   1645                 != std::string::npos);
   1646 
   1647     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1648     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1649   }
   1650 
   1651   // Verify that the cookie isn't sent.
   1652   {
   1653     TestCookiePolicy cookie_policy(TestCookiePolicy::NO_GET_COOKIES);
   1654     context->set_cookie_policy(&cookie_policy);
   1655 
   1656     TestDelegate d;
   1657     TestURLRequest req(test_server.GetURL("echoheader?Cookie"), &d);
   1658     req.set_context(context);
   1659     req.Start();
   1660     MessageLoop::current()->Run();
   1661 
   1662     EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
   1663                 == std::string::npos);
   1664 
   1665     context->set_cookie_policy(NULL);
   1666 
   1667     EXPECT_EQ(1, d.blocked_get_cookies_count());
   1668     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1669   }
   1670 }
   1671 
   1672 TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy) {
   1673   TestServer test_server(TestServer::TYPE_HTTP, FilePath());
   1674   ASSERT_TRUE(test_server.Start());
   1675 
   1676   scoped_refptr<TestURLRequestContext> context(new TestURLRequestContext());
   1677 
   1678   // Set up a cookie.
   1679   {
   1680     TestDelegate d;
   1681     URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
   1682                         &d);
   1683     req.set_context(context);
   1684     req.Start();
   1685     MessageLoop::current()->Run();
   1686 
   1687     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1688     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1689   }
   1690 
   1691   // Try to set-up another cookie and update the previous cookie.
   1692   {
   1693     TestCookiePolicy cookie_policy(TestCookiePolicy::NO_SET_COOKIE);
   1694     context->set_cookie_policy(&cookie_policy);
   1695 
   1696     TestDelegate d;
   1697     URLRequest req(test_server.GetURL(
   1698         "set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), &d);
   1699     req.set_context(context);
   1700     req.Start();
   1701 
   1702     MessageLoop::current()->Run();
   1703 
   1704     context->set_cookie_policy(NULL);
   1705 
   1706     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1707     EXPECT_EQ(2, d.blocked_set_cookie_count());
   1708   }
   1709 
   1710 
   1711   // Verify the cookies weren't saved or updated.
   1712   {
   1713     TestDelegate d;
   1714     TestURLRequest req(test_server.GetURL("echoheader?Cookie"), &d);
   1715     req.set_context(context);
   1716     req.Start();
   1717     MessageLoop::current()->Run();
   1718 
   1719     EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
   1720                 == std::string::npos);
   1721     EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
   1722                 != std::string::npos);
   1723 
   1724     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1725     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1726   }
   1727 }
   1728 
   1729 TEST_F(URLRequestTest, DoNotSaveEmptyCookies) {
   1730   TestServer test_server(TestServer::TYPE_HTTP, FilePath());
   1731   ASSERT_TRUE(test_server.Start());
   1732 
   1733   scoped_refptr<TestURLRequestContext> context(new TestURLRequestContext());
   1734 
   1735   // Set up an empty cookie.
   1736   {
   1737     TestDelegate d;
   1738     URLRequest req(test_server.GetURL("set-cookie"), &d);
   1739     req.set_context(context);
   1740     req.Start();
   1741     MessageLoop::current()->Run();
   1742 
   1743     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1744     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1745     EXPECT_EQ(0, d.set_cookie_count());
   1746   }
   1747 }
   1748 
   1749 TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy_Async) {
   1750   TestServer test_server(TestServer::TYPE_HTTP, FilePath());
   1751   ASSERT_TRUE(test_server.Start());
   1752 
   1753   scoped_refptr<TestURLRequestContext> context(new TestURLRequestContext());
   1754 
   1755   // Set up a cookie.
   1756   {
   1757     TestDelegate d;
   1758     URLRequest req(test_server.GetURL("set-cookie?CookieToNotSend=1"), &d);
   1759     req.set_context(context);
   1760     req.Start();
   1761     MessageLoop::current()->Run();
   1762 
   1763     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1764     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1765   }
   1766 
   1767   // Verify that the cookie is set.
   1768   {
   1769     TestDelegate d;
   1770     TestURLRequest req(test_server.GetURL("echoheader?Cookie"), &d);
   1771     req.set_context(context);
   1772     req.Start();
   1773     MessageLoop::current()->Run();
   1774 
   1775     EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
   1776                 != std::string::npos);
   1777 
   1778     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1779     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1780   }
   1781 
   1782   // Verify that the cookie isn't sent.
   1783   {
   1784     TestCookiePolicy cookie_policy(TestCookiePolicy::NO_GET_COOKIES);
   1785     context->set_cookie_policy(&cookie_policy);
   1786 
   1787     TestDelegate d;
   1788     TestURLRequest req(test_server.GetURL("echoheader?Cookie"), &d);
   1789     req.set_context(context);
   1790     req.Start();
   1791     MessageLoop::current()->Run();
   1792 
   1793     EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
   1794                 == std::string::npos);
   1795 
   1796     context->set_cookie_policy(NULL);
   1797 
   1798     EXPECT_EQ(1, d.blocked_get_cookies_count());
   1799     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1800   }
   1801 }
   1802 
   1803 TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy_Async) {
   1804   TestServer test_server(TestServer::TYPE_HTTP, FilePath());
   1805   ASSERT_TRUE(test_server.Start());
   1806 
   1807   scoped_refptr<TestURLRequestContext> context(new TestURLRequestContext());
   1808 
   1809   // Set up a cookie.
   1810   {
   1811     TestDelegate d;
   1812     URLRequest req(test_server.GetURL("set-cookie?CookieToNotUpdate=2"),
   1813                         &d);
   1814     req.set_context(context);
   1815     req.Start();
   1816     MessageLoop::current()->Run();
   1817 
   1818     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1819     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1820   }
   1821 
   1822   // Try to set-up another cookie and update the previous cookie.
   1823   {
   1824     TestCookiePolicy cookie_policy(TestCookiePolicy::NO_SET_COOKIE);
   1825     context->set_cookie_policy(&cookie_policy);
   1826 
   1827     TestDelegate d;
   1828     URLRequest req(test_server.GetURL(
   1829         "set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"), &d);
   1830     req.set_context(context);
   1831     req.Start();
   1832 
   1833     MessageLoop::current()->Run();
   1834 
   1835     context->set_cookie_policy(NULL);
   1836 
   1837     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1838     EXPECT_EQ(2, d.blocked_set_cookie_count());
   1839   }
   1840 
   1841   // Verify the cookies weren't saved or updated.
   1842   {
   1843     TestDelegate d;
   1844     TestURLRequest req(test_server.GetURL("echoheader?Cookie"), &d);
   1845     req.set_context(context);
   1846     req.Start();
   1847     MessageLoop::current()->Run();
   1848 
   1849     EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
   1850                 == std::string::npos);
   1851     EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
   1852                 != std::string::npos);
   1853 
   1854     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1855     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1856   }
   1857 }
   1858 
   1859 TEST_F(URLRequestTest, CookiePolicy_ForceSession) {
   1860   TestServer test_server(TestServer::TYPE_HTTP, FilePath());
   1861   ASSERT_TRUE(test_server.Start());
   1862 
   1863   scoped_refptr<TestURLRequestContext> context(new TestURLRequestContext());
   1864 
   1865   TestCookiePolicy cookie_policy(TestCookiePolicy::FORCE_SESSION);
   1866   context->set_cookie_policy(&cookie_policy);
   1867 
   1868   // Set up a cookie.
   1869   {
   1870     TestDelegate d;
   1871     URLRequest req(test_server.GetURL(
   1872         "set-cookie?A=1;expires=\"Fri, 05 Feb 2010 23:42:01 GMT\""), &d);
   1873     req.set_context(context);
   1874     req.Start();  // Triggers an asynchronous cookie policy check.
   1875 
   1876     MessageLoop::current()->Run();
   1877 
   1878     EXPECT_EQ(0, d.blocked_get_cookies_count());
   1879     EXPECT_EQ(0, d.blocked_set_cookie_count());
   1880   }
   1881 
   1882   // Now, check the cookie store.
   1883   CookieList cookies =
   1884       context->cookie_store()->GetCookieMonster()->GetAllCookies();
   1885   EXPECT_EQ(1U, cookies.size());
   1886   EXPECT_FALSE(cookies[0].IsPersistent());
   1887 
   1888   context->set_cookie_policy(NULL);
   1889 }
   1890 
   1891 // In this test, we do a POST which the server will 302 redirect.
   1892 // The subsequent transaction should use GET, and should not send the
   1893 // Content-Type header.
   1894 // http://code.google.com/p/chromium/issues/detail?id=843
   1895 TEST_F(URLRequestTestHTTP, Post302RedirectGet) {
   1896   ASSERT_TRUE(test_server_.Start());
   1897 
   1898   const char kData[] = "hello world";
   1899 
   1900   TestDelegate d;
   1901   TestURLRequest req(test_server_.GetURL("files/redirect-to-echoall"), &d);
   1902   req.set_method("POST");
   1903   req.set_upload(CreateSimpleUploadData(kData));
   1904 
   1905   // Set headers (some of which are specific to the POST).
   1906   HttpRequestHeaders headers;
   1907   headers.AddHeadersFromString(
   1908     "Content-Type: multipart/form-data; "
   1909     "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n"
   1910     "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,"
   1911     "text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
   1912     "Accept-Language: en-US,en\r\n"
   1913     "Accept-Charset: ISO-8859-1,*,utf-8\r\n"
   1914     "Content-Length: 11\r\n"
   1915     "Origin: http://localhost:1337/");
   1916   req.SetExtraRequestHeaders(headers);
   1917   req.Start();
   1918   MessageLoop::current()->Run();
   1919 
   1920   std::string mime_type;
   1921   req.GetMimeType(&mime_type);
   1922   EXPECT_EQ("text/html", mime_type);
   1923 
   1924   const std::string& data = d.data_received();
   1925 
   1926   // Check that the post-specific headers were stripped:
   1927   EXPECT_FALSE(ContainsString(data, "Content-Length:"));
   1928   EXPECT_FALSE(ContainsString(data, "Content-Type:"));
   1929   EXPECT_FALSE(ContainsString(data, "Origin:"));
   1930 
   1931   // These extra request headers should not have been stripped.
   1932   EXPECT_TRUE(ContainsString(data, "Accept:"));
   1933   EXPECT_TRUE(ContainsString(data, "Accept-Language:"));
   1934   EXPECT_TRUE(ContainsString(data, "Accept-Charset:"));
   1935 }
   1936 
   1937 TEST_F(URLRequestTestHTTP, Post307RedirectPost) {
   1938   ASSERT_TRUE(test_server_.Start());
   1939 
   1940   const char kData[] = "hello world";
   1941 
   1942   TestDelegate d;
   1943   TestURLRequest req(test_server_.GetURL("files/redirect307-to-echo"),
   1944       &d);
   1945   req.set_method("POST");
   1946   req.set_upload(CreateSimpleUploadData(kData).get());
   1947   HttpRequestHeaders headers;
   1948   headers.SetHeader(HttpRequestHeaders::kContentLength,
   1949                     base::UintToString(arraysize(kData) - 1));
   1950   req.SetExtraRequestHeaders(headers);
   1951   req.Start();
   1952   MessageLoop::current()->Run();
   1953   EXPECT_EQ("POST", req.method());
   1954   EXPECT_EQ(kData, d.data_received());
   1955 }
   1956 
   1957 // Custom URLRequestJobs for use with interceptor tests
   1958 class RestartTestJob : public URLRequestTestJob {
   1959  public:
   1960   explicit RestartTestJob(URLRequest* request)
   1961     : URLRequestTestJob(request, true) {}
   1962  protected:
   1963   virtual void StartAsync() {
   1964     this->NotifyRestartRequired();
   1965   }
   1966  private:
   1967   ~RestartTestJob() {}
   1968 };
   1969 
   1970 class CancelTestJob : public URLRequestTestJob {
   1971  public:
   1972   explicit CancelTestJob(URLRequest* request)
   1973     : URLRequestTestJob(request, true) {}
   1974  protected:
   1975   virtual void StartAsync() {
   1976     request_->Cancel();
   1977   }
   1978  private:
   1979   ~CancelTestJob() {}
   1980 };
   1981 
   1982 class CancelThenRestartTestJob : public URLRequestTestJob {
   1983  public:
   1984   explicit CancelThenRestartTestJob(URLRequest* request)
   1985       : URLRequestTestJob(request, true) {
   1986   }
   1987  protected:
   1988   virtual void StartAsync() {
   1989     request_->Cancel();
   1990     this->NotifyRestartRequired();
   1991   }
   1992  private:
   1993   ~CancelThenRestartTestJob() {}
   1994 };
   1995 
   1996 // An Interceptor for use with interceptor tests
   1997 class TestInterceptor : URLRequest::Interceptor {
   1998  public:
   1999   TestInterceptor()
   2000       : intercept_main_request_(false), restart_main_request_(false),
   2001         cancel_main_request_(false), cancel_then_restart_main_request_(false),
   2002         simulate_main_network_error_(false),
   2003         intercept_redirect_(false), cancel_redirect_request_(false),
   2004         intercept_final_response_(false), cancel_final_request_(false),
   2005         did_intercept_main_(false), did_restart_main_(false),
   2006         did_cancel_main_(false), did_cancel_then_restart_main_(false),
   2007         did_simulate_error_main_(false),
   2008         did_intercept_redirect_(false), did_cancel_redirect_(false),
   2009         did_intercept_final_(false), did_cancel_final_(false) {
   2010     URLRequest::RegisterRequestInterceptor(this);
   2011   }
   2012 
   2013   ~TestInterceptor() {
   2014     URLRequest::UnregisterRequestInterceptor(this);
   2015   }
   2016 
   2017   virtual URLRequestJob* MaybeIntercept(URLRequest* request) {
   2018     if (restart_main_request_) {
   2019       restart_main_request_ = false;
   2020       did_restart_main_ = true;
   2021       return new RestartTestJob(request);
   2022     }
   2023     if (cancel_main_request_) {
   2024       cancel_main_request_ = false;
   2025       did_cancel_main_ = true;
   2026       return new CancelTestJob(request);
   2027     }
   2028     if (cancel_then_restart_main_request_) {
   2029       cancel_then_restart_main_request_ = false;
   2030       did_cancel_then_restart_main_ = true;
   2031       return new CancelThenRestartTestJob(request);
   2032     }
   2033     if (simulate_main_network_error_) {
   2034       simulate_main_network_error_ = false;
   2035       did_simulate_error_main_ = true;
   2036       // will error since the requeted url is not one of its canned urls
   2037       return new URLRequestTestJob(request, true);
   2038     }
   2039     if (!intercept_main_request_)
   2040       return NULL;
   2041     intercept_main_request_ = false;
   2042     did_intercept_main_ = true;
   2043     return new URLRequestTestJob(request,
   2044                                       main_headers_,
   2045                                       main_data_,
   2046                                       true);
   2047   }
   2048 
   2049   virtual URLRequestJob* MaybeInterceptRedirect(URLRequest* request,
   2050                                                      const GURL& location) {
   2051     if (cancel_redirect_request_) {
   2052       cancel_redirect_request_ = false;
   2053       did_cancel_redirect_ = true;
   2054       return new CancelTestJob(request);
   2055     }
   2056     if (!intercept_redirect_)
   2057       return NULL;
   2058     intercept_redirect_ = false;
   2059     did_intercept_redirect_ = true;
   2060     return new URLRequestTestJob(request,
   2061                                       redirect_headers_,
   2062                                       redirect_data_,
   2063                                       true);
   2064   }
   2065 
   2066   virtual URLRequestJob* MaybeInterceptResponse(URLRequest* request) {
   2067     if (cancel_final_request_) {
   2068       cancel_final_request_ = false;
   2069       did_cancel_final_ = true;
   2070       return new CancelTestJob(request);
   2071     }
   2072     if (!intercept_final_response_)
   2073       return NULL;
   2074     intercept_final_response_ = false;
   2075     did_intercept_final_ = true;
   2076     return new URLRequestTestJob(request,
   2077                                       final_headers_,
   2078                                       final_data_,
   2079                                       true);
   2080   }
   2081 
   2082   // Whether to intercept the main request, and if so the response to return.
   2083   bool intercept_main_request_;
   2084   std::string main_headers_;
   2085   std::string main_data_;
   2086 
   2087   // Other actions we take at MaybeIntercept time
   2088   bool restart_main_request_;
   2089   bool cancel_main_request_;
   2090   bool cancel_then_restart_main_request_;
   2091   bool simulate_main_network_error_;
   2092 
   2093   // Whether to intercept redirects, and if so the response to return.
   2094   bool intercept_redirect_;
   2095   std::string redirect_headers_;
   2096   std::string redirect_data_;
   2097 
   2098   // Other actions we can take at MaybeInterceptRedirect time
   2099   bool cancel_redirect_request_;
   2100 
   2101   // Whether to intercept final response, and if so the response to return.
   2102   bool intercept_final_response_;
   2103   std::string final_headers_;
   2104   std::string final_data_;
   2105 
   2106   // Other actions we can take at MaybeInterceptResponse time
   2107   bool cancel_final_request_;
   2108 
   2109   // If we did something or not
   2110   bool did_intercept_main_;
   2111   bool did_restart_main_;
   2112   bool did_cancel_main_;
   2113   bool did_cancel_then_restart_main_;
   2114   bool did_simulate_error_main_;
   2115   bool did_intercept_redirect_;
   2116   bool did_cancel_redirect_;
   2117   bool did_intercept_final_;
   2118   bool did_cancel_final_;
   2119 
   2120   // Static getters for canned response header and data strings
   2121 
   2122   static std::string ok_data() {
   2123     return URLRequestTestJob::test_data_1();
   2124   }
   2125 
   2126   static std::string ok_headers() {
   2127     return URLRequestTestJob::test_headers();
   2128   }
   2129 
   2130   static std::string redirect_data() {
   2131     return std::string();
   2132   }
   2133 
   2134   static std::string redirect_headers() {
   2135     return URLRequestTestJob::test_redirect_headers();
   2136   }
   2137 
   2138   static std::string error_data() {
   2139     return std::string("ohhh nooooo mr. bill!");
   2140   }
   2141 
   2142   static std::string error_headers() {
   2143     return URLRequestTestJob::test_error_headers();
   2144   }
   2145 };
   2146 
   2147 TEST_F(URLRequestTest, Intercept) {
   2148   TestInterceptor interceptor;
   2149 
   2150   // intercept the main request and respond with a simple response
   2151   interceptor.intercept_main_request_ = true;
   2152   interceptor.main_headers_ = TestInterceptor::ok_headers();
   2153   interceptor.main_data_ = TestInterceptor::ok_data();
   2154 
   2155   TestDelegate d;
   2156   TestURLRequest req(GURL("http://test_intercept/foo"), &d);
   2157   URLRequest::UserData* user_data0 = new URLRequest::UserData();
   2158   URLRequest::UserData* user_data1 = new URLRequest::UserData();
   2159   URLRequest::UserData* user_data2 = new URLRequest::UserData();
   2160   req.SetUserData(NULL, user_data0);
   2161   req.SetUserData(&user_data1, user_data1);
   2162   req.SetUserData(&user_data2, user_data2);
   2163   req.set_method("GET");
   2164   req.Start();
   2165   MessageLoop::current()->Run();
   2166 
   2167   // Make sure we can retrieve our specific user data
   2168   EXPECT_EQ(user_data0, req.GetUserData(NULL));
   2169   EXPECT_EQ(user_data1, req.GetUserData(&user_data1));
   2170   EXPECT_EQ(user_data2, req.GetUserData(&user_data2));
   2171 
   2172   // Check the interceptor got called as expected
   2173   EXPECT_TRUE(interceptor.did_intercept_main_);
   2174 
   2175   // Check we got one good response
   2176   EXPECT_TRUE(req.status().is_success());
   2177   EXPECT_EQ(200, req.response_headers()->response_code());
   2178   EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
   2179   EXPECT_EQ(1, d.response_started_count());
   2180   EXPECT_EQ(0, d.received_redirect_count());
   2181 }
   2182 
   2183 TEST_F(URLRequestTest, InterceptRedirect) {
   2184   TestInterceptor interceptor;
   2185 
   2186   // intercept the main request and respond with a redirect
   2187   interceptor.intercept_main_request_ = true;
   2188   interceptor.main_headers_ = TestInterceptor::redirect_headers();
   2189   interceptor.main_data_ = TestInterceptor::redirect_data();
   2190 
   2191   // intercept that redirect and respond a final OK response
   2192   interceptor.intercept_redirect_ = true;
   2193   interceptor.redirect_headers_ =  TestInterceptor::ok_headers();
   2194   interceptor.redirect_data_ = TestInterceptor::ok_data();
   2195 
   2196   TestDelegate d;
   2197   TestURLRequest req(GURL("http://test_intercept/foo"), &d);
   2198   req.set_method("GET");
   2199   req.Start();
   2200   MessageLoop::current()->Run();
   2201 
   2202   // Check the interceptor got called as expected
   2203   EXPECT_TRUE(interceptor.did_intercept_main_);
   2204   EXPECT_TRUE(interceptor.did_intercept_redirect_);
   2205 
   2206   // Check we got one good response
   2207   EXPECT_TRUE(req.status().is_success());
   2208   if (req.status().is_success()) {
   2209     EXPECT_EQ(200, req.response_headers()->response_code());
   2210   }
   2211   EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
   2212   EXPECT_EQ(1, d.response_started_count());
   2213   EXPECT_EQ(0, d.received_redirect_count());
   2214 }
   2215 
   2216 TEST_F(URLRequestTest, InterceptServerError) {
   2217   TestInterceptor interceptor;
   2218 
   2219   // intercept the main request to generate a server error response
   2220   interceptor.intercept_main_request_ = true;
   2221   interceptor.main_headers_ = TestInterceptor::error_headers();
   2222   interceptor.main_data_ = TestInterceptor::error_data();
   2223 
   2224   // intercept that error and respond with an OK response
   2225   interceptor.intercept_final_response_ = true;
   2226   interceptor.final_headers_ = TestInterceptor::ok_headers();
   2227   interceptor.final_data_ = TestInterceptor::ok_data();
   2228 
   2229   TestDelegate d;
   2230   TestURLRequest req(GURL("http://test_intercept/foo"), &d);
   2231   req.set_method("GET");
   2232   req.Start();
   2233   MessageLoop::current()->Run();
   2234 
   2235   // Check the interceptor got called as expected
   2236   EXPECT_TRUE(interceptor.did_intercept_main_);
   2237   EXPECT_TRUE(interceptor.did_intercept_final_);
   2238 
   2239   // Check we got one good response
   2240   EXPECT_TRUE(req.status().is_success());
   2241   EXPECT_EQ(200, req.response_headers()->response_code());
   2242   EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
   2243   EXPECT_EQ(1, d.response_started_count());
   2244   EXPECT_EQ(0, d.received_redirect_count());
   2245 }
   2246 
   2247 TEST_F(URLRequestTest, InterceptNetworkError) {
   2248   TestInterceptor interceptor;
   2249 
   2250   // intercept the main request to simulate a network error
   2251   interceptor.simulate_main_network_error_ = true;
   2252 
   2253   // intercept that error and respond with an OK response
   2254   interceptor.intercept_final_response_ = true;
   2255   interceptor.final_headers_ = TestInterceptor::ok_headers();
   2256   interceptor.final_data_ = TestInterceptor::ok_data();
   2257 
   2258   TestDelegate d;
   2259   TestURLRequest req(GURL("http://test_intercept/foo"), &d);
   2260   req.set_method("GET");
   2261   req.Start();
   2262   MessageLoop::current()->Run();
   2263 
   2264   // Check the interceptor got called as expected
   2265   EXPECT_TRUE(interceptor.did_simulate_error_main_);
   2266   EXPECT_TRUE(interceptor.did_intercept_final_);
   2267 
   2268   // Check we received one good response
   2269   EXPECT_TRUE(req.status().is_success());
   2270   EXPECT_EQ(200, req.response_headers()->response_code());
   2271   EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
   2272   EXPECT_EQ(1, d.response_started_count());
   2273   EXPECT_EQ(0, d.received_redirect_count());
   2274 }
   2275 
   2276 TEST_F(URLRequestTest, InterceptRestartRequired) {
   2277   TestInterceptor interceptor;
   2278 
   2279   // restart the main request
   2280   interceptor.restart_main_request_ = true;
   2281 
   2282   // then intercept the new main request and respond with an OK response
   2283   interceptor.intercept_main_request_ = true;
   2284   interceptor.main_headers_ = TestInterceptor::ok_headers();
   2285   interceptor.main_data_ = TestInterceptor::ok_data();
   2286 
   2287   TestDelegate d;
   2288   TestURLRequest req(GURL("http://test_intercept/foo"), &d);
   2289   req.set_method("GET");
   2290   req.Start();
   2291   MessageLoop::current()->Run();
   2292 
   2293   // Check the interceptor got called as expected
   2294   EXPECT_TRUE(interceptor.did_restart_main_);
   2295   EXPECT_TRUE(interceptor.did_intercept_main_);
   2296 
   2297   // Check we received one good response
   2298   EXPECT_TRUE(req.status().is_success());
   2299   if (req.status().is_success()) {
   2300     EXPECT_EQ(200, req.response_headers()->response_code());
   2301   }
   2302   EXPECT_EQ(TestInterceptor::ok_data(), d.data_received());
   2303   EXPECT_EQ(1, d.response_started_count());
   2304   EXPECT_EQ(0, d.received_redirect_count());
   2305 }
   2306 
   2307 TEST_F(URLRequestTest, InterceptRespectsCancelMain) {
   2308   TestInterceptor interceptor;
   2309 
   2310   // intercept the main request and cancel from within the restarted job
   2311   interceptor.cancel_main_request_ = true;
   2312 
   2313   // setup to intercept final response and override it with an OK response
   2314   interceptor.intercept_final_response_ = true;
   2315   interceptor.final_headers_ = TestInterceptor::ok_headers();
   2316   interceptor.final_data_ = TestInterceptor::ok_data();
   2317 
   2318   TestDelegate d;
   2319   TestURLRequest req(GURL("http://test_intercept/foo"), &d);
   2320   req.set_method("GET");
   2321   req.Start();
   2322   MessageLoop::current()->Run();
   2323 
   2324   // Check the interceptor got called as expected
   2325   EXPECT_TRUE(interceptor.did_cancel_main_);
   2326   EXPECT_FALSE(interceptor.did_intercept_final_);
   2327 
   2328   // Check we see a canceled request
   2329   EXPECT_FALSE(req.status().is_success());
   2330   EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
   2331 }
   2332 
   2333 TEST_F(URLRequestTest, InterceptRespectsCancelRedirect) {
   2334   TestInterceptor interceptor;
   2335 
   2336   // intercept the main request and respond with a redirect
   2337   interceptor.intercept_main_request_ = true;
   2338   interceptor.main_headers_ = TestInterceptor::redirect_headers();
   2339   interceptor.main_data_ = TestInterceptor::redirect_data();
   2340 
   2341   // intercept the redirect and cancel from within that job
   2342   interceptor.cancel_redirect_request_ = true;
   2343 
   2344   // setup to intercept final response and override it with an OK response
   2345   interceptor.intercept_final_response_ = true;
   2346   interceptor.final_headers_ = TestInterceptor::ok_headers();
   2347   interceptor.final_data_ = TestInterceptor::ok_data();
   2348 
   2349   TestDelegate d;
   2350   TestURLRequest req(GURL("http://test_intercept/foo"), &d);
   2351   req.set_method("GET");
   2352   req.Start();
   2353   MessageLoop::current()->Run();
   2354 
   2355   // Check the interceptor got called as expected
   2356   EXPECT_TRUE(interceptor.did_intercept_main_);
   2357   EXPECT_TRUE(interceptor.did_cancel_redirect_);
   2358   EXPECT_FALSE(interceptor.did_intercept_final_);
   2359 
   2360   // Check we see a canceled request
   2361   EXPECT_FALSE(req.status().is_success());
   2362   EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
   2363 }
   2364 
   2365 TEST_F(URLRequestTest, InterceptRespectsCancelFinal) {
   2366   TestInterceptor interceptor;
   2367 
   2368   // intercept the main request to simulate a network error
   2369   interceptor.simulate_main_network_error_ = true;
   2370 
   2371   // setup to intercept final response and cancel from within that job
   2372   interceptor.cancel_final_request_ = true;
   2373 
   2374   TestDelegate d;
   2375   TestURLRequest req(GURL("http://test_intercept/foo"), &d);
   2376   req.set_method("GET");
   2377   req.Start();
   2378   MessageLoop::current()->Run();
   2379 
   2380   // Check the interceptor got called as expected
   2381   EXPECT_TRUE(interceptor.did_simulate_error_main_);
   2382   EXPECT_TRUE(interceptor.did_cancel_final_);
   2383 
   2384   // Check we see a canceled request
   2385   EXPECT_FALSE(req.status().is_success());
   2386   EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
   2387 }
   2388 
   2389 TEST_F(URLRequestTest, InterceptRespectsCancelInRestart) {
   2390   TestInterceptor interceptor;
   2391 
   2392   // intercept the main request and cancel then restart from within that job
   2393   interceptor.cancel_then_restart_main_request_ = true;
   2394 
   2395   // setup to intercept final response and override it with an OK response
   2396   interceptor.intercept_final_response_ = true;
   2397   interceptor.final_headers_ = TestInterceptor::ok_headers();
   2398   interceptor.final_data_ = TestInterceptor::ok_data();
   2399 
   2400   TestDelegate d;
   2401   TestURLRequest req(GURL("http://test_intercept/foo"), &d);
   2402   req.set_method("GET");
   2403   req.Start();
   2404   MessageLoop::current()->Run();
   2405 
   2406   // Check the interceptor got called as expected
   2407   EXPECT_TRUE(interceptor.did_cancel_then_restart_main_);
   2408   EXPECT_FALSE(interceptor.did_intercept_final_);
   2409 
   2410   // Check we see a canceled request
   2411   EXPECT_FALSE(req.status().is_success());
   2412   EXPECT_EQ(URLRequestStatus::CANCELED, req.status().status());
   2413 }
   2414 
   2415 // Check that two different URL requests have different identifiers.
   2416 TEST_F(URLRequestTest, Identifiers) {
   2417   TestDelegate d;
   2418   TestURLRequest req(GURL("http://example.com"), &d);
   2419   TestURLRequest other_req(GURL("http://example.com"), &d);
   2420 
   2421   ASSERT_NE(req.identifier(), other_req.identifier());
   2422 }
   2423 
   2424 // Check that a failure to connect to the proxy is reported to the network
   2425 // delegate.
   2426 TEST_F(URLRequestTest, NetworkDelegateProxyError) {
   2427   TestDelegate d;
   2428   TestNetworkDelegate network_delegate;
   2429   TestURLRequest req(GURL("http://example.com"), &d);
   2430   req.set_method("GET");
   2431 
   2432   scoped_ptr<MockHostResolverBase> host_resolver(
   2433       new MockHostResolver);
   2434   host_resolver->rules()->AddSimulatedFailure("*");
   2435   scoped_refptr<TestURLRequestContext> context(
   2436       new TestURLRequestContext("myproxy:70", host_resolver.release()));
   2437   context->set_network_delegate(&network_delegate);
   2438   req.set_context(context);
   2439 
   2440   req.Start();
   2441   MessageLoop::current()->Run();
   2442 
   2443   // Check we see a failed request.
   2444   EXPECT_FALSE(req.status().is_success());
   2445   EXPECT_EQ(URLRequestStatus::FAILED, req.status().status());
   2446   EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, req.status().os_error());
   2447 
   2448   EXPECT_EQ(1, network_delegate.error_count());
   2449   EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, network_delegate.last_os_error());
   2450 }
   2451 
   2452 class URLRequestTestFTP : public URLRequestTest {
   2453  public:
   2454   URLRequestTestFTP() : test_server_(TestServer::TYPE_FTP, FilePath()) {
   2455   }
   2456 
   2457  protected:
   2458   TestServer test_server_;
   2459 };
   2460 
   2461 // Flaky, see http://crbug.com/25045.
   2462 TEST_F(URLRequestTestFTP, FLAKY_FTPDirectoryListing) {
   2463   ASSERT_TRUE(test_server_.Start());
   2464 
   2465   TestDelegate d;
   2466   {
   2467     TestURLRequest r(test_server_.GetURL("/"), &d);
   2468     r.Start();
   2469     EXPECT_TRUE(r.is_pending());
   2470 
   2471     MessageLoop::current()->Run();
   2472 
   2473     EXPECT_FALSE(r.is_pending());
   2474     EXPECT_EQ(1, d.response_started_count());
   2475     EXPECT_FALSE(d.received_data_before_response());
   2476     EXPECT_LT(0, d.bytes_received());
   2477     EXPECT_EQ(test_server_.host_port_pair().host(),
   2478               r.GetSocketAddress().host());
   2479     EXPECT_EQ(test_server_.host_port_pair().port(),
   2480               r.GetSocketAddress().port());
   2481   }
   2482 }
   2483 
   2484 // Flaky, see http://crbug.com/25045.
   2485 TEST_F(URLRequestTestFTP, FLAKY_FTPGetTestAnonymous) {
   2486   ASSERT_TRUE(test_server_.Start());
   2487 
   2488   FilePath app_path;
   2489   PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
   2490   app_path = app_path.AppendASCII("LICENSE");
   2491   TestDelegate d;
   2492   {
   2493     TestURLRequest r(test_server_.GetURL("/LICENSE"), &d);
   2494     r.Start();
   2495     EXPECT_TRUE(r.is_pending());
   2496 
   2497     MessageLoop::current()->Run();
   2498 
   2499     int64 file_size = 0;
   2500     file_util::GetFileSize(app_path, &file_size);
   2501 
   2502     EXPECT_FALSE(r.is_pending());
   2503     EXPECT_EQ(1, d.response_started_count());
   2504     EXPECT_FALSE(d.received_data_before_response());
   2505     EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
   2506     EXPECT_EQ(test_server_.host_port_pair().host(),
   2507               r.GetSocketAddress().host());
   2508     EXPECT_EQ(test_server_.host_port_pair().port(),
   2509               r.GetSocketAddress().port());
   2510   }
   2511 }
   2512 
   2513 // Flaky, see http://crbug.com/25045.
   2514 TEST_F(URLRequestTestFTP, FLAKY_FTPGetTest) {
   2515   ASSERT_TRUE(test_server_.Start());
   2516 
   2517   FilePath app_path;
   2518   PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
   2519   app_path = app_path.AppendASCII("LICENSE");
   2520   TestDelegate d;
   2521   {
   2522     TestURLRequest r(
   2523         test_server_.GetURLWithUserAndPassword("/LICENSE", "chrome", "chrome"),
   2524         &d);
   2525     r.Start();
   2526     EXPECT_TRUE(r.is_pending());
   2527 
   2528     MessageLoop::current()->Run();
   2529 
   2530     int64 file_size = 0;
   2531     file_util::GetFileSize(app_path, &file_size);
   2532 
   2533     EXPECT_FALSE(r.is_pending());
   2534     EXPECT_EQ(test_server_.host_port_pair().host(),
   2535               r.GetSocketAddress().host());
   2536     EXPECT_EQ(test_server_.host_port_pair().port(),
   2537               r.GetSocketAddress().port());
   2538     EXPECT_EQ(1, d.response_started_count());
   2539     EXPECT_FALSE(d.received_data_before_response());
   2540     EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
   2541   }
   2542 }
   2543 
   2544 // Flaky, see http://crbug.com/25045.
   2545 TEST_F(URLRequestTestFTP, FLAKY_FTPCheckWrongPassword) {
   2546   ASSERT_TRUE(test_server_.Start());
   2547 
   2548   FilePath app_path;
   2549   PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
   2550   app_path = app_path.AppendASCII("LICENSE");
   2551   TestDelegate d;
   2552   {
   2553     TestURLRequest r(
   2554         test_server_.GetURLWithUserAndPassword("/LICENSE",
   2555                                                "chrome",
   2556                                                "wrong_password"),
   2557         &d);
   2558     r.Start();
   2559     EXPECT_TRUE(r.is_pending());
   2560 
   2561     MessageLoop::current()->Run();
   2562 
   2563     int64 file_size = 0;
   2564     file_util::GetFileSize(app_path, &file_size);
   2565 
   2566     EXPECT_FALSE(r.is_pending());
   2567     EXPECT_EQ(1, d.response_started_count());
   2568     EXPECT_FALSE(d.received_data_before_response());
   2569     EXPECT_EQ(d.bytes_received(), 0);
   2570   }
   2571 }
   2572 
   2573 // Flaky, see http://crbug.com/25045.
   2574 TEST_F(URLRequestTestFTP, FLAKY_FTPCheckWrongPasswordRestart) {
   2575   ASSERT_TRUE(test_server_.Start());
   2576 
   2577   FilePath app_path;
   2578   PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
   2579   app_path = app_path.AppendASCII("LICENSE");
   2580   TestDelegate d;
   2581   // Set correct login credentials. The delegate will be asked for them when
   2582   // the initial login with wrong credentials will fail.
   2583   d.set_username(kChrome);
   2584   d.set_password(kChrome);
   2585   {
   2586     TestURLRequest r(
   2587         test_server_.GetURLWithUserAndPassword("/LICENSE",
   2588                                                "chrome",
   2589                                                "wrong_password"),
   2590         &d);
   2591     r.Start();
   2592     EXPECT_TRUE(r.is_pending());
   2593 
   2594     MessageLoop::current()->Run();
   2595 
   2596     int64 file_size = 0;
   2597     file_util::GetFileSize(app_path, &file_size);
   2598 
   2599     EXPECT_FALSE(r.is_pending());
   2600     EXPECT_EQ(1, d.response_started_count());
   2601     EXPECT_FALSE(d.received_data_before_response());
   2602     EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
   2603   }
   2604 }
   2605 
   2606 // Flaky, see http://crbug.com/25045.
   2607 TEST_F(URLRequestTestFTP, FLAKY_FTPCheckWrongUser) {
   2608   ASSERT_TRUE(test_server_.Start());
   2609 
   2610   FilePath app_path;
   2611   PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
   2612   app_path = app_path.AppendASCII("LICENSE");
   2613   TestDelegate d;
   2614   {
   2615     TestURLRequest r(
   2616         test_server_.GetURLWithUserAndPassword("/LICENSE",
   2617                                                "wrong_user",
   2618                                                "chrome"),
   2619         &d);
   2620     r.Start();
   2621     EXPECT_TRUE(r.is_pending());
   2622 
   2623     MessageLoop::current()->Run();
   2624 
   2625     int64 file_size = 0;
   2626     file_util::GetFileSize(app_path, &file_size);
   2627 
   2628     EXPECT_FALSE(r.is_pending());
   2629     EXPECT_EQ(1, d.response_started_count());
   2630     EXPECT_FALSE(d.received_data_before_response());
   2631     EXPECT_EQ(d.bytes_received(), 0);
   2632   }
   2633 }
   2634 
   2635 // Flaky, see http://crbug.com/25045.
   2636 TEST_F(URLRequestTestFTP, FLAKY_FTPCheckWrongUserRestart) {
   2637   ASSERT_TRUE(test_server_.Start());
   2638 
   2639   FilePath app_path;
   2640   PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
   2641   app_path = app_path.AppendASCII("LICENSE");
   2642   TestDelegate d;
   2643   // Set correct login credentials. The delegate will be asked for them when
   2644   // the initial login with wrong credentials will fail.
   2645   d.set_username(kChrome);
   2646   d.set_password(kChrome);
   2647   {
   2648     TestURLRequest r(
   2649         test_server_.GetURLWithUserAndPassword("/LICENSE",
   2650                                                "wrong_user",
   2651                                                "chrome"),
   2652         &d);
   2653     r.Start();
   2654     EXPECT_TRUE(r.is_pending());
   2655 
   2656     MessageLoop::current()->Run();
   2657 
   2658     int64 file_size = 0;
   2659     file_util::GetFileSize(app_path, &file_size);
   2660 
   2661     EXPECT_FALSE(r.is_pending());
   2662     EXPECT_EQ(1, d.response_started_count());
   2663     EXPECT_FALSE(d.received_data_before_response());
   2664     EXPECT_EQ(d.bytes_received(), static_cast<int>(file_size));
   2665   }
   2666 }
   2667 
   2668 // Flaky, see http://crbug.com/25045.
   2669 TEST_F(URLRequestTestFTP, FLAKY_FTPCacheURLCredentials) {
   2670   ASSERT_TRUE(test_server_.Start());
   2671 
   2672   FilePath app_path;
   2673   PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
   2674   app_path = app_path.AppendASCII("LICENSE");
   2675 
   2676   scoped_ptr<TestDelegate> d(new TestDelegate);
   2677   {
   2678     // Pass correct login identity in the URL.
   2679     TestURLRequest r(
   2680         test_server_.GetURLWithUserAndPassword("/LICENSE",
   2681                                                "chrome",
   2682                                                "chrome"),
   2683         d.get());
   2684     r.Start();
   2685     EXPECT_TRUE(r.is_pending());
   2686 
   2687     MessageLoop::current()->Run();
   2688 
   2689     int64 file_size = 0;
   2690     file_util::GetFileSize(app_path, &file_size);
   2691 
   2692     EXPECT_FALSE(r.is_pending());
   2693     EXPECT_EQ(1, d->response_started_count());
   2694     EXPECT_FALSE(d->received_data_before_response());
   2695     EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
   2696   }
   2697 
   2698   d.reset(new TestDelegate);
   2699   {
   2700     // This request should use cached identity from previous request.
   2701     TestURLRequest r(test_server_.GetURL("/LICENSE"), d.get());
   2702     r.Start();
   2703     EXPECT_TRUE(r.is_pending());
   2704 
   2705     MessageLoop::current()->Run();
   2706 
   2707     int64 file_size = 0;
   2708     file_util::GetFileSize(app_path, &file_size);
   2709 
   2710     EXPECT_FALSE(r.is_pending());
   2711     EXPECT_EQ(1, d->response_started_count());
   2712     EXPECT_FALSE(d->received_data_before_response());
   2713     EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
   2714   }
   2715 }
   2716 
   2717 // Flaky, see http://crbug.com/25045.
   2718 TEST_F(URLRequestTestFTP, FLAKY_FTPCacheLoginBoxCredentials) {
   2719   ASSERT_TRUE(test_server_.Start());
   2720 
   2721   FilePath app_path;
   2722   PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
   2723   app_path = app_path.AppendASCII("LICENSE");
   2724 
   2725   scoped_ptr<TestDelegate> d(new TestDelegate);
   2726   // Set correct login credentials. The delegate will be asked for them when
   2727   // the initial login with wrong credentials will fail.
   2728   d->set_username(kChrome);
   2729   d->set_password(kChrome);
   2730   {
   2731     TestURLRequest r(
   2732         test_server_.GetURLWithUserAndPassword("/LICENSE",
   2733                                                "chrome",
   2734                                                "wrong_password"),
   2735         d.get());
   2736     r.Start();
   2737     EXPECT_TRUE(r.is_pending());
   2738 
   2739     MessageLoop::current()->Run();
   2740 
   2741     int64 file_size = 0;
   2742     file_util::GetFileSize(app_path, &file_size);
   2743 
   2744     EXPECT_FALSE(r.is_pending());
   2745     EXPECT_EQ(1, d->response_started_count());
   2746     EXPECT_FALSE(d->received_data_before_response());
   2747     EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
   2748   }
   2749 
   2750   // Use a new delegate without explicit credentials. The cached ones should be
   2751   // used.
   2752   d.reset(new TestDelegate);
   2753   {
   2754     // Don't pass wrong credentials in the URL, they would override valid cached
   2755     // ones.
   2756     TestURLRequest r(test_server_.GetURL("/LICENSE"), d.get());
   2757     r.Start();
   2758     EXPECT_TRUE(r.is_pending());
   2759 
   2760     MessageLoop::current()->Run();
   2761 
   2762     int64 file_size = 0;
   2763     file_util::GetFileSize(app_path, &file_size);
   2764 
   2765     EXPECT_FALSE(r.is_pending());
   2766     EXPECT_EQ(1, d->response_started_count());
   2767     EXPECT_FALSE(d->received_data_before_response());
   2768     EXPECT_EQ(d->bytes_received(), static_cast<int>(file_size));
   2769   }
   2770 }
   2771 
   2772 // Check that default A-L header is sent.
   2773 TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) {
   2774   ASSERT_TRUE(test_server_.Start());
   2775 
   2776   TestDelegate d;
   2777   TestURLRequest req(test_server_.GetURL("echoheader?Accept-Language"), &d);
   2778   scoped_refptr<URLRequestContext> context = new TestURLRequestContext;
   2779   context->set_accept_language("en");
   2780   req.set_context(context);
   2781   req.Start();
   2782   MessageLoop::current()->Run();
   2783   EXPECT_EQ("en", d.data_received());
   2784 }
   2785 
   2786 // Check that an empty A-L header is not sent. http://crbug.com/77365.
   2787 TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) {
   2788   ASSERT_TRUE(test_server_.Start());
   2789 
   2790   TestDelegate d;
   2791   TestURLRequest req(test_server_.GetURL("echoheader?Accept-Language"),
   2792                                          &d);
   2793   scoped_refptr<URLRequestContext> context = new TestURLRequestContext;
   2794   context->set_accept_language("");
   2795   req.set_context(context);
   2796   req.Start();
   2797   MessageLoop::current()->Run();
   2798   EXPECT_EQ("None", d.data_received());
   2799 }
   2800 
   2801 // Check that if request overrides the A-L header, the default is not appended.
   2802 // See http://crbug.com/20894
   2803 TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) {
   2804   ASSERT_TRUE(test_server_.Start());
   2805 
   2806   TestDelegate d;
   2807   TestURLRequest
   2808       req(test_server_.GetURL("echoheader?Accept-Language"), &d);
   2809   req.set_context(new TestURLRequestContext());
   2810   HttpRequestHeaders headers;
   2811   headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru");
   2812   req.SetExtraRequestHeaders(headers);
   2813   req.Start();
   2814   MessageLoop::current()->Run();
   2815   EXPECT_EQ(std::string("ru"), d.data_received());
   2816 }
   2817 
   2818 // Check that default A-C header is sent.
   2819 TEST_F(URLRequestTestHTTP, DefaultAcceptCharset) {
   2820   ASSERT_TRUE(test_server_.Start());
   2821 
   2822   TestDelegate d;
   2823   TestURLRequest req(test_server_.GetURL("echoheader?Accept-Charset"), &d);
   2824   scoped_refptr<URLRequestContext> context = new TestURLRequestContext;
   2825   context->set_accept_charset("en");
   2826   req.set_context(context);
   2827   req.Start();
   2828   MessageLoop::current()->Run();
   2829   EXPECT_EQ("en", d.data_received());
   2830 }
   2831 
   2832 // Check that an empty A-C header is not sent. http://crbug.com/77365.
   2833 TEST_F(URLRequestTestHTTP, EmptyAcceptCharset) {
   2834   ASSERT_TRUE(test_server_.Start());
   2835 
   2836   TestDelegate d;
   2837   TestURLRequest req(test_server_.GetURL("echoheader?Accept-Charset"),
   2838                                          &d);
   2839   scoped_refptr<URLRequestContext> context = new TestURLRequestContext;
   2840   context->set_accept_charset("");
   2841   req.set_context(context);
   2842   req.Start();
   2843   MessageLoop::current()->Run();
   2844   EXPECT_EQ("None", d.data_received());
   2845 }
   2846 
   2847 // Check that if request overrides the A-C header, the default is not appended.
   2848 // See http://crbug.com/20894
   2849 TEST_F(URLRequestTestHTTP, OverrideAcceptCharset) {
   2850   ASSERT_TRUE(test_server_.Start());
   2851 
   2852   TestDelegate d;
   2853   TestURLRequest
   2854       req(test_server_.GetURL("echoheader?Accept-Charset"), &d);
   2855   req.set_context(new TestURLRequestContext());
   2856   HttpRequestHeaders headers;
   2857   headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r");
   2858   req.SetExtraRequestHeaders(headers);
   2859   req.Start();
   2860   MessageLoop::current()->Run();
   2861   EXPECT_EQ(std::string("koi-8r"), d.data_received());
   2862 }
   2863 
   2864 // Check that default User-Agent header is sent.
   2865 TEST_F(URLRequestTestHTTP, DefaultUserAgent) {
   2866   ASSERT_TRUE(test_server_.Start());
   2867 
   2868   TestDelegate d;
   2869   TestURLRequest req(test_server_.GetURL("echoheader?User-Agent"), &d);
   2870   req.set_context(new TestURLRequestContext());
   2871   req.Start();
   2872   MessageLoop::current()->Run();
   2873   EXPECT_EQ(req.context()->GetUserAgent(req.url()), d.data_received());
   2874 }
   2875 
   2876 // Check that if request overrides the User-Agent header,
   2877 // the default is not appended.
   2878 TEST_F(URLRequestTestHTTP, OverrideUserAgent) {
   2879   ASSERT_TRUE(test_server_.Start());
   2880 
   2881   TestDelegate d;
   2882   TestURLRequest
   2883       req(test_server_.GetURL("echoheader?User-Agent"), &d);
   2884   req.set_context(new TestURLRequestContext());
   2885   HttpRequestHeaders headers;
   2886   headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)");
   2887   req.SetExtraRequestHeaders(headers);
   2888   req.Start();
   2889   MessageLoop::current()->Run();
   2890   // If the net tests are being run with ChromeFrame then we need to allow for
   2891   // the 'chromeframe' suffix which is added to the user agent before the
   2892   // closing parentheses.
   2893   EXPECT_TRUE(StartsWithASCII(d.data_received(), "Lynx (textmode", true));
   2894 }
   2895 
   2896 }  // namespace net
   2897