blob: f7c592df2addbfe7a4975cb059ba95e82d9fd192 [file] [log] [blame]
[email protected]9045b8822012-01-13 20:35:351// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit586acc5fe2008-07-26 22:42:524
dchengc7eeda422015-12-26 03:56:485#include <utility>
6
mmenkefd9d15c2017-06-29 13:45:547// This must be before Windows headers
[email protected]ea224582008-12-07 20:25:468#include "build/build_config.h"
9
[email protected]9396b252008-09-29 17:29:3810#if defined(OS_WIN)
robliaoeb9bfd642017-05-18 17:35:1611#include <objbase.h>
[email protected]aa84a7e2012-03-15 21:29:0612#include <shlobj.h>
Fan Yang5a88d5d2017-10-24 01:14:2913#include <windows.h>
Robert Liaoc88f99d12017-10-17 21:48:3314#include <wrl/client.h>
[email protected]9396b252008-09-29 17:29:3815#endif
16
tbansalea2fb8c2015-05-22 22:23:0017#include <stdint.h>
18
initial.commit586acc5fe2008-07-26 22:42:5219#include <algorithm>
avibf0746c2015-12-09 19:53:1420#include <limits>
initial.commit586acc5fe2008-07-26 22:42:5221
nharperb7441ef2016-01-25 23:54:1422#include "base/base64url.h"
[email protected]218aa6a12011-09-13 17:38:3823#include "base/bind.h"
[email protected]8523ba52011-05-22 19:00:5824#include "base/compiler_specific.h"
mmenke9f2ec60c2015-06-01 20:59:4725#include "base/files/file_path.h"
thestigd8df0332014-09-04 06:33:2926#include "base/files/file_util.h"
[email protected]3ca8b362013-11-11 22:18:0727#include "base/files/scoped_temp_dir.h"
[email protected]34b2b002009-11-20 06:53:2828#include "base/format_macros.h"
estark06e0dac2015-08-07 21:56:0129#include "base/json/json_reader.h"
skyostil4891b25b2015-06-11 11:43:4530#include "base/location.h"
Avi Drissman13fc8932015-12-20 04:40:4631#include "base/macros.h"
avi0d991472017-04-27 07:04:0432#include "base/memory/ptr_util.h"
[email protected]084262c2011-12-01 21:12:4733#include "base/memory/weak_ptr.h"
[email protected]7f86564d2013-07-18 00:41:2234#include "base/message_loop/message_loop.h"
initial.commit586acc5fe2008-07-26 22:42:5235#include "base/path_service.h"
mmenkefb18c772015-09-30 22:22:5036#include "base/power_monitor/power_monitor.h"
37#include "base/power_monitor/power_monitor_source.h"
[email protected]255620da2013-08-19 13:14:2938#include "base/run_loop.h"
skyostil4891b25b2015-06-11 11:43:4539#include "base/single_thread_task_runner.h"
[email protected]4dc3ad4f2013-06-11 07:15:5040#include "base/strings/string_number_conversions.h"
[email protected]d069c11a2013-04-13 00:01:5541#include "base/strings/string_piece.h"
[email protected]d778e0422013-03-06 18:10:2242#include "base/strings/string_split.h"
[email protected]7f86564d2013-07-18 00:41:2243#include "base/strings/string_util.h"
44#include "base/strings/stringprintf.h"
[email protected]750b2f3c2013-06-07 18:41:0545#include "base/strings/utf_string_conversions.h"
tbansalea2fb8c2015-05-22 22:23:0046#include "base/test/histogram_tester.h"
Emily Stark4cfecf072017-08-08 01:05:5147#include "base/test/scoped_feature_list.h"
gabf767595f2016-05-11 18:50:3548#include "base/threading/thread_task_runner_handle.h"
estark06e0dac2015-08-07 21:56:0149#include "base/values.h"
mmenkefd9d15c2017-06-29 13:45:5450#include "build/buildflag.h"
mmenkecbc2b712014-10-09 20:29:0751#include "net/base/chunked_upload_data_stream.h"
tfarina43a416b2016-01-06 21:48:0752#include "net/base/directory_listing.h"
mmenkecbc2b712014-10-09 20:29:0753#include "net/base/elements_upload_data_stream.h"
initial.commit586acc5fe2008-07-26 22:42:5254#include "net/base/load_flags.h"
[email protected]58e32bb2013-01-21 18:23:2555#include "net/base/load_timing_info.h"
56#include "net/base/load_timing_info_test_util.h"
[email protected]d8eb84242010-09-25 02:25:0657#include "net/base/net_errors.h"
initial.commit586acc5fe2008-07-26 22:42:5258#include "net/base/net_module.h"
[email protected]2ca01e52013-10-31 22:05:1959#include "net/base/request_priority.h"
zhongyi18ddddd2017-02-03 19:06:3660#include "net/base/test_completion_callback.h"
[email protected]f288ef02012-12-15 20:28:2861#include "net/base/upload_bytes_element_reader.h"
62#include "net/base/upload_data_stream.h"
63#include "net/base/upload_file_element_reader.h"
tfarina7a4a7fd2016-01-20 14:23:4464#include "net/base/url_util.h"
rsleevid6de8302016-06-21 01:33:2065#include "net/cert/ct_policy_enforcer.h"
estark1614475f2016-03-10 03:46:4766#include "net/cert/ct_policy_status.h"
rsleevi22cae1672016-12-28 01:53:3667#include "net/cert/do_nothing_ct_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1168#include "net/cert/ev_root_ca_metadata.h"
[email protected]a8fed1742013-12-27 02:14:2469#include "net/cert/mock_cert_verifier.h"
zhongyi18ddddd2017-02-03 19:06:3670#include "net/cert/multi_log_ct_verifier.h"
eranmdcec9632016-10-10 14:16:1071#include "net/cert/signed_certificate_timestamp_and_status.h"
[email protected]6e7845ae2013-03-29 21:48:1172#include "net/cert/test_root_certs.h"
[email protected]aa84a7e2012-03-15 21:29:0673#include "net/cookies/cookie_monster.h"
74#include "net/cookies/cookie_store_test_helpers.h"
initial.commit586acc5fe2008-07-26 22:42:5275#include "net/disk_cache/disk_cache.h"
[email protected]f2cb3cf2013-03-21 01:40:5376#include "net/dns/mock_host_resolver.h"
[email protected]b7572ea2013-11-26 20:16:3877#include "net/http/http_byte_range.h"
initial.commit586acc5fe2008-07-26 22:42:5278#include "net/http/http_cache.h"
79#include "net/http/http_network_layer.h"
[email protected]c3456bb2011-12-12 22:22:1980#include "net/http/http_network_session.h"
[email protected]88e6b6f32010-05-07 23:14:2581#include "net/http/http_request_headers.h"
[email protected]319d9e6f2009-02-18 19:47:2182#include "net/http/http_response_headers.h"
zhongyi18ddddd2017-02-03 19:06:3683#include "net/http/http_server_properties_impl.h"
[email protected]e50efea2014-03-24 18:41:0084#include "net/http/http_util.h"
mikecirone8b85c432016-09-08 19:11:0085#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1986#include "net/log/net_log_source.h"
vishal.b62985ca92015-04-17 08:45:5187#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4688#include "net/log/test_net_log_entry.h"
89#include "net/log/test_net_log_util.h"
brettwa1228ebb2016-10-28 03:51:3490#include "net/net_features.h"
tbansalca83c002016-04-28 20:56:2891#include "net/nqe/external_estimate_provider.h"
tbansal2ecbbc72016-10-06 17:15:4792#include "net/proxy/proxy_server.h"
[email protected]63de95b2008-12-10 04:11:2793#include "net/proxy/proxy_service.h"
zhongyi18ddddd2017-02-03 19:06:3694#include "net/quic/chromium/mock_crypto_client_stream_factory.h"
95#include "net/quic/chromium/quic_server_info.h"
96#include "net/socket/socket_test_util.h"
[email protected]c3456bb2011-12-12 22:22:1997#include "net/socket/ssl_client_socket.h"
nharperb7441ef2016-01-25 23:54:1498#include "net/ssl/channel_id_service.h"
99#include "net/ssl/default_channel_id_store.h"
[email protected]536fd0b2013-03-14 17:41:57100#include "net/ssl/ssl_connection_status_flags.h"
tommycli59a63432015-11-06 00:10:55101#include "net/ssl/ssl_server_config.h"
nharperb7441ef2016-01-25 23:54:14102#include "net/ssl/token_binding.h"
[email protected]6e7845ae2013-03-29 21:48:11103#include "net/test/cert_test_util.h"
estarkcd39c11f2015-10-19 19:46:36104#include "net/test/embedded_test_server/embedded_test_server.h"
105#include "net/test/embedded_test_server/http_request.h"
106#include "net/test/embedded_test_server/http_response.h"
robpercival214763f2016-07-01 23:27:01107#include "net/test/gtest_util.h"
[email protected]89b32522013-05-07 20:04:21108#include "net/test/spawned_test_server/spawned_test_server.h"
rsleevia69c79a2016-06-22 03:28:43109#include "net/test/test_data_directory.h"
mmenkefb18c772015-09-30 22:22:50110#include "net/test/url_request/url_request_failed_job.h"
rhalavatib7bd7c792017-04-27 05:25:16111#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]e0f35c92013-05-08 16:04:34112#include "net/url_request/data_protocol_handler.h"
[email protected]ee4c30d2012-11-07 15:08:43113#include "net/url_request/static_http_user_agent_settings.h"
initial.commit586acc5fe2008-07-26 22:42:52114#include "net/url_request/url_request.h"
mmenkefb18c772015-09-30 22:22:50115#include "net/url_request/url_request_filter.h"
[email protected]bcb84f8b2009-08-31 16:20:14116#include "net/url_request/url_request_http_job.h"
bengr1bf8e942014-11-07 01:36:50117#include "net/url_request/url_request_intercepting_job_factory.h"
118#include "net/url_request/url_request_interceptor.h"
[email protected]9d5730b2012-08-24 17:42:49119#include "net/url_request/url_request_job_factory_impl.h"
[email protected]3c5ca8c2011-09-29 01:14:51120#include "net/url_request/url_request_redirect_job.h"
[email protected]a5c713f2009-04-16 21:05:47121#include "net/url_request/url_request_test_job.h"
[email protected]d2db0292011-01-26 20:23:44122#include "net/url_request/url_request_test_util.h"
robpercival214763f2016-07-01 23:27:01123#include "testing/gmock/include/gmock/gmock.h"
initial.commit586acc5fe2008-07-26 22:42:52124#include "testing/gtest/include/gtest/gtest.h"
[email protected]23887f04f2008-12-02 19:20:15125#include "testing/platform_test.h"
initial.commit586acc5fe2008-07-26 22:42:52126
Eric Romanefddd0a2017-10-10 02:14:25127#if defined(OS_FUCHSIA)
128#define USE_BUILTIN_CERT_VERIFIER
129#endif
130
brettwa1228ebb2016-10-28 03:51:34131#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]5ecf7cb282014-05-11 01:49:55132#include "net/base/filename_util.h"
[email protected]02494ec2014-05-07 15:05:29133#include "net/url_request/file_protocol_handler.h"
134#include "net/url_request/url_request_file_dir_job.h"
135#endif
136
brettwa1228ebb2016-10-28 03:51:34137#if !BUILDFLAG(DISABLE_FTP_SUPPORT) && !defined(OS_ANDROID)
mmenke9f2ec60c2015-06-01 20:59:47138#include "net/ftp/ftp_network_layer.h"
[email protected]02494ec2014-05-07 15:05:29139#include "net/url_request/ftp_protocol_handler.h"
140#endif
141
[email protected]dffe8242012-03-20 15:14:27142#if defined(OS_WIN)
[email protected]451fd902012-10-03 17:14:48143#include "base/win/scoped_com_initializer.h"
[email protected]dffe8242012-03-20 15:14:27144#endif
145
mmenkefd9d15c2017-06-29 13:45:54146#if BUILDFLAG(ENABLE_REPORTING)
147#include "net/reporting/reporting_service.h"
Julia Tuttle3f9acac2017-11-20 22:06:30148#include "net/url_request/network_error_logging_delegate.h"
mmenkefd9d15c2017-06-29 13:45:54149#endif // BUILDFLAG(ENABLE_REPORTING)
150
Eric Romanefddd0a2017-10-10 02:14:25151#if defined(USE_BUILTIN_CERT_VERIFIER)
152#include "net/cert/cert_net_fetcher.h"
153#include "net/cert_net/cert_net_fetcher_impl.h"
154#endif
155
156#if defined(USE_NSS_CERTS)
157#include "net/cert_net/nss_ocsp.h"
158#endif
159
robpercival214763f2016-07-01 23:27:01160using net::test::IsError;
161using net::test::IsOk;
162
[email protected]ad65a3e2013-12-25 18:18:01163using base::ASCIIToUTF16;
[email protected]e1acf6f2008-10-27 20:43:33164using base::Time;
halton.huoe4e45742014-12-08 07:55:46165using std::string;
[email protected]e1acf6f2008-10-27 20:43:33166
[email protected]7461a402011-03-24 23:19:51167namespace net {
168
initial.commit586acc5fe2008-07-26 22:42:52169namespace {
170
Martijn Croonenb1383da2017-10-11 11:56:35171namespace test_default {
172#include "net/http/transport_security_state_static_unittest_default.h"
xunjieli815ad5b2017-07-18 15:51:35173}
174
[email protected]42cba2fb2013-03-29 19:58:57175const base::string16 kChrome(ASCIIToUTF16("chrome"));
176const base::string16 kSecret(ASCIIToUTF16("secret"));
177const base::string16 kUser(ASCIIToUTF16("user"));
[email protected]13c8a092010-07-29 06:15:44178
mmenke9f2ec60c2015-06-01 20:59:47179const base::FilePath::CharType kTestFilePath[] =
180 FILE_PATH_LITERAL("net/data/url_request_unittest");
181
Sergey Ulanovc4580e72017-09-13 23:30:11182#if !BUILDFLAG(DISABLE_FTP_SUPPORT) && !defined(OS_ANDROID) && \
183 !defined(OS_FUCHSIA)
mmenke9f2ec60c2015-06-01 20:59:47184// Test file used in most FTP tests.
185const char kFtpTestFile[] = "BullRunSpeech.txt";
186#endif
187
[email protected]2bba3252013-04-08 19:50:59188// Tests load timing information in the case a fresh connection was used, with
189// no proxy.
[email protected]cba24642014-08-15 20:49:59190void TestLoadTimingNotReused(const LoadTimingInfo& load_timing_info,
[email protected]58e32bb2013-01-21 18:23:25191 int connect_timing_flags) {
192 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19193 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]58e32bb2013-01-21 18:23:25194
195 EXPECT_FALSE(load_timing_info.request_start_time.is_null());
196 EXPECT_FALSE(load_timing_info.request_start.is_null());
197
198 EXPECT_LE(load_timing_info.request_start,
199 load_timing_info.connect_timing.connect_start);
200 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
201 connect_timing_flags);
202 EXPECT_LE(load_timing_info.connect_timing.connect_end,
203 load_timing_info.send_start);
204 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
205 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
206
[email protected]58e32bb2013-01-21 18:23:25207 EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
208 EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
209}
210
[email protected]2bba3252013-04-08 19:50:59211// Same as above, but with proxy times.
212void TestLoadTimingNotReusedWithProxy(
[email protected]cba24642014-08-15 20:49:59213 const LoadTimingInfo& load_timing_info,
[email protected]2bba3252013-04-08 19:50:59214 int connect_timing_flags) {
215 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19216 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]2bba3252013-04-08 19:50:59217
218 EXPECT_FALSE(load_timing_info.request_start_time.is_null());
219 EXPECT_FALSE(load_timing_info.request_start.is_null());
220
221 EXPECT_LE(load_timing_info.request_start,
222 load_timing_info.proxy_resolve_start);
223 EXPECT_LE(load_timing_info.proxy_resolve_start,
224 load_timing_info.proxy_resolve_end);
225 EXPECT_LE(load_timing_info.proxy_resolve_end,
226 load_timing_info.connect_timing.connect_start);
227 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
228 connect_timing_flags);
229 EXPECT_LE(load_timing_info.connect_timing.connect_end,
230 load_timing_info.send_start);
231 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
232 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
233}
234
235// Same as above, but with a reused socket and proxy times.
236void TestLoadTimingReusedWithProxy(
[email protected]cba24642014-08-15 20:49:59237 const LoadTimingInfo& load_timing_info) {
[email protected]2bba3252013-04-08 19:50:59238 EXPECT_TRUE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19239 EXPECT_NE(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]2bba3252013-04-08 19:50:59240
241 EXPECT_FALSE(load_timing_info.request_start_time.is_null());
242 EXPECT_FALSE(load_timing_info.request_start.is_null());
243
244 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
245
246 EXPECT_LE(load_timing_info.request_start,
247 load_timing_info.proxy_resolve_start);
248 EXPECT_LE(load_timing_info.proxy_resolve_start,
249 load_timing_info.proxy_resolve_end);
250 EXPECT_LE(load_timing_info.proxy_resolve_end,
251 load_timing_info.send_start);
252 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
253 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
254}
255
brettwa1228ebb2016-10-28 03:51:34256#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]3b23a222013-05-15 21:33:25257// Tests load timing information in the case of a cache hit, when no cache
258// validation request was sent over the wire.
[email protected]e3a85452013-11-14 01:46:17259base::StringPiece TestNetResourceProvider(int key) {
260 return "header";
261}
262
263void FillBuffer(char* buffer, size_t len) {
264 static bool called = false;
265 if (!called) {
266 called = true;
267 int seed = static_cast<int>(Time::Now().ToInternalValue());
268 srand(seed);
269 }
270
271 for (size_t i = 0; i < len; i++) {
272 buffer[i] = static_cast<char>(rand());
273 if (!buffer[i])
274 buffer[i] = 'g';
275 }
276}
xunjielia6888202015-04-14 21:34:25277#endif
[email protected]e3a85452013-11-14 01:46:17278
[email protected]3b23a222013-05-15 21:33:25279void TestLoadTimingCacheHitNoNetwork(
[email protected]cba24642014-08-15 20:49:59280 const LoadTimingInfo& load_timing_info) {
[email protected]3b23a222013-05-15 21:33:25281 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19282 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]3b23a222013-05-15 21:33:25283
284 EXPECT_FALSE(load_timing_info.request_start_time.is_null());
285 EXPECT_FALSE(load_timing_info.request_start.is_null());
286
287 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
288 EXPECT_LE(load_timing_info.request_start, load_timing_info.send_start);
289 EXPECT_LE(load_timing_info.send_start, load_timing_info.send_end);
290 EXPECT_LE(load_timing_info.send_end, load_timing_info.receive_headers_end);
291
292 EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
293 EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
294}
295
Sergey Ulanovc4580e72017-09-13 23:30:11296#if !BUILDFLAG(DISABLE_FTP_SUPPORT) && !defined(OS_ANDROID) && \
297 !defined(OS_FUCHSIA)
[email protected]3b23a222013-05-15 21:33:25298// Tests load timing in the case that there is no HTTP response. This can be
299// used to test in the case of errors or non-HTTP requests.
300void TestLoadTimingNoHttpResponse(
[email protected]cba24642014-08-15 20:49:59301 const LoadTimingInfo& load_timing_info) {
[email protected]58e32bb2013-01-21 18:23:25302 EXPECT_FALSE(load_timing_info.socket_reused);
mikecironef22f9812016-10-04 03:40:19303 EXPECT_EQ(NetLogSource::kInvalidId, load_timing_info.socket_log_id);
[email protected]58e32bb2013-01-21 18:23:25304
305 // Only the request times should be non-null.
306 EXPECT_FALSE(load_timing_info.request_start_time.is_null());
307 EXPECT_FALSE(load_timing_info.request_start.is_null());
308
309 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
310
311 EXPECT_TRUE(load_timing_info.proxy_resolve_start.is_null());
312 EXPECT_TRUE(load_timing_info.proxy_resolve_end.is_null());
313 EXPECT_TRUE(load_timing_info.send_start.is_null());
314 EXPECT_TRUE(load_timing_info.send_end.is_null());
315 EXPECT_TRUE(load_timing_info.receive_headers_end.is_null());
316}
xunjielia6888202015-04-14 21:34:25317#endif
[email protected]58e32bb2013-01-21 18:23:25318
mmenkefb18c772015-09-30 22:22:50319// Test power monitor source that can simulate entering suspend mode. Can't use
320// the one in base/ because it insists on bringing its own MessageLoop.
321class TestPowerMonitorSource : public base::PowerMonitorSource {
322 public:
323 TestPowerMonitorSource() {}
324 ~TestPowerMonitorSource() override {}
325
326 void Suspend() { ProcessPowerEvent(SUSPEND_EVENT); }
327
328 void Resume() { ProcessPowerEvent(RESUME_EVENT); }
329
330 bool IsOnBatteryPowerImpl() override { return false; }
331
332 private:
333 DISALLOW_COPY_AND_ASSIGN(TestPowerMonitorSource);
334};
335
mmenkeed0498b2015-12-08 23:20:42336// Job that allows monitoring of its priority.
337class PriorityMonitoringURLRequestJob : public URLRequestTestJob {
338 public:
339 // The latest priority of the job is always written to |request_priority_|.
340 PriorityMonitoringURLRequestJob(URLRequest* request,
341 NetworkDelegate* network_delegate,
342 RequestPriority* request_priority)
343 : URLRequestTestJob(request, network_delegate),
344 request_priority_(request_priority) {
345 *request_priority_ = DEFAULT_PRIORITY;
346 }
347
348 void SetPriority(RequestPriority priority) override {
349 *request_priority_ = priority;
350 URLRequestTestJob::SetPriority(priority);
351 }
352
353 private:
354 RequestPriority* const request_priority_;
355};
356
[email protected]71c64f62008-11-15 04:36:51357// Do a case-insensitive search through |haystack| for |needle|.
358bool ContainsString(const std::string& haystack, const char* needle) {
brettwa2027fb2015-07-14 02:24:50359 std::string::const_iterator it = std::search(
360 haystack.begin(), haystack.end(), needle, needle + strlen(needle),
361 base::CaseInsensitiveCompareASCII<char>());
[email protected]71c64f62008-11-15 04:36:51362 return it != haystack.end();
363}
364
danakj8522a25b2016-04-16 00:17:36365std::unique_ptr<UploadDataStream> CreateSimpleUploadData(const char* data) {
366 std::unique_ptr<UploadElementReader> reader(
[email protected]f288ef02012-12-15 20:28:28367 new UploadBytesElementReader(data, strlen(data)));
dchengc7eeda422015-12-26 03:56:48368 return ElementsUploadDataStream::CreateWithReader(std::move(reader), 0);
[email protected]195e77d2009-07-23 19:10:23369}
370
[email protected]96adadb2010-08-28 01:16:17371// Verify that the SSLInfo of a successful SSL connection has valid values.
[email protected]7461a402011-03-24 23:19:51372void CheckSSLInfo(const SSLInfo& ssl_info) {
[email protected]96adadb2010-08-28 01:16:17373 // -1 means unknown. 0 means no encryption.
374 EXPECT_GT(ssl_info.security_bits, 0);
375
376 // The cipher suite TLS_NULL_WITH_NULL_NULL (0) must not be negotiated.
avibf0746c2015-12-09 19:53:14377 uint16_t cipher_suite =
378 SSLConnectionStatusToCipherSuite(ssl_info.connection_status);
pkasting6b68a162014-12-01 22:10:29379 EXPECT_NE(0U, cipher_suite);
[email protected]96adadb2010-08-28 01:16:17380}
381
[email protected]79e1fd62013-06-20 06:50:04382void CheckFullRequestHeaders(const HttpRequestHeaders& headers,
383 const GURL& host_url) {
384 std::string sent_value;
385
386 EXPECT_TRUE(headers.GetHeader("Host", &sent_value));
387 EXPECT_EQ(GetHostAndOptionalPort(host_url), sent_value);
388
389 EXPECT_TRUE(headers.GetHeader("Connection", &sent_value));
390 EXPECT_EQ("keep-alive", sent_value);
391}
392
[email protected]dc5a5cf2012-09-26 02:49:30393// A network delegate that allows the user to choose a subset of request stages
394// to block in. When blocking, the delegate can do one of the following:
395// * synchronously return a pre-specified error code, or
396// * asynchronously return that value via an automatically called callback,
397// or
398// * block and wait for the user to do a callback.
399// Additionally, the user may also specify a redirect URL -- then each request
400// with the current URL different from the redirect target will be redirected
401// to that target, in the on-before-URL-request stage, independent of whether
402// the delegate blocks in ON_BEFORE_URL_REQUEST or not.
[email protected]4c76d7c2011-04-15 19:14:12403class BlockingNetworkDelegate : public TestNetworkDelegate {
404 public:
[email protected]dc5a5cf2012-09-26 02:49:30405 // Stages in which the delegate can block.
406 enum Stage {
[email protected]9045b8822012-01-13 20:35:35407 NOT_BLOCKED = 0,
408 ON_BEFORE_URL_REQUEST = 1 << 0,
409 ON_BEFORE_SEND_HEADERS = 1 << 1,
410 ON_HEADERS_RECEIVED = 1 << 2,
411 ON_AUTH_REQUIRED = 1 << 3
412 };
413
[email protected]dc5a5cf2012-09-26 02:49:30414 // Behavior during blocked stages. During other stages, just
[email protected]cba24642014-08-15 20:49:59415 // returns OK or NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION.
[email protected]dc5a5cf2012-09-26 02:49:30416 enum BlockMode {
417 SYNCHRONOUS, // No callback, returns specified return values.
418 AUTO_CALLBACK, // |this| posts a task to run the callback using the
419 // specified return codes.
420 USER_CALLBACK, // User takes care of doing a callback. |retval_| and
421 // |auth_retval_| are ignored. In every blocking stage the
422 // message loop is quit.
rdsmithbf8c3c12016-11-18 18:16:24423 USER_NOTIFY, // User is notified by a provided callback of the
424 // blocking, and synchronously returns instructions
425 // for handling it.
[email protected]dc5a5cf2012-09-26 02:49:30426 };
427
rdsmithbf8c3c12016-11-18 18:16:24428 using NotificationCallback =
429 base::Callback<Error(const CompletionCallback&, const URLRequest*)>;
430
431 using NotificationAuthCallback =
432 base::Callback<NetworkDelegate::AuthRequiredResponse(const AuthCallback&,
433 const URLRequest*)>;
434
[email protected]dc5a5cf2012-09-26 02:49:30435 // Creates a delegate which does not block at all.
436 explicit BlockingNetworkDelegate(BlockMode block_mode);
437
438 // For users to trigger a callback returning |response|.
439 // Side-effects: resets |stage_blocked_for_callback_| and stored callbacks.
440 // Only call if |block_mode_| == USER_CALLBACK.
441 void DoCallback(int response);
442 void DoAuthCallback(NetworkDelegate::AuthRequiredResponse response);
443
444 // Setters.
445 void set_retval(int retval) {
446 ASSERT_NE(USER_CALLBACK, block_mode_);
447 ASSERT_NE(ERR_IO_PENDING, retval);
448 ASSERT_NE(OK, retval);
449 retval_ = retval;
[email protected]9045b8822012-01-13 20:35:35450 }
451
[email protected]dc5a5cf2012-09-26 02:49:30452 // If |auth_retval| == AUTH_REQUIRED_RESPONSE_SET_AUTH, then
453 // |auth_credentials_| will be passed with the response.
454 void set_auth_retval(AuthRequiredResponse auth_retval) {
455 ASSERT_NE(USER_CALLBACK, block_mode_);
456 ASSERT_NE(AUTH_REQUIRED_RESPONSE_IO_PENDING, auth_retval);
457 auth_retval_ = auth_retval;
458 }
459 void set_auth_credentials(const AuthCredentials& auth_credentials) {
460 auth_credentials_ = auth_credentials;
[email protected]9045b8822012-01-13 20:35:35461 }
462
[email protected]dc5a5cf2012-09-26 02:49:30463 void set_redirect_url(const GURL& url) {
464 redirect_url_ = url;
[email protected]9045b8822012-01-13 20:35:35465 }
466
[email protected]dc5a5cf2012-09-26 02:49:30467 void set_block_on(int block_on) {
468 block_on_ = block_on;
[email protected]9045b8822012-01-13 20:35:35469 }
470
rdsmithbf8c3c12016-11-18 18:16:24471 // Only valid if |block_mode_| == USER_NOTIFY
472 void set_notification_callback(
473 const NotificationCallback& notification_callback) {
474 notification_callback_ = notification_callback;
475 }
476
477 void set_notification_auth_callback(
478 const NotificationAuthCallback& notification_auth_callback) {
479 notification_auth_callback_ = notification_auth_callback;
480 }
481
[email protected]dc5a5cf2012-09-26 02:49:30482 // Allows the user to check in which state did we block.
483 Stage stage_blocked_for_callback() const {
484 EXPECT_EQ(USER_CALLBACK, block_mode_);
485 return stage_blocked_for_callback_;
[email protected]9045b8822012-01-13 20:35:35486 }
487
488 private:
[email protected]dc5a5cf2012-09-26 02:49:30489 void RunCallback(int response, const CompletionCallback& callback);
490 void RunAuthCallback(AuthRequiredResponse response,
491 const AuthCallback& callback);
492
[email protected]9045b8822012-01-13 20:35:35493 // TestNetworkDelegate implementation.
dchengb03027d2014-10-21 12:00:20494 int OnBeforeURLRequest(URLRequest* request,
495 const CompletionCallback& callback,
496 GURL* new_url) override;
[email protected]9045b8822012-01-13 20:35:35497
ryansturm2343cb62016-06-15 01:09:00498 int OnBeforeStartTransaction(URLRequest* request,
499 const CompletionCallback& callback,
500 HttpRequestHeaders* headers) override;
[email protected]9045b8822012-01-13 20:35:35501
dchengb03027d2014-10-21 12:00:20502 int OnHeadersReceived(
[email protected]9045b8822012-01-13 20:35:35503 URLRequest* request,
504 const CompletionCallback& callback,
[email protected]507af8f2012-10-20 00:42:32505 const HttpResponseHeaders* original_response_headers,
[email protected]5f714132014-03-26 10:41:16506 scoped_refptr<HttpResponseHeaders>* override_response_headers,
mostynbba063d6032014-10-09 11:01:13507 GURL* allowed_unsafe_redirect_url) override;
[email protected]9045b8822012-01-13 20:35:35508
dchengb03027d2014-10-21 12:00:20509 NetworkDelegate::AuthRequiredResponse OnAuthRequired(
[email protected]9045b8822012-01-13 20:35:35510 URLRequest* request,
511 const AuthChallengeInfo& auth_info,
512 const AuthCallback& callback,
mostynbba063d6032014-10-09 11:01:13513 AuthCredentials* credentials) override;
[email protected]9045b8822012-01-13 20:35:35514
[email protected]dc5a5cf2012-09-26 02:49:30515 // Resets the callbacks and |stage_blocked_for_callback_|.
516 void Reset();
[email protected]9045b8822012-01-13 20:35:35517
[email protected]dc5a5cf2012-09-26 02:49:30518 // Checks whether we should block in |stage|. If yes, returns an error code
519 // and optionally sets up callback based on |block_mode_|. If no, returns OK.
rdsmithbf8c3c12016-11-18 18:16:24520 int MaybeBlockStage(Stage stage,
521 const URLRequest* request,
522 const CompletionCallback& callback);
[email protected]dc5a5cf2012-09-26 02:49:30523
524 // Configuration parameters, can be adjusted by public methods:
525 const BlockMode block_mode_;
526
527 // Values returned on blocking stages when mode is SYNCHRONOUS or
528 // AUTO_CALLBACK. For USER_CALLBACK these are set automatically to IO_PENDING.
529 int retval_; // To be returned in non-auth stages.
530 AuthRequiredResponse auth_retval_;
531
[email protected]5f714132014-03-26 10:41:16532 GURL redirect_url_; // Used if non-empty during OnBeforeURLRequest.
[email protected]dc5a5cf2012-09-26 02:49:30533 int block_on_; // Bit mask: in which stages to block.
534
535 // |auth_credentials_| will be copied to |*target_auth_credential_| on
536 // callback.
537 AuthCredentials auth_credentials_;
538 AuthCredentials* target_auth_credentials_;
539
540 // Internal variables, not set by not the user:
541 // Last blocked stage waiting for user callback (unused if |block_mode_| !=
542 // USER_CALLBACK).
543 Stage stage_blocked_for_callback_;
544
545 // Callback objects stored during blocking stages.
[email protected]9045b8822012-01-13 20:35:35546 CompletionCallback callback_;
547 AuthCallback auth_callback_;
[email protected]dc5a5cf2012-09-26 02:49:30548
rdsmithbf8c3c12016-11-18 18:16:24549 // Callback to request user instructions for blocking.
550 NotificationCallback notification_callback_;
551 NotificationAuthCallback notification_auth_callback_;
552
[email protected]dc5a5cf2012-09-26 02:49:30553 base::WeakPtrFactory<BlockingNetworkDelegate> weak_factory_;
554
555 DISALLOW_COPY_AND_ASSIGN(BlockingNetworkDelegate);
[email protected]9045b8822012-01-13 20:35:35556};
557
[email protected]dc5a5cf2012-09-26 02:49:30558BlockingNetworkDelegate::BlockingNetworkDelegate(BlockMode block_mode)
559 : block_mode_(block_mode),
560 retval_(OK),
561 auth_retval_(AUTH_REQUIRED_RESPONSE_NO_ACTION),
562 block_on_(0),
563 target_auth_credentials_(NULL),
564 stage_blocked_for_callback_(NOT_BLOCKED),
[email protected]aa249b52013-04-30 01:04:32565 weak_factory_(this) {
[email protected]dc5a5cf2012-09-26 02:49:30566}
567
568void BlockingNetworkDelegate::DoCallback(int response) {
569 ASSERT_EQ(USER_CALLBACK, block_mode_);
570 ASSERT_NE(NOT_BLOCKED, stage_blocked_for_callback_);
571 ASSERT_NE(ON_AUTH_REQUIRED, stage_blocked_for_callback_);
572 CompletionCallback callback = callback_;
573 Reset();
574 RunCallback(response, callback);
575}
576
577void BlockingNetworkDelegate::DoAuthCallback(
578 NetworkDelegate::AuthRequiredResponse response) {
579 ASSERT_EQ(USER_CALLBACK, block_mode_);
580 ASSERT_EQ(ON_AUTH_REQUIRED, stage_blocked_for_callback_);
581 AuthCallback auth_callback = auth_callback_;
582 Reset();
583 RunAuthCallback(response, auth_callback);
584}
585
586void BlockingNetworkDelegate::RunCallback(int response,
587 const CompletionCallback& callback) {
588 callback.Run(response);
589}
590
591void BlockingNetworkDelegate::RunAuthCallback(AuthRequiredResponse response,
592 const AuthCallback& callback) {
593 if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) {
594 ASSERT_TRUE(target_auth_credentials_ != NULL);
595 *target_auth_credentials_ = auth_credentials_;
596 }
597 callback.Run(response);
598}
599
600int BlockingNetworkDelegate::OnBeforeURLRequest(
601 URLRequest* request,
602 const CompletionCallback& callback,
603 GURL* new_url) {
604 if (redirect_url_ == request->url())
605 return OK; // We've already seen this request and redirected elsewhere.
606
607 TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url);
608
609 if (!redirect_url_.is_empty())
610 *new_url = redirect_url_;
611
rdsmithbf8c3c12016-11-18 18:16:24612 return MaybeBlockStage(ON_BEFORE_URL_REQUEST, request, callback);
[email protected]dc5a5cf2012-09-26 02:49:30613}
614
ryansturm2343cb62016-06-15 01:09:00615int BlockingNetworkDelegate::OnBeforeStartTransaction(
[email protected]dc5a5cf2012-09-26 02:49:30616 URLRequest* request,
617 const CompletionCallback& callback,
618 HttpRequestHeaders* headers) {
ryansturm2343cb62016-06-15 01:09:00619 TestNetworkDelegate::OnBeforeStartTransaction(request, callback, headers);
[email protected]dc5a5cf2012-09-26 02:49:30620
rdsmithbf8c3c12016-11-18 18:16:24621 return MaybeBlockStage(ON_BEFORE_SEND_HEADERS, request, callback);
[email protected]dc5a5cf2012-09-26 02:49:30622}
623
624int BlockingNetworkDelegate::OnHeadersReceived(
625 URLRequest* request,
626 const CompletionCallback& callback,
[email protected]507af8f2012-10-20 00:42:32627 const HttpResponseHeaders* original_response_headers,
[email protected]5f714132014-03-26 10:41:16628 scoped_refptr<HttpResponseHeaders>* override_response_headers,
629 GURL* allowed_unsafe_redirect_url) {
630 TestNetworkDelegate::OnHeadersReceived(request,
631 callback,
632 original_response_headers,
633 override_response_headers,
634 allowed_unsafe_redirect_url);
[email protected]dc5a5cf2012-09-26 02:49:30635
rdsmithbf8c3c12016-11-18 18:16:24636 return MaybeBlockStage(ON_HEADERS_RECEIVED, request, callback);
[email protected]dc5a5cf2012-09-26 02:49:30637}
638
639NetworkDelegate::AuthRequiredResponse BlockingNetworkDelegate::OnAuthRequired(
640 URLRequest* request,
641 const AuthChallengeInfo& auth_info,
642 const AuthCallback& callback,
643 AuthCredentials* credentials) {
644 TestNetworkDelegate::OnAuthRequired(request, auth_info, callback,
645 credentials);
646 // Check that the user has provided callback for the previous blocked stage.
647 EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_);
648
649 if ((block_on_ & ON_AUTH_REQUIRED) == 0) {
650 return AUTH_REQUIRED_RESPONSE_NO_ACTION;
651 }
652
653 target_auth_credentials_ = credentials;
654
655 switch (block_mode_) {
656 case SYNCHRONOUS:
657 if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH)
658 *target_auth_credentials_ = auth_credentials_;
659 return auth_retval_;
660
661 case AUTO_CALLBACK:
skyostil4891b25b2015-06-11 11:43:45662 base::ThreadTaskRunnerHandle::Get()->PostTask(
[email protected]dc5a5cf2012-09-26 02:49:30663 FROM_HERE,
664 base::Bind(&BlockingNetworkDelegate::RunAuthCallback,
665 weak_factory_.GetWeakPtr(), auth_retval_, callback));
666 return AUTH_REQUIRED_RESPONSE_IO_PENDING;
667
668 case USER_CALLBACK:
669 auth_callback_ = callback;
670 stage_blocked_for_callback_ = ON_AUTH_REQUIRED;
skyostil4891b25b2015-06-11 11:43:45671 base::ThreadTaskRunnerHandle::Get()->PostTask(
ki.stfu375812e2015-10-09 20:23:17672 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
[email protected]dc5a5cf2012-09-26 02:49:30673 return AUTH_REQUIRED_RESPONSE_IO_PENDING;
rdsmithbf8c3c12016-11-18 18:16:24674
675 case USER_NOTIFY:
676 // If the callback returns ERR_IO_PENDING, the user has accepted
677 // responsibility for running the callback in the future.
678 return notification_auth_callback_.Run(callback, request);
[email protected]dc5a5cf2012-09-26 02:49:30679 }
680 NOTREACHED();
681 return AUTH_REQUIRED_RESPONSE_NO_ACTION; // Dummy value.
682}
683
684void BlockingNetworkDelegate::Reset() {
685 EXPECT_NE(NOT_BLOCKED, stage_blocked_for_callback_);
686 stage_blocked_for_callback_ = NOT_BLOCKED;
687 callback_.Reset();
688 auth_callback_.Reset();
689}
690
691int BlockingNetworkDelegate::MaybeBlockStage(
692 BlockingNetworkDelegate::Stage stage,
rdsmithbf8c3c12016-11-18 18:16:24693 const URLRequest* request,
[email protected]dc5a5cf2012-09-26 02:49:30694 const CompletionCallback& callback) {
695 // Check that the user has provided callback for the previous blocked stage.
696 EXPECT_EQ(NOT_BLOCKED, stage_blocked_for_callback_);
697
698 if ((block_on_ & stage) == 0) {
699 return OK;
700 }
701
702 switch (block_mode_) {
703 case SYNCHRONOUS:
704 EXPECT_NE(OK, retval_);
705 return retval_;
706
707 case AUTO_CALLBACK:
skyostil4891b25b2015-06-11 11:43:45708 base::ThreadTaskRunnerHandle::Get()->PostTask(
709 FROM_HERE, base::Bind(&BlockingNetworkDelegate::RunCallback,
710 weak_factory_.GetWeakPtr(), retval_, callback));
[email protected]dc5a5cf2012-09-26 02:49:30711 return ERR_IO_PENDING;
712
713 case USER_CALLBACK:
714 callback_ = callback;
715 stage_blocked_for_callback_ = stage;
skyostil4891b25b2015-06-11 11:43:45716 base::ThreadTaskRunnerHandle::Get()->PostTask(
ki.stfu375812e2015-10-09 20:23:17717 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
[email protected]dc5a5cf2012-09-26 02:49:30718 return ERR_IO_PENDING;
rdsmithbf8c3c12016-11-18 18:16:24719
720 case USER_NOTIFY:
721 // If the callback returns ERR_IO_PENDING, the user has accepted
722 // responsibility for running the callback in the future.
723 return notification_callback_.Run(callback, request);
[email protected]dc5a5cf2012-09-26 02:49:30724 }
725 NOTREACHED();
726 return 0;
727}
728
[email protected]d5a4dd62012-05-23 01:41:04729class TestURLRequestContextWithProxy : public TestURLRequestContext {
730 public:
731 // Does not own |delegate|.
732 TestURLRequestContextWithProxy(const std::string& proxy,
733 NetworkDelegate* delegate)
734 : TestURLRequestContext(true) {
735 context_storage_.set_proxy_service(ProxyService::CreateFixed(proxy));
736 set_network_delegate(delegate);
737 Init();
738 }
dchengb03027d2014-10-21 12:00:20739 ~TestURLRequestContextWithProxy() override {}
[email protected]d5a4dd62012-05-23 01:41:04740};
741
stefanocsbd5be5202016-06-10 03:37:55742// A mock ReportSenderInterface that just remembers the latest report
estark06e0dac2015-08-07 21:56:01743// URI and report to be sent.
744class MockCertificateReportSender
stefanocsbd5be5202016-06-10 03:37:55745 : public TransportSecurityState::ReportSenderInterface {
estark06e0dac2015-08-07 21:56:01746 public:
747 MockCertificateReportSender() {}
748 ~MockCertificateReportSender() override {}
749
meacer5d4dc5a2017-04-27 20:37:48750 void Send(const GURL& report_uri,
751 base::StringPiece content_type,
752 base::StringPiece report,
753 const base::Callback<void()>& success_callback,
754 const base::Callback<void(const GURL&, int, int)>& error_callback)
755 override {
estark06e0dac2015-08-07 21:56:01756 latest_report_uri_ = report_uri;
estarkb1716e22016-09-28 06:03:44757 report.CopyToString(&latest_report_);
758 content_type.CopyToString(&latest_content_type_);
estark06e0dac2015-08-07 21:56:01759 }
estark06e0dac2015-08-07 21:56:01760 const GURL& latest_report_uri() { return latest_report_uri_; }
761 const std::string& latest_report() { return latest_report_; }
estarkb1716e22016-09-28 06:03:44762 const std::string& latest_content_type() { return latest_content_type_; }
estark06e0dac2015-08-07 21:56:01763
764 private:
765 GURL latest_report_uri_;
766 std::string latest_report_;
estarkb1716e22016-09-28 06:03:44767 std::string latest_content_type_;
estark06e0dac2015-08-07 21:56:01768};
769
estarkcd39c11f2015-10-19 19:46:36770class TestExperimentalFeaturesNetworkDelegate : public TestNetworkDelegate {
771 public:
772 bool OnAreExperimentalCookieFeaturesEnabled() const override { return true; }
773};
774
dadrian612337a2016-07-20 22:36:58775// OCSPErrorTestDelegate caches the SSLInfo passed to OnSSLCertificateError.
776// This is needed because after the certificate failure, the URLRequest will
777// retry the connection, and return a partial SSLInfo with a cached cert status.
778// The partial SSLInfo does not have the OCSP information filled out.
779class OCSPErrorTestDelegate : public TestDelegate {
780 public:
781 void OnSSLCertificateError(URLRequest* request,
782 const SSLInfo& ssl_info,
783 bool fatal) override {
784 ssl_info_ = ssl_info;
785 on_ssl_certificate_error_called_ = true;
786 TestDelegate::OnSSLCertificateError(request, ssl_info, fatal);
787 }
788
789 bool on_ssl_certificate_error_called() {
790 return on_ssl_certificate_error_called_;
791 }
792
793 SSLInfo ssl_info() { return ssl_info_; }
794
795 private:
796 bool on_ssl_certificate_error_called_ = false;
797 SSLInfo ssl_info_;
798};
799
[email protected]d5a4dd62012-05-23 01:41:04800} // namespace
801
[email protected]a592c0432012-12-01 18:10:29802// Inherit PlatformTest since we require the autorelease pool on Mac OS X.
[email protected]7a0bb4bf2008-11-19 21:41:48803class URLRequestTest : public PlatformTest {
[email protected]abb26092010-11-11 22:19:00804 public:
fdorayf33fede2017-05-11 21:18:10805 URLRequestTest() : default_context_(true) {
[email protected]ef2bf422012-05-11 03:27:09806 default_context_.set_network_delegate(&default_network_delegate_);
[email protected]58e32bb2013-01-21 18:23:25807 default_context_.set_net_log(&net_log_);
bengr1bf8e942014-11-07 01:36:50808 job_factory_impl_ = new URLRequestJobFactoryImpl();
809 job_factory_.reset(job_factory_impl_);
[email protected]87a09a92011-07-14 15:50:50810 }
bengr1bf8e942014-11-07 01:36:50811
dcheng67be2b1f2014-10-27 21:47:29812 ~URLRequestTest() override {
[email protected]e4034ad2013-09-20 08:36:18813 // URLRequestJobs may post clean-up tasks on destruction.
814 base::RunLoop().RunUntilIdle();
Martijn Croonenb1383da2017-10-11 11:56:35815
816 SetTransportSecurityStateSourceForTesting(nullptr);
[email protected]e4034ad2013-09-20 08:36:18817 }
[email protected]87a09a92011-07-14 15:50:50818
dcheng2339883c2014-12-23 00:23:05819 void SetUp() override {
bengr1bf8e942014-11-07 01:36:50820 SetUpFactory();
821 default_context_.set_job_factory(job_factory_.get());
822 default_context_.Init();
823 PlatformTest::SetUp();
824 }
825
826 virtual void SetUpFactory() {
svaldez5d58c9e2015-08-24 21:36:20827 job_factory_impl_->SetProtocolHandler(
Bence Béky8f9d7d3952017-10-09 19:58:04828 "data", std::make_unique<DataProtocolHandler>());
brettwa1228ebb2016-10-28 03:51:34829#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
bengr1bf8e942014-11-07 01:36:50830 job_factory_impl_->SetProtocolHandler(
Jeremy Roman0579ed62017-08-29 15:56:19831 "file", std::make_unique<FileProtocolHandler>(
ricea2deef682016-09-09 08:04:07832 base::ThreadTaskRunnerHandle::Get()));
bengr1bf8e942014-11-07 01:36:50833#endif
834 }
835
836 TestNetworkDelegate* default_network_delegate() {
837 return &default_network_delegate_;
838 }
839
840 const TestURLRequestContext& default_context() const {
841 return default_context_;
842 }
843
844
[email protected]3c5ca8c2011-09-29 01:14:51845 // Adds the TestJobInterceptor to the default context.
846 TestJobInterceptor* AddTestInterceptor() {
[email protected]f53b4802012-12-20 17:04:23847 TestJobInterceptor* protocol_handler_ = new TestJobInterceptor();
svaldez5d58c9e2015-08-24 21:36:20848 job_factory_impl_->SetProtocolHandler("http", nullptr);
849 job_factory_impl_->SetProtocolHandler("http",
danakj8522a25b2016-04-16 00:17:36850 base::WrapUnique(protocol_handler_));
[email protected]f53b4802012-12-20 17:04:23851 return protocol_handler_;
[email protected]3c5ca8c2011-09-29 01:14:51852 }
853
Sergey Ulanov2e49f492017-09-14 19:37:51854 // Creates a temp test file and writes |data| to the file. The file will be
855 // deleted after the test completes.
856 void CreateTestFile(const char* data,
857 size_t data_size,
858 base::FilePath* test_file) {
859 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
860 // Get an absolute path since |temp_dir| can contain a symbolic link. As of
861 // now, Mac and Android bots return a path with a symbolic link.
862 base::FilePath absolute_temp_dir =
863 base::MakeAbsoluteFilePath(temp_dir_.GetPath());
864
865 ASSERT_TRUE(base::CreateTemporaryFileInDir(absolute_temp_dir, test_file));
866 ASSERT_EQ(static_cast<int>(data_size),
867 base::WriteFile(*test_file, data, data_size));
868 }
869
[email protected]87a09a92011-07-14 15:50:50870 protected:
vishal.b62985ca92015-04-17 08:45:51871 TestNetLog net_log_;
[email protected]ceefd7fd2012-11-29 00:36:24872 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest.
bengr1bf8e942014-11-07 01:36:50873 URLRequestJobFactoryImpl* job_factory_impl_;
danakj8522a25b2016-04-16 00:17:36874 std::unique_ptr<URLRequestJobFactory> job_factory_;
[email protected]ef2bf422012-05-11 03:27:09875 TestURLRequestContext default_context_;
Sergey Ulanov2e49f492017-09-14 19:37:51876 base::ScopedTempDir temp_dir_;
[email protected]7a0bb4bf2008-11-19 21:41:48877};
878
satoruxddac0442017-05-29 06:06:18879// This NetworkDelegate is picky about what files are accessible. Only
880// whitelisted files are allowed.
881class CookieBlockingNetworkDelegate : public TestNetworkDelegate {
882 public:
883 CookieBlockingNetworkDelegate(){};
884
885 // Adds |directory| to the access white list.
886 void AddToWhitelist(const base::FilePath& directory) {
887 whitelist_.insert(directory);
888 }
889
890 private:
891 // Returns true if |path| matches the white list.
892 bool OnCanAccessFileInternal(const base::FilePath& path) const {
893 for (const auto& directory : whitelist_) {
894 if (directory == path || directory.IsParent(path))
895 return true;
896 }
897 return false;
898 }
899
900 // Returns true only if both |original_path| and |absolute_path| match the
901 // white list.
902 bool OnCanAccessFile(const URLRequest& request,
903 const base::FilePath& original_path,
904 const base::FilePath& absolute_path) const override {
905 return (OnCanAccessFileInternal(original_path) &&
906 OnCanAccessFileInternal(absolute_path));
907 }
908
909 std::set<base::FilePath> whitelist_;
910
911 DISALLOW_COPY_AND_ASSIGN(CookieBlockingNetworkDelegate);
912};
913
[email protected]316c1e5e2012-09-12 15:17:44914TEST_F(URLRequestTest, AboutBlankTest) {
915 TestDelegate d;
916 {
rhalavatib7bd7c792017-04-27 05:25:16917 std::unique_ptr<URLRequest> r(
918 default_context_.CreateRequest(GURL("about:blank"), DEFAULT_PRIORITY,
919 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:44920
[email protected]f7022f32014-08-21 16:32:19921 r->Start();
922 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44923
[email protected]255620da2013-08-19 13:14:29924 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:44925
[email protected]f7022f32014-08-21 16:32:19926 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44927 EXPECT_FALSE(d.received_data_before_response());
928 EXPECT_EQ(d.bytes_received(), 0);
[email protected]f7022f32014-08-21 16:32:19929 EXPECT_EQ("", r->GetSocketAddress().host());
930 EXPECT_EQ(0, r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:04931
932 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:19933 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]316c1e5e2012-09-12 15:17:44934 }
935}
936
937TEST_F(URLRequestTest, DataURLImageTest) {
938 TestDelegate d;
939 {
940 // Use our nice little Chrome logo.
danakj8522a25b2016-04-16 00:17:36941 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
942 GURL("data:image/png;base64,"
943 "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUB"
944 "BjG3w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQ"
945 "xIEVxitD5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI"
946 "5MpCVdW0gO7tvNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKz"
947 "Mx1+fg9bAgK6zHq9cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7Ck"
948 "IMDxQpF7r/MWq12UctI1dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0"
949 "WYUqt57yWf2McHTObYPbVD+ZwbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2H"
950 "QQcm43XwmtoYM6vVKleh0uoWvnzW3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nk"
951 "DFHF9ZS+uYVjRUasMeHUmyLYtcklTvzWGFZnNOXczThvpKIzjcahSqIzkvDLayDq6"
952 "D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTbxXX1T5xsV9tm9r4TQwHLiZw/pdDZJ"
953 "ea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5MrVvMzNaI3+ERHfrFzPKQukrQ"
954 "GI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gVMd6q5c8GdosynKmSeRuGz"
955 "pjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq/uxxZKzNiZFGD0wRC"
956 "3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7FUx1qLnV7MGF40"
957 "smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufBJbsysjjW4"
958 "kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJMnlm2O"
959 "34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfmm"
960 "oRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV"
961 "5EnhORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="),
rhalavatib7bd7c792017-04-27 05:25:16962 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:44963
[email protected]f7022f32014-08-21 16:32:19964 r->Start();
965 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44966
[email protected]255620da2013-08-19 13:14:29967 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:44968
[email protected]f7022f32014-08-21 16:32:19969 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44970 EXPECT_FALSE(d.received_data_before_response());
971 EXPECT_EQ(d.bytes_received(), 911);
[email protected]f7022f32014-08-21 16:32:19972 EXPECT_EQ("", r->GetSocketAddress().host());
973 EXPECT_EQ(0, r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:04974
975 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:19976 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]316c1e5e2012-09-12 15:17:44977 }
978}
979
brettwa1228ebb2016-10-28 03:51:34980#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]316c1e5e2012-09-12 15:17:44981TEST_F(URLRequestTest, FileTest) {
Sergey Ulanov2e49f492017-09-14 19:37:51982 const char kTestFileContent[] = "Hello";
983 base::FilePath test_file;
984 ASSERT_NO_FATAL_FAILURE(
985 CreateTestFile(kTestFileContent, sizeof(kTestFileContent), &test_file));
kraush5a645822016-04-07 18:35:04986
Sergey Ulanov2e49f492017-09-14 19:37:51987 GURL test_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:44988
989 TestDelegate d;
990 {
rhalavatib7bd7c792017-04-27 05:25:16991 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
Sergey Ulanov2e49f492017-09-14 19:37:51992 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:44993
[email protected]f7022f32014-08-21 16:32:19994 r->Start();
995 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44996
[email protected]255620da2013-08-19 13:14:29997 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:44998
[email protected]f7022f32014-08-21 16:32:19999 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441000 EXPECT_EQ(1, d.response_started_count());
1001 EXPECT_FALSE(d.received_data_before_response());
Sergey Ulanov2e49f492017-09-14 19:37:511002 EXPECT_EQ(d.bytes_received(), static_cast<int>(sizeof(kTestFileContent)));
[email protected]f7022f32014-08-21 16:32:191003 EXPECT_EQ("", r->GetSocketAddress().host());
1004 EXPECT_EQ(0, r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:041005
1006 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:191007 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]316c1e5e2012-09-12 15:17:441008 }
1009}
1010
[email protected]ba40bb762012-12-17 07:11:041011TEST_F(URLRequestTest, FileTestCancel) {
Sergey Ulanov2e49f492017-09-14 19:37:511012 const char kTestFileContent[] = "Hello";
1013 base::FilePath test_file;
1014 ASSERT_NO_FATAL_FAILURE(
1015 CreateTestFile(kTestFileContent, sizeof(kTestFileContent), &test_file));
1016
1017 GURL test_url = FilePathToFileURL(test_file);
[email protected]ba40bb762012-12-17 07:11:041018
1019 TestDelegate d;
1020 {
rhalavatib7bd7c792017-04-27 05:25:161021 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
Sergey Ulanov2e49f492017-09-14 19:37:511022 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]ba40bb762012-12-17 07:11:041023
[email protected]f7022f32014-08-21 16:32:191024 r->Start();
1025 EXPECT_TRUE(r->is_pending());
1026 r->Cancel();
[email protected]ba40bb762012-12-17 07:11:041027 }
[email protected]79e1fd62013-06-20 06:50:041028 // Async cancellation should be safe even when URLRequest has been already
[email protected]ba40bb762012-12-17 07:11:041029 // destroyed.
[email protected]255620da2013-08-19 13:14:291030 base::RunLoop().RunUntilIdle();
[email protected]ba40bb762012-12-17 07:11:041031}
1032
[email protected]316c1e5e2012-09-12 15:17:441033TEST_F(URLRequestTest, FileTestFullSpecifiedRange) {
1034 const size_t buffer_size = 4000;
danakj8522a25b2016-04-16 00:17:361035 std::unique_ptr<char[]> buffer(new char[buffer_size]);
[email protected]316c1e5e2012-09-12 15:17:441036 FillBuffer(buffer.get(), buffer_size);
1037
Sergey Ulanov2e49f492017-09-14 19:37:511038 base::FilePath test_file;
1039 ASSERT_NO_FATAL_FAILURE(
1040 CreateTestFile(buffer.get(), buffer_size, &test_file));
1041 GURL temp_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:441042
1043 const size_t first_byte_position = 500;
1044 const size_t last_byte_position = buffer_size - first_byte_position;
1045 const size_t content_length = last_byte_position - first_byte_position + 1;
1046 std::string partial_buffer_string(buffer.get() + first_byte_position,
1047 buffer.get() + last_byte_position + 1);
1048
1049 TestDelegate d;
1050 {
rhalavatib7bd7c792017-04-27 05:25:161051 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1052 temp_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:441053
1054 HttpRequestHeaders headers;
[email protected]b7572ea2013-11-26 20:16:381055 headers.SetHeader(
1056 HttpRequestHeaders::kRange,
[email protected]cba24642014-08-15 20:49:591057 HttpByteRange::Bounded(
[email protected]b7572ea2013-11-26 20:16:381058 first_byte_position, last_byte_position).GetHeaderValue());
[email protected]f7022f32014-08-21 16:32:191059 r->SetExtraRequestHeaders(headers);
1060 r->Start();
1061 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441062
[email protected]255620da2013-08-19 13:14:291063 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:191064 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441065 EXPECT_EQ(1, d.response_started_count());
1066 EXPECT_FALSE(d.received_data_before_response());
1067 EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
1068 // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
1069 EXPECT_TRUE(partial_buffer_string == d.data_received());
1070 }
[email protected]316c1e5e2012-09-12 15:17:441071}
1072
1073TEST_F(URLRequestTest, FileTestHalfSpecifiedRange) {
1074 const size_t buffer_size = 4000;
danakj8522a25b2016-04-16 00:17:361075 std::unique_ptr<char[]> buffer(new char[buffer_size]);
[email protected]316c1e5e2012-09-12 15:17:441076 FillBuffer(buffer.get(), buffer_size);
1077
Sergey Ulanov2e49f492017-09-14 19:37:511078 base::FilePath test_file;
1079 ASSERT_NO_FATAL_FAILURE(
1080 CreateTestFile(buffer.get(), buffer_size, &test_file));
1081 GURL temp_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:441082
1083 const size_t first_byte_position = 500;
1084 const size_t last_byte_position = buffer_size - 1;
1085 const size_t content_length = last_byte_position - first_byte_position + 1;
1086 std::string partial_buffer_string(buffer.get() + first_byte_position,
1087 buffer.get() + last_byte_position + 1);
1088
1089 TestDelegate d;
1090 {
rhalavatib7bd7c792017-04-27 05:25:161091 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1092 temp_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:441093
1094 HttpRequestHeaders headers;
1095 headers.SetHeader(HttpRequestHeaders::kRange,
[email protected]cba24642014-08-15 20:49:591096 HttpByteRange::RightUnbounded(
[email protected]b7572ea2013-11-26 20:16:381097 first_byte_position).GetHeaderValue());
[email protected]f7022f32014-08-21 16:32:191098 r->SetExtraRequestHeaders(headers);
1099 r->Start();
1100 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441101
[email protected]255620da2013-08-19 13:14:291102 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:191103 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441104 EXPECT_EQ(1, d.response_started_count());
1105 EXPECT_FALSE(d.received_data_before_response());
1106 EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
1107 // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
1108 EXPECT_TRUE(partial_buffer_string == d.data_received());
1109 }
[email protected]316c1e5e2012-09-12 15:17:441110}
1111
1112TEST_F(URLRequestTest, FileTestMultipleRanges) {
1113 const size_t buffer_size = 400000;
danakj8522a25b2016-04-16 00:17:361114 std::unique_ptr<char[]> buffer(new char[buffer_size]);
[email protected]316c1e5e2012-09-12 15:17:441115 FillBuffer(buffer.get(), buffer_size);
1116
Sergey Ulanov2e49f492017-09-14 19:37:511117 base::FilePath test_file;
1118 ASSERT_NO_FATAL_FAILURE(
1119 CreateTestFile(buffer.get(), buffer_size, &test_file));
1120 GURL temp_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:441121
1122 TestDelegate d;
1123 {
rhalavatib7bd7c792017-04-27 05:25:161124 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1125 temp_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:441126
1127 HttpRequestHeaders headers;
[email protected]b7572ea2013-11-26 20:16:381128 headers.SetHeader(HttpRequestHeaders::kRange, "bytes=0-0,10-200,200-300");
[email protected]f7022f32014-08-21 16:32:191129 r->SetExtraRequestHeaders(headers);
1130 r->Start();
1131 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441132
[email protected]255620da2013-08-19 13:14:291133 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441134 EXPECT_TRUE(d.request_failed());
1135 }
[email protected]316c1e5e2012-09-12 15:17:441136}
1137
[email protected]3ca8b362013-11-11 22:18:071138TEST_F(URLRequestTest, AllowFileURLs) {
Sergey Ulanov2e49f492017-09-14 19:37:511139 std::string test_data("monkey");
[email protected]3ca8b362013-11-11 22:18:071140 base::FilePath test_file;
Sergey Ulanov2e49f492017-09-14 19:37:511141 ASSERT_NO_FATAL_FAILURE(
1142 CreateTestFile(test_data.data(), test_data.size(), &test_file));
1143
satoruxddac0442017-05-29 06:06:181144 // The directory part of the path returned from CreateTemporaryFileInDir()
1145 // can be slightly different from |absolute_temp_dir| on Windows.
1146 // Example: C:\\Users\\CHROME~2 -> C:\\Users\\chrome-bot
1147 // Hence the test should use the directory name of |test_file|, rather than
1148 // |absolute_temp_dir|, for whitelisting.
1149 base::FilePath real_temp_dir = test_file.DirName();
[email protected]cba24642014-08-15 20:49:591150 GURL test_file_url = FilePathToFileURL(test_file);
[email protected]3ca8b362013-11-11 22:18:071151 {
1152 TestDelegate d;
satoruxddac0442017-05-29 06:06:181153 CookieBlockingNetworkDelegate network_delegate;
1154 network_delegate.AddToWhitelist(real_temp_dir);
[email protected]3ca8b362013-11-11 22:18:071155 default_context_.set_network_delegate(&network_delegate);
rhalavatib7bd7c792017-04-27 05:25:161156 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1157 test_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191158 r->Start();
[email protected]3ca8b362013-11-11 22:18:071159 base::RunLoop().Run();
satoruxddac0442017-05-29 06:06:181160 // This should be allowed as the file path is whitelisted.
[email protected]3ca8b362013-11-11 22:18:071161 EXPECT_FALSE(d.request_failed());
1162 EXPECT_EQ(test_data, d.data_received());
1163 }
1164
1165 {
1166 TestDelegate d;
satoruxddac0442017-05-29 06:06:181167 CookieBlockingNetworkDelegate network_delegate;
[email protected]3ca8b362013-11-11 22:18:071168 default_context_.set_network_delegate(&network_delegate);
rhalavatib7bd7c792017-04-27 05:25:161169 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1170 test_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191171 r->Start();
[email protected]3ca8b362013-11-11 22:18:071172 base::RunLoop().Run();
satoruxddac0442017-05-29 06:06:181173 // This should be rejected as the file path is not whitelisted.
[email protected]3ca8b362013-11-11 22:18:071174 EXPECT_TRUE(d.request_failed());
1175 EXPECT_EQ("", d.data_received());
satoruxddac0442017-05-29 06:06:181176 EXPECT_EQ(ERR_ACCESS_DENIED, d.request_status());
[email protected]3ca8b362013-11-11 22:18:071177 }
1178}
1179
Kevin Marshalla9f05ec2017-07-14 02:10:051180#if defined(OS_POSIX) && !defined(OS_FUCHSIA) // Because of symbolic links.
satoruxddac0442017-05-29 06:06:181181
1182TEST_F(URLRequestTest, SymlinksToFiles) {
Sergey Ulanov2e49f492017-09-14 19:37:511183 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
satoruxddac0442017-05-29 06:06:181184 // Get an absolute path since temp_dir can contain a symbolic link.
1185 base::FilePath absolute_temp_dir =
Sergey Ulanov2e49f492017-09-14 19:37:511186 base::MakeAbsoluteFilePath(temp_dir_.GetPath());
satoruxddac0442017-05-29 06:06:181187
1188 // Create a good directory (will be whitelisted) and a good file.
1189 base::FilePath good_dir = absolute_temp_dir.AppendASCII("good");
1190 ASSERT_TRUE(base::CreateDirectory(good_dir));
1191 base::FilePath good_file;
1192 ASSERT_TRUE(base::CreateTemporaryFileInDir(good_dir, &good_file));
1193 std::string good_data("good");
1194 base::WriteFile(good_file, good_data.data(), good_data.size());
1195 // See the comment in AllowFileURLs() for why this is done.
1196 base::FilePath real_good_dir = good_file.DirName();
1197
1198 // Create a bad directory (will not be whitelisted) and a bad file.
1199 base::FilePath bad_dir = absolute_temp_dir.AppendASCII("bad");
1200 ASSERT_TRUE(base::CreateDirectory(bad_dir));
1201 base::FilePath bad_file;
1202 ASSERT_TRUE(base::CreateTemporaryFileInDir(bad_dir, &bad_file));
1203 std::string bad_data("bad");
1204 base::WriteFile(bad_file, bad_data.data(), bad_data.size());
1205
1206 // This symlink will point to the good file. Access to the symlink will be
1207 // allowed as both the symlink and the destination file are in the same
1208 // good directory.
1209 base::FilePath good_symlink = good_dir.AppendASCII("good_symlink");
1210 ASSERT_TRUE(base::CreateSymbolicLink(good_file, good_symlink));
1211 GURL good_file_url = FilePathToFileURL(good_symlink);
1212 // This symlink will point to the bad file. Even though the symlink is in
1213 // the good directory, access to the symlink will be rejected since it
1214 // points to the bad file.
1215 base::FilePath bad_symlink = good_dir.AppendASCII("bad_symlink");
1216 ASSERT_TRUE(base::CreateSymbolicLink(bad_file, bad_symlink));
1217 GURL bad_file_url = FilePathToFileURL(bad_symlink);
1218
1219 CookieBlockingNetworkDelegate network_delegate;
1220 network_delegate.AddToWhitelist(real_good_dir);
1221 {
1222 TestDelegate d;
1223 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371224 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1225 good_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181226 r->Start();
1227 base::RunLoop().Run();
1228 // good_file_url should be allowed.
1229 EXPECT_FALSE(d.request_failed());
1230 EXPECT_EQ(good_data, d.data_received());
1231 }
1232
1233 {
1234 TestDelegate d;
1235 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371236 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1237 bad_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181238 r->Start();
1239 base::RunLoop().Run();
1240 // bad_file_url should be rejected.
1241 EXPECT_TRUE(d.request_failed());
1242 EXPECT_EQ("", d.data_received());
1243 EXPECT_EQ(ERR_ACCESS_DENIED, d.request_status());
1244 }
1245}
1246
1247TEST_F(URLRequestTest, SymlinksToDirs) {
Sergey Ulanov2e49f492017-09-14 19:37:511248 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
satoruxddac0442017-05-29 06:06:181249 // Get an absolute path since temp_dir can contain a symbolic link.
1250 base::FilePath absolute_temp_dir =
Sergey Ulanov2e49f492017-09-14 19:37:511251 base::MakeAbsoluteFilePath(temp_dir_.GetPath());
satoruxddac0442017-05-29 06:06:181252
1253 // Create a good directory (will be whitelisted).
1254 base::FilePath good_dir = absolute_temp_dir.AppendASCII("good");
1255 ASSERT_TRUE(base::CreateDirectory(good_dir));
1256
1257 // Create a bad directory (will not be whitelisted).
1258 base::FilePath bad_dir = absolute_temp_dir.AppendASCII("bad");
1259 ASSERT_TRUE(base::CreateDirectory(bad_dir));
1260
1261 // This symlink will point to the good directory. Access to the symlink
1262 // will be allowed as the symlink is in the good dir that'll be white
1263 // listed.
1264 base::FilePath good_symlink = good_dir.AppendASCII("good_symlink");
1265 ASSERT_TRUE(base::CreateSymbolicLink(good_dir, good_symlink));
1266 GURL good_file_url = FilePathToFileURL(good_symlink);
1267 // This symlink will point to the bad directory. Even though the symlink is
1268 // in the good directory, access to the symlink will be rejected since it
1269 // points to the bad directory.
1270 base::FilePath bad_symlink = good_dir.AppendASCII("bad_symlink");
1271 ASSERT_TRUE(base::CreateSymbolicLink(bad_dir, bad_symlink));
1272 GURL bad_file_url = FilePathToFileURL(bad_symlink);
1273
1274 CookieBlockingNetworkDelegate network_delegate;
1275 network_delegate.AddToWhitelist(good_dir);
1276 {
1277 TestDelegate d;
1278 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371279 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1280 good_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181281 r->Start();
1282 base::RunLoop().Run();
1283 // good_file_url should be allowed.
1284 EXPECT_FALSE(d.request_failed());
1285 ASSERT_NE(d.data_received().find("good_symlink"), std::string::npos);
1286 }
1287
1288 {
1289 TestDelegate d;
1290 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371291 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1292 bad_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181293 r->Start();
1294 base::RunLoop().Run();
1295 // bad_file_url should be rejected.
1296 EXPECT_TRUE(d.request_failed());
1297 EXPECT_EQ("", d.data_received());
1298 EXPECT_EQ(ERR_ACCESS_DENIED, d.request_status());
1299 }
1300}
1301
Kevin Marshalla9f05ec2017-07-14 02:10:051302#endif // defined(OS_POSIX) && !defined(OS_FUCHSIA)
[email protected]316c1e5e2012-09-12 15:17:441303
1304TEST_F(URLRequestTest, FileDirCancelTest) {
1305 // Put in mock resource provider.
1306 NetModule::SetResourceProvider(TestNetResourceProvider);
1307
1308 TestDelegate d;
1309 {
[email protected]6cdfd7f2013-02-08 20:40:151310 base::FilePath file_path;
[email protected]316c1e5e2012-09-12 15:17:441311 PathService::Get(base::DIR_SOURCE_ROOT, &file_path);
1312 file_path = file_path.Append(FILE_PATH_LITERAL("net"));
1313 file_path = file_path.Append(FILE_PATH_LITERAL("data"));
1314
danakj8522a25b2016-04-16 00:17:361315 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161316 FilePathToFileURL(file_path), DEFAULT_PRIORITY, &d,
1317 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191318 req->Start();
1319 EXPECT_TRUE(req->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441320
1321 d.set_cancel_in_received_data_pending(true);
1322
[email protected]255620da2013-08-19 13:14:291323 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441324 }
1325
1326 // Take out mock resource provider.
1327 NetModule::SetResourceProvider(NULL);
1328}
1329
[email protected]5f9581402013-10-30 13:08:321330TEST_F(URLRequestTest, FileDirOutputSanity) {
1331 // Verify the general sanity of the the output of the file:
1332 // directory lister by checking for the output of a known existing
1333 // file.
1334 const char sentinel_name[] = "filedir-sentinel";
1335
1336 base::FilePath path;
1337 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:471338 path = path.Append(kTestFilePath);
[email protected]5f9581402013-10-30 13:08:321339
1340 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:161341 std::unique_ptr<URLRequest> req(
1342 default_context_.CreateRequest(FilePathToFileURL(path), DEFAULT_PRIORITY,
1343 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191344 req->Start();
[email protected]5f9581402013-10-30 13:08:321345 base::RunLoop().Run();
1346
1347 // Generate entry for the sentinel file.
1348 base::FilePath sentinel_path = path.AppendASCII(sentinel_name);
[email protected]54124ed02014-01-07 10:06:581349 base::File::Info info;
[email protected]9eae4e62013-12-04 20:56:491350 EXPECT_TRUE(base::GetFileInfo(sentinel_path, &info));
[email protected]5f9581402013-10-30 13:08:321351 EXPECT_GT(info.size, 0);
1352 std::string sentinel_output = GetDirectoryListingEntry(
1353 base::string16(sentinel_name, sentinel_name + strlen(sentinel_name)),
satoruxddac0442017-05-29 06:06:181354 std::string(sentinel_name), false /* is_dir */, info.size,
1355
[email protected]5f9581402013-10-30 13:08:321356 info.last_modified);
1357
1358 ASSERT_LT(0, d.bytes_received());
1359 ASSERT_FALSE(d.request_failed());
maksim.sisovb53724b52016-09-16 05:30:501360 EXPECT_EQ(OK, d.request_status());
[email protected]5f9581402013-10-30 13:08:321361 // Check for the entry generated for the "sentinel" file.
1362 const std::string& data = d.data_received();
1363 ASSERT_NE(data.find(sentinel_output), std::string::npos);
1364}
1365
[email protected]316c1e5e2012-09-12 15:17:441366TEST_F(URLRequestTest, FileDirRedirectNoCrash) {
1367 // There is an implicit redirect when loading a file path that matches a
1368 // directory and does not end with a slash. Ensure that following such
1369 // redirects does not crash. See http://crbug.com/18686.
1370
[email protected]6cdfd7f2013-02-08 20:40:151371 base::FilePath path;
[email protected]316c1e5e2012-09-12 15:17:441372 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:471373 path = path.Append(kTestFilePath);
[email protected]316c1e5e2012-09-12 15:17:441374
1375 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:161376 std::unique_ptr<URLRequest> req(
1377 default_context_.CreateRequest(FilePathToFileURL(path), DEFAULT_PRIORITY,
1378 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191379 req->Start();
[email protected]255620da2013-08-19 13:14:291380 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441381
1382 ASSERT_EQ(1, d.received_redirect_count());
1383 ASSERT_LT(0, d.bytes_received());
1384 ASSERT_FALSE(d.request_failed());
maksim.sisovb53724b52016-09-16 05:30:501385 EXPECT_EQ(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:441386}
1387
1388#if defined(OS_WIN)
1389// Don't accept the url "file:///" on windows. See http://crbug.com/1474.
1390TEST_F(URLRequestTest, FileDirRedirectSingleSlash) {
1391 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:161392 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
1393 GURL("file:///"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191394 req->Start();
[email protected]255620da2013-08-19 13:14:291395 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441396
1397 ASSERT_EQ(1, d.received_redirect_count());
maksim.sisovb53724b52016-09-16 05:30:501398 EXPECT_NE(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:441399}
[email protected]5ecf7cb282014-05-11 01:49:551400#endif // defined(OS_WIN)
1401
brettwa1228ebb2016-10-28 03:51:341402#endif // !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]5ecf7cb282014-05-11 01:49:551403
1404TEST_F(URLRequestTest, InvalidUrlTest) {
1405 TestDelegate d;
1406 {
rhalavatib7bd7c792017-04-27 05:25:161407 std::unique_ptr<URLRequest> r(
1408 default_context_.CreateRequest(GURL("invalid url"), DEFAULT_PRIORITY,
1409 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5ecf7cb282014-05-11 01:49:551410
[email protected]f7022f32014-08-21 16:32:191411 r->Start();
1412 EXPECT_TRUE(r->is_pending());
[email protected]5ecf7cb282014-05-11 01:49:551413
1414 base::RunLoop().Run();
1415 EXPECT_TRUE(d.request_failed());
1416 }
1417}
1418
jochen0e3b3a62014-09-16 18:31:231419TEST_F(URLRequestTest, InvalidReferrerTest) {
1420 TestURLRequestContext context;
1421 TestNetworkDelegate network_delegate;
1422 network_delegate.set_cancel_request_with_policy_violating_referrer(true);
1423 context.set_network_delegate(&network_delegate);
1424 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361425 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:161426 context.CreateRequest(GURL("http://localhost/"), DEFAULT_PRIORITY, &d,
1427 TRAFFIC_ANNOTATION_FOR_TESTS));
jochen0e3b3a62014-09-16 18:31:231428 req->SetReferrer("https://somewhere.com/");
1429
1430 req->Start();
1431 base::RunLoop().Run();
1432 EXPECT_TRUE(d.request_failed());
1433}
1434
[email protected]5ecf7cb282014-05-11 01:49:551435#if defined(OS_WIN)
1436TEST_F(URLRequestTest, ResolveShortcutTest) {
1437 base::FilePath app_path;
1438 PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
mmenke9f2ec60c2015-06-01 20:59:471439 app_path = app_path.Append(kTestFilePath);
[email protected]5ecf7cb282014-05-11 01:49:551440 app_path = app_path.AppendASCII("with-headers.html");
1441
1442 std::wstring lnk_path = app_path.value() + L".lnk";
1443
1444 base::win::ScopedCOMInitializer com_initializer;
1445
1446 // Temporarily create a shortcut for test
1447 {
Robert Liaoc88f99d12017-10-17 21:48:331448 Microsoft::WRL::ComPtr<IShellLink> shell;
robliaoeb9bfd642017-05-18 17:35:161449 ASSERT_TRUE(SUCCEEDED(::CoCreateInstance(
1450 CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shell))));
Robert Liaoc88f99d12017-10-17 21:48:331451 Microsoft::WRL::ComPtr<IPersistFile> persist;
robliao310fa98b2017-05-11 17:14:001452 ASSERT_TRUE(SUCCEEDED(shell.CopyTo(persist.GetAddressOf())));
[email protected]5ecf7cb282014-05-11 01:49:551453 EXPECT_TRUE(SUCCEEDED(shell->SetPath(app_path.value().c_str())));
1454 EXPECT_TRUE(SUCCEEDED(shell->SetDescription(L"ResolveShortcutTest")));
1455 EXPECT_TRUE(SUCCEEDED(persist->Save(lnk_path.c_str(), TRUE)));
1456 }
1457
1458 TestDelegate d;
1459 {
danakj8522a25b2016-04-16 00:17:361460 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161461 FilePathToFileURL(base::FilePath(lnk_path)), DEFAULT_PRIORITY, &d,
1462 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5ecf7cb282014-05-11 01:49:551463
[email protected]f7022f32014-08-21 16:32:191464 r->Start();
1465 EXPECT_TRUE(r->is_pending());
[email protected]5ecf7cb282014-05-11 01:49:551466
1467 base::RunLoop().Run();
1468
1469 WIN32_FILE_ATTRIBUTE_DATA data;
1470 GetFileAttributesEx(app_path.value().c_str(),
1471 GetFileExInfoStandard, &data);
1472 HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ,
1473 FILE_SHARE_READ, NULL, OPEN_EXISTING,
1474 FILE_ATTRIBUTE_NORMAL, NULL);
1475 EXPECT_NE(INVALID_HANDLE_VALUE, file);
danakj8522a25b2016-04-16 00:17:361476 std::unique_ptr<char[]> buffer(new char[data.nFileSizeLow]);
[email protected]5ecf7cb282014-05-11 01:49:551477 DWORD read_size;
1478 BOOL result;
1479 result = ReadFile(file, buffer.get(), data.nFileSizeLow,
1480 &read_size, NULL);
1481 std::string content(buffer.get(), read_size);
1482 CloseHandle(file);
1483
[email protected]f7022f32014-08-21 16:32:191484 EXPECT_TRUE(!r->is_pending());
[email protected]5ecf7cb282014-05-11 01:49:551485 EXPECT_EQ(1, d.received_redirect_count());
1486 EXPECT_EQ(content, d.data_received());
1487 }
1488
1489 // Clean the shortcut
1490 DeleteFile(lnk_path.c_str());
1491}
1492#endif // defined(OS_WIN)
[email protected]316c1e5e2012-09-12 15:17:441493
1494// Custom URLRequestJobs for use with interceptor tests
1495class RestartTestJob : public URLRequestTestJob {
1496 public:
1497 RestartTestJob(URLRequest* request, NetworkDelegate* network_delegate)
1498 : URLRequestTestJob(request, network_delegate, true) {}
1499 protected:
dchengb03027d2014-10-21 12:00:201500 void StartAsync() override { this->NotifyRestartRequired(); }
[email protected]316c1e5e2012-09-12 15:17:441501 private:
dchengb03027d2014-10-21 12:00:201502 ~RestartTestJob() override {}
[email protected]316c1e5e2012-09-12 15:17:441503};
1504
1505class CancelTestJob : public URLRequestTestJob {
1506 public:
1507 explicit CancelTestJob(URLRequest* request, NetworkDelegate* network_delegate)
1508 : URLRequestTestJob(request, network_delegate, true) {}
1509 protected:
dchengb03027d2014-10-21 12:00:201510 void StartAsync() override { request_->Cancel(); }
[email protected]316c1e5e2012-09-12 15:17:441511 private:
dchengb03027d2014-10-21 12:00:201512 ~CancelTestJob() override {}
[email protected]316c1e5e2012-09-12 15:17:441513};
1514
1515class CancelThenRestartTestJob : public URLRequestTestJob {
1516 public:
1517 explicit CancelThenRestartTestJob(URLRequest* request,
1518 NetworkDelegate* network_delegate)
1519 : URLRequestTestJob(request, network_delegate, true) {
1520 }
1521 protected:
dchengb03027d2014-10-21 12:00:201522 void StartAsync() override {
[email protected]316c1e5e2012-09-12 15:17:441523 request_->Cancel();
1524 this->NotifyRestartRequired();
1525 }
1526 private:
dchengb03027d2014-10-21 12:00:201527 ~CancelThenRestartTestJob() override {}
[email protected]316c1e5e2012-09-12 15:17:441528};
1529
bengr1bf8e942014-11-07 01:36:501530// An Interceptor for use with interceptor tests.
1531class MockURLRequestInterceptor : public URLRequestInterceptor {
1532 public:
1533 // Static getters for canned response header and data strings.
1534 static std::string ok_data() {
1535 return URLRequestTestJob::test_data_1();
1536 }
1537
1538 static std::string ok_headers() {
1539 return URLRequestTestJob::test_headers();
1540 }
1541
1542 static std::string redirect_data() {
1543 return std::string();
1544 }
1545
1546 static std::string redirect_headers() {
1547 return URLRequestTestJob::test_redirect_headers();
1548 }
1549
1550 static std::string error_data() {
1551 return std::string("ohhh nooooo mr. bill!");
1552 }
1553
1554 static std::string error_headers() {
1555 return URLRequestTestJob::test_error_headers();
1556 }
1557
1558 MockURLRequestInterceptor()
1559 : intercept_main_request_(false), restart_main_request_(false),
1560 cancel_main_request_(false), cancel_then_restart_main_request_(false),
1561 simulate_main_network_error_(false),
1562 intercept_redirect_(false), cancel_redirect_request_(false),
1563 intercept_final_response_(false), cancel_final_request_(false),
1564 use_url_request_http_job_(false),
1565 did_intercept_main_(false), did_restart_main_(false),
1566 did_cancel_main_(false), did_cancel_then_restart_main_(false),
1567 did_simulate_error_main_(false),
1568 did_intercept_redirect_(false), did_cancel_redirect_(false),
1569 did_intercept_final_(false), did_cancel_final_(false) {
1570 }
1571
1572 ~MockURLRequestInterceptor() override {
1573 }
1574
1575 // URLRequestInterceptor implementation:
1576 URLRequestJob* MaybeInterceptRequest(
1577 URLRequest* request,
1578 NetworkDelegate* network_delegate) const override {
1579 if (restart_main_request_) {
1580 restart_main_request_ = false;
1581 did_restart_main_ = true;
1582 return new RestartTestJob(request, network_delegate);
1583 }
1584 if (cancel_main_request_) {
1585 cancel_main_request_ = false;
1586 did_cancel_main_ = true;
1587 return new CancelTestJob(request, network_delegate);
1588 }
1589 if (cancel_then_restart_main_request_) {
1590 cancel_then_restart_main_request_ = false;
1591 did_cancel_then_restart_main_ = true;
1592 return new CancelThenRestartTestJob(request, network_delegate);
1593 }
1594 if (simulate_main_network_error_) {
1595 simulate_main_network_error_ = false;
1596 did_simulate_error_main_ = true;
1597 if (use_url_request_http_job_) {
1598 return URLRequestHttpJob::Factory(request, network_delegate, "http");
1599 }
1600 // This job will result in error since the requested URL is not one of the
1601 // URLs supported by these tests.
1602 return new URLRequestTestJob(request, network_delegate, true);
1603 }
1604 if (!intercept_main_request_)
1605 return nullptr;
1606 intercept_main_request_ = false;
1607 did_intercept_main_ = true;
1608 URLRequestTestJob* job = new URLRequestTestJob(request,
1609 network_delegate,
1610 main_headers_,
1611 main_data_,
1612 true);
1613 job->set_load_timing_info(main_request_load_timing_info_);
1614 return job;
1615 }
1616
1617 URLRequestJob* MaybeInterceptRedirect(URLRequest* request,
1618 NetworkDelegate* network_delegate,
1619 const GURL& location) const override {
1620 if (cancel_redirect_request_) {
1621 cancel_redirect_request_ = false;
1622 did_cancel_redirect_ = true;
1623 return new CancelTestJob(request, network_delegate);
1624 }
1625 if (!intercept_redirect_)
1626 return nullptr;
1627 intercept_redirect_ = false;
1628 did_intercept_redirect_ = true;
1629 if (use_url_request_http_job_) {
1630 return URLRequestHttpJob::Factory(request, network_delegate, "http");
1631 }
1632 return new URLRequestTestJob(request,
1633 network_delegate,
1634 redirect_headers_,
1635 redirect_data_,
1636 true);
1637 }
1638
1639 URLRequestJob* MaybeInterceptResponse(
1640 URLRequest* request,
1641 NetworkDelegate* network_delegate) const override {
1642 if (cancel_final_request_) {
1643 cancel_final_request_ = false;
1644 did_cancel_final_ = true;
1645 return new CancelTestJob(request, network_delegate);
1646 }
1647 if (!intercept_final_response_)
1648 return nullptr;
1649 intercept_final_response_ = false;
1650 did_intercept_final_ = true;
1651 if (use_url_request_http_job_) {
1652 return URLRequestHttpJob::Factory(request, network_delegate, "http");
1653 }
1654 return new URLRequestTestJob(request,
1655 network_delegate,
1656 final_headers_,
1657 final_data_,
1658 true);
1659 }
1660
1661 void set_intercept_main_request(bool intercept_main_request) {
1662 intercept_main_request_ = intercept_main_request;
1663 }
1664
1665 void set_main_headers(const std::string& main_headers) {
1666 main_headers_ = main_headers;
1667 }
1668
1669 void set_main_data(const std::string& main_data) {
1670 main_data_ = main_data;
1671 }
1672
1673 void set_main_request_load_timing_info(
1674 const LoadTimingInfo& main_request_load_timing_info) {
1675 main_request_load_timing_info_ = main_request_load_timing_info;
1676 }
1677
1678 void set_restart_main_request(bool restart_main_request) {
1679 restart_main_request_ = restart_main_request;
1680 }
1681
1682 void set_cancel_main_request(bool cancel_main_request) {
1683 cancel_main_request_ = cancel_main_request;
1684 }
1685
1686 void set_cancel_then_restart_main_request(
1687 bool cancel_then_restart_main_request) {
1688 cancel_then_restart_main_request_ = cancel_then_restart_main_request;
1689 }
1690
1691 void set_simulate_main_network_error(bool simulate_main_network_error) {
1692 simulate_main_network_error_ = simulate_main_network_error;
1693 }
1694
1695 void set_intercept_redirect(bool intercept_redirect) {
1696 intercept_redirect_ = intercept_redirect;
1697 }
1698
1699 void set_redirect_headers(const std::string& redirect_headers) {
1700 redirect_headers_ = redirect_headers;
1701 }
1702
1703 void set_redirect_data(const std::string& redirect_data) {
1704 redirect_data_ = redirect_data;
1705 }
1706
1707 void set_cancel_redirect_request(bool cancel_redirect_request) {
1708 cancel_redirect_request_ = cancel_redirect_request;
1709 }
1710
1711 void set_intercept_final_response(bool intercept_final_response) {
1712 intercept_final_response_ = intercept_final_response;
1713 }
1714
1715 void set_final_headers(const std::string& final_headers) {
1716 final_headers_ = final_headers;
1717 }
1718
1719 void set_final_data(const std::string& final_data) {
1720 final_data_ = final_data;
1721 }
1722
1723 void set_cancel_final_request(bool cancel_final_request) {
1724 cancel_final_request_ = cancel_final_request;
1725 }
1726
1727 void set_use_url_request_http_job(bool use_url_request_http_job) {
1728 use_url_request_http_job_ = use_url_request_http_job;
1729 }
1730
1731 bool did_intercept_main() const {
1732 return did_intercept_main_;
1733 }
1734
1735 bool did_restart_main() const {
1736 return did_restart_main_;
1737 }
1738
1739 bool did_cancel_main() const {
1740 return did_cancel_main_;
1741 }
1742
1743 bool did_cancel_then_restart_main() const {
1744 return did_cancel_then_restart_main_;
1745 }
1746
1747 bool did_simulate_error_main() const {
1748 return did_simulate_error_main_;
1749 }
1750
1751 bool did_intercept_redirect() const {
1752 return did_intercept_redirect_;
1753 }
1754
1755 bool did_cancel_redirect() const {
1756 return did_cancel_redirect_;
1757 }
1758
1759 bool did_intercept_final() const {
1760 return did_intercept_final_;
1761 }
1762
1763 bool did_cancel_final() const {
1764 return did_cancel_final_;
1765 }
1766
1767 private:
1768 // Indicate whether to intercept the main request, and if so specify the
1769 // response to return and the LoadTimingInfo to use.
1770 mutable bool intercept_main_request_;
1771 mutable std::string main_headers_;
1772 mutable std::string main_data_;
1773 mutable LoadTimingInfo main_request_load_timing_info_;
1774
1775 // These indicate actions that can be taken within MaybeInterceptRequest.
1776 mutable bool restart_main_request_;
1777 mutable bool cancel_main_request_;
1778 mutable bool cancel_then_restart_main_request_;
1779 mutable bool simulate_main_network_error_;
1780
1781 // Indicate whether to intercept redirects, and if so specify the response to
1782 // return.
1783 mutable bool intercept_redirect_;
1784 mutable std::string redirect_headers_;
1785 mutable std::string redirect_data_;
1786
1787 // Cancel the request within MaybeInterceptRedirect.
1788 mutable bool cancel_redirect_request_;
1789
1790 // Indicate whether to intercept the final response, and if so specify the
1791 // response to return.
1792 mutable bool intercept_final_response_;
1793 mutable std::string final_headers_;
1794 mutable std::string final_data_;
1795
1796 // Cancel the final request within MaybeInterceptResponse.
1797 mutable bool cancel_final_request_;
1798
1799 // Instruct the interceptor to use a real URLRequestHTTPJob.
1800 mutable bool use_url_request_http_job_;
1801
1802 // These indicate if the interceptor did something or not.
1803 mutable bool did_intercept_main_;
1804 mutable bool did_restart_main_;
1805 mutable bool did_cancel_main_;
1806 mutable bool did_cancel_then_restart_main_;
1807 mutable bool did_simulate_error_main_;
1808 mutable bool did_intercept_redirect_;
1809 mutable bool did_cancel_redirect_;
1810 mutable bool did_intercept_final_;
1811 mutable bool did_cancel_final_;
1812};
1813
1814// Inherit PlatformTest since we require the autorelease pool on Mac OS X.
1815class URLRequestInterceptorTest : public URLRequestTest {
1816 public:
1817 URLRequestInterceptorTest() : URLRequestTest(), interceptor_(NULL) {
1818 }
1819
1820 ~URLRequestInterceptorTest() override {
1821 // URLRequestJobs may post clean-up tasks on destruction.
1822 base::RunLoop().RunUntilIdle();
1823 }
1824
1825 void SetUpFactory() override {
1826 interceptor_ = new MockURLRequestInterceptor();
1827 job_factory_.reset(new URLRequestInterceptingJobFactory(
danakj8522a25b2016-04-16 00:17:361828 std::move(job_factory_), base::WrapUnique(interceptor_)));
bengr1bf8e942014-11-07 01:36:501829 }
1830
1831 MockURLRequestInterceptor* interceptor() const {
1832 return interceptor_;
1833 }
1834
1835 private:
1836 MockURLRequestInterceptor* interceptor_;
1837};
1838
1839TEST_F(URLRequestInterceptorTest, Intercept) {
1840 // Intercept the main request and respond with a simple response.
1841 interceptor()->set_intercept_main_request(true);
1842 interceptor()->set_main_headers(MockURLRequestInterceptor::ok_headers());
1843 interceptor()->set_main_data(MockURLRequestInterceptor::ok_data());
[email protected]2bba3252013-04-08 19:50:591844 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361845 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161846 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
1847 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:501848 base::SupportsUserData::Data* user_data0 = new base::SupportsUserData::Data();
1849 base::SupportsUserData::Data* user_data1 = new base::SupportsUserData::Data();
1850 base::SupportsUserData::Data* user_data2 = new base::SupportsUserData::Data();
Randy Smith4cd4d36a2017-08-24 01:01:091851 req->SetUserData(&user_data0, base::WrapUnique(user_data0));
avi0d991472017-04-27 07:04:041852 req->SetUserData(&user_data1, base::WrapUnique(user_data1));
1853 req->SetUserData(&user_data2, base::WrapUnique(user_data2));
bengr1bf8e942014-11-07 01:36:501854 req->set_method("GET");
[email protected]f7022f32014-08-21 16:32:191855 req->Start();
[email protected]255620da2013-08-19 13:14:291856 base::RunLoop().Run();
[email protected]2bba3252013-04-08 19:50:591857
bengr1bf8e942014-11-07 01:36:501858 // Make sure we can retrieve our specific user data.
Randy Smith4cd4d36a2017-08-24 01:01:091859 EXPECT_EQ(user_data0, req->GetUserData(&user_data0));
bengr1bf8e942014-11-07 01:36:501860 EXPECT_EQ(user_data1, req->GetUserData(&user_data1));
1861 EXPECT_EQ(user_data2, req->GetUserData(&user_data2));
[email protected]2bba3252013-04-08 19:50:591862
bengr1bf8e942014-11-07 01:36:501863 // Check that we got one good response.
maksim.sisovb53724b52016-09-16 05:30:501864 EXPECT_EQ(OK, d.request_status());
bengr1bf8e942014-11-07 01:36:501865 EXPECT_EQ(200, req->response_headers()->response_code());
1866 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
1867 EXPECT_EQ(1, d.response_started_count());
1868 EXPECT_EQ(0, d.received_redirect_count());
1869}
[email protected]2bba3252013-04-08 19:50:591870
bengr1bf8e942014-11-07 01:36:501871TEST_F(URLRequestInterceptorTest, InterceptRedirect) {
1872 // Intercept the main request and respond with a redirect.
1873 interceptor()->set_intercept_main_request(true);
1874 interceptor()->set_main_headers(
1875 MockURLRequestInterceptor::redirect_headers());
1876 interceptor()->set_main_data(MockURLRequestInterceptor::redirect_data());
1877
1878 // Intercept that redirect and respond with a final OK response.
1879 interceptor()->set_intercept_redirect(true);
1880 interceptor()->set_redirect_headers(MockURLRequestInterceptor::ok_headers());
1881 interceptor()->set_redirect_data(MockURLRequestInterceptor::ok_data());
1882
1883 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361884 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161885 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
1886 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:501887 req->set_method("GET");
1888 req->Start();
1889 base::RunLoop().Run();
1890
1891 // Check that the interceptor got called as expected.
1892 EXPECT_TRUE(interceptor()->did_intercept_main());
1893 EXPECT_TRUE(interceptor()->did_intercept_redirect());
1894
1895 // Check that we got one good response.
maksim.sisovb53724b52016-09-16 05:30:501896 int status = d.request_status();
1897 EXPECT_EQ(OK, status);
1898 if (status == OK)
bengr1bf8e942014-11-07 01:36:501899 EXPECT_EQ(200, req->response_headers()->response_code());
1900
1901 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
1902 EXPECT_EQ(1, d.response_started_count());
1903 EXPECT_EQ(0, d.received_redirect_count());
1904}
1905
1906TEST_F(URLRequestInterceptorTest, InterceptServerError) {
1907 // Intercept the main request to generate a server error response.
1908 interceptor()->set_intercept_main_request(true);
1909 interceptor()->set_main_headers(MockURLRequestInterceptor::error_headers());
1910 interceptor()->set_main_data(MockURLRequestInterceptor::error_data());
1911
1912 // Intercept that error and respond with an OK response.
1913 interceptor()->set_intercept_final_response(true);
1914 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
1915 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
1916
1917 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361918 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161919 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
1920 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:501921 req->set_method("GET");
1922 req->Start();
1923 base::RunLoop().Run();
1924
1925 // Check that the interceptor got called as expected.
1926 EXPECT_TRUE(interceptor()->did_intercept_main());
1927 EXPECT_TRUE(interceptor()->did_intercept_final());
1928
1929 // Check that we got one good response.
maksim.sisovb53724b52016-09-16 05:30:501930 EXPECT_EQ(OK, d.request_status());
bengr1bf8e942014-11-07 01:36:501931 EXPECT_EQ(200, req->response_headers()->response_code());
1932 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
1933 EXPECT_EQ(1, d.response_started_count());
1934 EXPECT_EQ(0, d.received_redirect_count());
1935}
1936
1937TEST_F(URLRequestInterceptorTest, InterceptNetworkError) {
1938 // Intercept the main request to simulate a network error.
1939 interceptor()->set_simulate_main_network_error(true);
1940
1941 // Intercept that error and respond with an OK response.
1942 interceptor()->set_intercept_final_response(true);
1943 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
1944 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
1945
1946 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361947 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161948 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
1949 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:501950 req->set_method("GET");
1951 req->Start();
1952 base::RunLoop().Run();
1953
1954 // Check that the interceptor got called as expected.
1955 EXPECT_TRUE(interceptor()->did_simulate_error_main());
1956 EXPECT_TRUE(interceptor()->did_intercept_final());
1957
1958 // Check that we received one good response.
maksim.sisovb53724b52016-09-16 05:30:501959 EXPECT_EQ(OK, d.request_status());
bengr1bf8e942014-11-07 01:36:501960 EXPECT_EQ(200, req->response_headers()->response_code());
1961 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
1962 EXPECT_EQ(1, d.response_started_count());
1963 EXPECT_EQ(0, d.received_redirect_count());
1964}
1965
1966TEST_F(URLRequestInterceptorTest, InterceptRestartRequired) {
1967 // Restart the main request.
1968 interceptor()->set_restart_main_request(true);
1969
1970 // then intercept the new main request and respond with an OK response
1971 interceptor()->set_intercept_main_request(true);
1972 interceptor()->set_main_headers(MockURLRequestInterceptor::ok_headers());
1973 interceptor()->set_main_data(MockURLRequestInterceptor::ok_data());
1974
1975 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361976 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161977 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
1978 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:501979 req->set_method("GET");
1980 req->Start();
1981 base::RunLoop().Run();
1982
1983 // Check that the interceptor got called as expected.
1984 EXPECT_TRUE(interceptor()->did_restart_main());
1985 EXPECT_TRUE(interceptor()->did_intercept_main());
1986
1987 // Check that we received one good response.
maksim.sisovb53724b52016-09-16 05:30:501988 int status = d.request_status();
1989 EXPECT_EQ(OK, status);
1990 if (status == OK)
bengr1bf8e942014-11-07 01:36:501991 EXPECT_EQ(200, req->response_headers()->response_code());
1992
1993 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
1994 EXPECT_EQ(1, d.response_started_count());
1995 EXPECT_EQ(0, d.received_redirect_count());
1996}
1997
1998TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelMain) {
1999 // Intercept the main request and cancel from within the restarted job.
2000 interceptor()->set_cancel_main_request(true);
2001
2002 // Set up to intercept the final response and override it with an OK response.
2003 interceptor()->set_intercept_final_response(true);
2004 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
2005 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
2006
2007 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362008 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162009 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2010 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:502011 req->set_method("GET");
2012 req->Start();
2013 base::RunLoop().Run();
2014
2015 // Check that the interceptor got called as expected.
2016 EXPECT_TRUE(interceptor()->did_cancel_main());
2017 EXPECT_FALSE(interceptor()->did_intercept_final());
2018
2019 // Check that we see a canceled request.
maksim.sisovb53724b52016-09-16 05:30:502020 EXPECT_EQ(ERR_ABORTED, d.request_status());
bengr1bf8e942014-11-07 01:36:502021}
2022
2023TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelRedirect) {
2024 // Intercept the main request and respond with a redirect.
2025 interceptor()->set_intercept_main_request(true);
2026 interceptor()->set_main_headers(
2027 MockURLRequestInterceptor::redirect_headers());
2028 interceptor()->set_main_data(MockURLRequestInterceptor::redirect_data());
2029
2030 // Intercept the redirect and cancel from within that job.
2031 interceptor()->set_cancel_redirect_request(true);
2032
2033 // Set up to intercept the final response and override it with an OK response.
2034 interceptor()->set_intercept_final_response(true);
2035 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
2036 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
2037
2038 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362039 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162040 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2041 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:502042 req->set_method("GET");
2043 req->Start();
2044 base::RunLoop().Run();
2045
2046 // Check that the interceptor got called as expected.
2047 EXPECT_TRUE(interceptor()->did_intercept_main());
2048 EXPECT_TRUE(interceptor()->did_cancel_redirect());
2049 EXPECT_FALSE(interceptor()->did_intercept_final());
2050
2051 // Check that we see a canceled request.
maksim.sisovb53724b52016-09-16 05:30:502052 EXPECT_EQ(ERR_ABORTED, d.request_status());
bengr1bf8e942014-11-07 01:36:502053}
2054
2055TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelFinal) {
2056 // Intercept the main request to simulate a network error.
2057 interceptor()->set_simulate_main_network_error(true);
2058
2059 // Set up to intercept final the response and cancel from within that job.
2060 interceptor()->set_cancel_final_request(true);
2061
2062 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362063 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162064 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2065 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:502066 req->set_method("GET");
2067 req->Start();
2068 base::RunLoop().Run();
2069
2070 // Check that the interceptor got called as expected.
2071 EXPECT_TRUE(interceptor()->did_simulate_error_main());
2072 EXPECT_TRUE(interceptor()->did_cancel_final());
2073
2074 // Check that we see a canceled request.
maksim.sisovb53724b52016-09-16 05:30:502075 EXPECT_EQ(ERR_ABORTED, d.request_status());
bengr1bf8e942014-11-07 01:36:502076}
2077
2078TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelInRestart) {
2079 // Intercept the main request and cancel then restart from within that job.
2080 interceptor()->set_cancel_then_restart_main_request(true);
2081
2082 // Set up to intercept the final response and override it with an OK response.
2083 interceptor()->set_intercept_final_response(true);
bengrb50d631e2014-11-17 22:50:502084 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
2085 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
bengr1bf8e942014-11-07 01:36:502086
2087 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362088 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162089 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2090 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:502091 req->set_method("GET");
2092 req->Start();
2093 base::RunLoop().Run();
2094
2095 // Check that the interceptor got called as expected.
2096 EXPECT_TRUE(interceptor()->did_cancel_then_restart_main());
2097 EXPECT_FALSE(interceptor()->did_intercept_final());
2098
2099 // Check that we see a canceled request.
maksim.sisovb53724b52016-09-16 05:30:502100 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]2bba3252013-04-08 19:50:592101}
2102
2103// "Normal" LoadTimingInfo as returned by a job. Everything is in order, not
2104// reused. |connect_time_flags| is used to indicate if there should be dns
2105// or SSL times, and |used_proxy| is used for proxy times.
2106LoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now,
2107 int connect_time_flags,
2108 bool used_proxy) {
2109 LoadTimingInfo load_timing;
2110 load_timing.socket_log_id = 1;
2111
2112 if (used_proxy) {
2113 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1);
2114 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2);
2115 }
2116
2117 LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing;
2118 if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) {
2119 connect_timing.dns_start = now + base::TimeDelta::FromDays(3);
2120 connect_timing.dns_end = now + base::TimeDelta::FromDays(4);
2121 }
2122 connect_timing.connect_start = now + base::TimeDelta::FromDays(5);
2123 if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) {
2124 connect_timing.ssl_start = now + base::TimeDelta::FromDays(6);
2125 connect_timing.ssl_end = now + base::TimeDelta::FromDays(7);
2126 }
2127 connect_timing.connect_end = now + base::TimeDelta::FromDays(8);
2128
2129 load_timing.send_start = now + base::TimeDelta::FromDays(9);
2130 load_timing.send_end = now + base::TimeDelta::FromDays(10);
2131 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11);
2132 return load_timing;
2133}
2134
2135// Same as above, but in the case of a reused socket.
2136LoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now,
2137 bool used_proxy) {
2138 LoadTimingInfo load_timing;
2139 load_timing.socket_log_id = 1;
2140 load_timing.socket_reused = true;
2141
2142 if (used_proxy) {
2143 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1);
2144 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2);
2145 }
2146
2147 load_timing.send_start = now + base::TimeDelta::FromDays(9);
2148 load_timing.send_end = now + base::TimeDelta::FromDays(10);
2149 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11);
2150 return load_timing;
2151}
2152
bengr1bf8e942014-11-07 01:36:502153LoadTimingInfo RunURLRequestInterceptorLoadTimingTest(
2154 const LoadTimingInfo& job_load_timing,
2155 const URLRequestContext& context,
2156 MockURLRequestInterceptor* interceptor) {
2157 interceptor->set_intercept_main_request(true);
2158 interceptor->set_main_request_load_timing_info(job_load_timing);
2159 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:162160 std::unique_ptr<URLRequest> req(
2161 context.CreateRequest(GURL("http://test_intercept/foo"), DEFAULT_PRIORITY,
2162 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:502163 req->Start();
2164 base::RunLoop().Run();
2165
2166 LoadTimingInfo resulting_load_timing;
2167 req->GetLoadTimingInfo(&resulting_load_timing);
2168
2169 // None of these should be modified by the URLRequest.
2170 EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused);
2171 EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id);
2172 EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start);
2173 EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end);
2174 EXPECT_EQ(job_load_timing.receive_headers_end,
2175 resulting_load_timing.receive_headers_end);
caseqe8340bc92016-04-20 00:02:572176 EXPECT_EQ(job_load_timing.push_start, resulting_load_timing.push_start);
2177 EXPECT_EQ(job_load_timing.push_end, resulting_load_timing.push_end);
bengr1bf8e942014-11-07 01:36:502178
2179 return resulting_load_timing;
2180}
2181
[email protected]2bba3252013-04-08 19:50:592182// Basic test that the intercept + load timing tests work.
bengr1bf8e942014-11-07 01:36:502183TEST_F(URLRequestInterceptorTest, InterceptLoadTiming) {
[email protected]2bba3252013-04-08 19:50:592184 base::TimeTicks now = base::TimeTicks::Now();
2185 LoadTimingInfo job_load_timing =
2186 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false);
2187
[email protected]2ca01e52013-10-31 22:05:192188 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502189 RunURLRequestInterceptorLoadTimingTest(
2190 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592191
2192 // Nothing should have been changed by the URLRequest.
2193 EXPECT_EQ(job_load_timing.proxy_resolve_start,
2194 load_timing_result.proxy_resolve_start);
2195 EXPECT_EQ(job_load_timing.proxy_resolve_end,
2196 load_timing_result.proxy_resolve_end);
2197 EXPECT_EQ(job_load_timing.connect_timing.dns_start,
2198 load_timing_result.connect_timing.dns_start);
2199 EXPECT_EQ(job_load_timing.connect_timing.dns_end,
2200 load_timing_result.connect_timing.dns_end);
2201 EXPECT_EQ(job_load_timing.connect_timing.connect_start,
2202 load_timing_result.connect_timing.connect_start);
2203 EXPECT_EQ(job_load_timing.connect_timing.connect_end,
2204 load_timing_result.connect_timing.connect_end);
2205 EXPECT_EQ(job_load_timing.connect_timing.ssl_start,
2206 load_timing_result.connect_timing.ssl_start);
2207 EXPECT_EQ(job_load_timing.connect_timing.ssl_end,
2208 load_timing_result.connect_timing.ssl_end);
2209
2210 // Redundant sanity check.
2211 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES);
2212}
2213
2214// Another basic test, with proxy and SSL times, but no DNS times.
bengr1bf8e942014-11-07 01:36:502215TEST_F(URLRequestInterceptorTest, InterceptLoadTimingProxy) {
[email protected]2bba3252013-04-08 19:50:592216 base::TimeTicks now = base::TimeTicks::Now();
2217 LoadTimingInfo job_load_timing =
2218 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true);
2219
[email protected]2ca01e52013-10-31 22:05:192220 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502221 RunURLRequestInterceptorLoadTimingTest(
2222 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592223
2224 // Nothing should have been changed by the URLRequest.
2225 EXPECT_EQ(job_load_timing.proxy_resolve_start,
2226 load_timing_result.proxy_resolve_start);
2227 EXPECT_EQ(job_load_timing.proxy_resolve_end,
2228 load_timing_result.proxy_resolve_end);
2229 EXPECT_EQ(job_load_timing.connect_timing.dns_start,
2230 load_timing_result.connect_timing.dns_start);
2231 EXPECT_EQ(job_load_timing.connect_timing.dns_end,
2232 load_timing_result.connect_timing.dns_end);
2233 EXPECT_EQ(job_load_timing.connect_timing.connect_start,
2234 load_timing_result.connect_timing.connect_start);
2235 EXPECT_EQ(job_load_timing.connect_timing.connect_end,
2236 load_timing_result.connect_timing.connect_end);
2237 EXPECT_EQ(job_load_timing.connect_timing.ssl_start,
2238 load_timing_result.connect_timing.ssl_start);
2239 EXPECT_EQ(job_load_timing.connect_timing.ssl_end,
2240 load_timing_result.connect_timing.ssl_end);
2241
2242 // Redundant sanity check.
2243 TestLoadTimingNotReusedWithProxy(load_timing_result,
2244 CONNECT_TIMING_HAS_SSL_TIMES);
2245}
2246
2247// Make sure that URLRequest correctly adjusts proxy times when they're before
2248// |request_start|, due to already having a connected socket. This happens in
[email protected]cf4cae32014-05-27 00:39:102249// the case of reusing a SPDY session. The connected socket is not considered
2250// reused in this test (May be a preconnect).
[email protected]2bba3252013-04-08 19:50:592251//
2252// To mix things up from the test above, assumes DNS times but no SSL times.
bengr1bf8e942014-11-07 01:36:502253TEST_F(URLRequestInterceptorTest, InterceptLoadTimingEarlyProxyResolution) {
[email protected]2bba3252013-04-08 19:50:592254 base::TimeTicks now = base::TimeTicks::Now();
2255 LoadTimingInfo job_load_timing =
2256 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true);
2257 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6);
2258 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5);
2259 job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4);
2260 job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3);
2261 job_load_timing.connect_timing.connect_start =
2262 now - base::TimeDelta::FromDays(2);
2263 job_load_timing.connect_timing.connect_end =
2264 now - base::TimeDelta::FromDays(1);
2265
[email protected]2ca01e52013-10-31 22:05:192266 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502267 RunURLRequestInterceptorLoadTimingTest(
2268 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592269
2270 // Proxy times, connect times, and DNS times should all be replaced with
2271 // request_start.
2272 EXPECT_EQ(load_timing_result.request_start,
2273 load_timing_result.proxy_resolve_start);
2274 EXPECT_EQ(load_timing_result.request_start,
2275 load_timing_result.proxy_resolve_end);
2276 EXPECT_EQ(load_timing_result.request_start,
2277 load_timing_result.connect_timing.dns_start);
2278 EXPECT_EQ(load_timing_result.request_start,
2279 load_timing_result.connect_timing.dns_end);
2280 EXPECT_EQ(load_timing_result.request_start,
2281 load_timing_result.connect_timing.connect_start);
2282 EXPECT_EQ(load_timing_result.request_start,
2283 load_timing_result.connect_timing.connect_end);
2284
2285 // Other times should have been left null.
2286 TestLoadTimingNotReusedWithProxy(load_timing_result,
2287 CONNECT_TIMING_HAS_DNS_TIMES);
2288}
2289
2290// Same as above, but in the reused case.
bengr1bf8e942014-11-07 01:36:502291TEST_F(URLRequestInterceptorTest,
2292 InterceptLoadTimingEarlyProxyResolutionReused) {
[email protected]2bba3252013-04-08 19:50:592293 base::TimeTicks now = base::TimeTicks::Now();
2294 LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true);
2295 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4);
2296 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3);
2297
[email protected]2ca01e52013-10-31 22:05:192298 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502299 RunURLRequestInterceptorLoadTimingTest(
2300 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592301
2302 // Proxy times and connect times should all be replaced with request_start.
2303 EXPECT_EQ(load_timing_result.request_start,
2304 load_timing_result.proxy_resolve_start);
2305 EXPECT_EQ(load_timing_result.request_start,
2306 load_timing_result.proxy_resolve_end);
2307
2308 // Other times should have been left null.
2309 TestLoadTimingReusedWithProxy(load_timing_result);
2310}
2311
2312// Make sure that URLRequest correctly adjusts connect times when they're before
2313// |request_start|, due to reusing a connected socket. The connected socket is
2314// not considered reused in this test (May be a preconnect).
2315//
2316// To mix things up, the request has SSL times, but no DNS times.
bengr1bf8e942014-11-07 01:36:502317TEST_F(URLRequestInterceptorTest, InterceptLoadTimingEarlyConnect) {
[email protected]2bba3252013-04-08 19:50:592318 base::TimeTicks now = base::TimeTicks::Now();
2319 LoadTimingInfo job_load_timing =
2320 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false);
2321 job_load_timing.connect_timing.connect_start =
2322 now - base::TimeDelta::FromDays(1);
2323 job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2);
2324 job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3);
2325 job_load_timing.connect_timing.connect_end =
2326 now - base::TimeDelta::FromDays(4);
2327
[email protected]2ca01e52013-10-31 22:05:192328 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502329 RunURLRequestInterceptorLoadTimingTest(
2330 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592331
2332 // Connect times, and SSL times should be replaced with request_start.
2333 EXPECT_EQ(load_timing_result.request_start,
2334 load_timing_result.connect_timing.connect_start);
2335 EXPECT_EQ(load_timing_result.request_start,
2336 load_timing_result.connect_timing.ssl_start);
2337 EXPECT_EQ(load_timing_result.request_start,
2338 load_timing_result.connect_timing.ssl_end);
2339 EXPECT_EQ(load_timing_result.request_start,
2340 load_timing_result.connect_timing.connect_end);
2341
2342 // Other times should have been left null.
2343 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES);
2344}
2345
2346// Make sure that URLRequest correctly adjusts connect times when they're before
2347// |request_start|, due to reusing a connected socket in the case that there
2348// are also proxy times. The connected socket is not considered reused in this
2349// test (May be a preconnect).
2350//
2351// In this test, there are no SSL or DNS times.
bengr1bf8e942014-11-07 01:36:502352TEST_F(URLRequestInterceptorTest, InterceptLoadTimingEarlyConnectWithProxy) {
[email protected]2bba3252013-04-08 19:50:592353 base::TimeTicks now = base::TimeTicks::Now();
2354 LoadTimingInfo job_load_timing =
2355 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true);
2356 job_load_timing.connect_timing.connect_start =
2357 now - base::TimeDelta::FromDays(1);
2358 job_load_timing.connect_timing.connect_end =
2359 now - base::TimeDelta::FromDays(2);
2360
[email protected]2ca01e52013-10-31 22:05:192361 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502362 RunURLRequestInterceptorLoadTimingTest(
2363 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592364
2365 // Connect times should be replaced with proxy_resolve_end.
2366 EXPECT_EQ(load_timing_result.proxy_resolve_end,
2367 load_timing_result.connect_timing.connect_start);
2368 EXPECT_EQ(load_timing_result.proxy_resolve_end,
2369 load_timing_result.connect_timing.connect_end);
2370
2371 // Other times should have been left null.
2372 TestLoadTimingNotReusedWithProxy(load_timing_result,
2373 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
2374}
2375
[email protected]316c1e5e2012-09-12 15:17:442376// Check that two different URL requests have different identifiers.
2377TEST_F(URLRequestTest, Identifiers) {
2378 TestDelegate d;
2379 TestURLRequestContext context;
danakj8522a25b2016-04-16 00:17:362380 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:162381 context.CreateRequest(GURL("http://example.com"), DEFAULT_PRIORITY, &d,
2382 TRAFFIC_ANNOTATION_FOR_TESTS));
danakj8522a25b2016-04-16 00:17:362383 std::unique_ptr<URLRequest> other_req(
rhalavatib7bd7c792017-04-27 05:25:162384 context.CreateRequest(GURL("http://example.com"), DEFAULT_PRIORITY, &d,
2385 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:442386
mmenke19378d22014-09-09 04:12:592387 ASSERT_NE(req->identifier(), other_req->identifier());
[email protected]316c1e5e2012-09-12 15:17:442388}
2389
blundellb8163592f2015-12-16 14:22:422390#if defined(OS_IOS)
2391// TODO(droger): Check that a failure to connect to the proxy is reported to
2392// the network delegate. crbug.com/496743
2393#define MAYBE_NetworkDelegateProxyError DISABLED_NetworkDelegateProxyError
2394#else
2395#define MAYBE_NetworkDelegateProxyError NetworkDelegateProxyError
2396#endif
2397TEST_F(URLRequestTest, MAYBE_NetworkDelegateProxyError) {
[email protected]316c1e5e2012-09-12 15:17:442398 MockHostResolver host_resolver;
2399 host_resolver.rules()->AddSimulatedFailure("*");
2400
[email protected]ceefd7fd2012-11-29 00:36:242401 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]316c1e5e2012-09-12 15:17:442402 TestURLRequestContextWithProxy context("myproxy:70", &network_delegate);
2403
2404 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362405 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:162406 context.CreateRequest(GURL("http://example.com"), DEFAULT_PRIORITY, &d,
2407 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192408 req->set_method("GET");
[email protected]316c1e5e2012-09-12 15:17:442409
[email protected]f7022f32014-08-21 16:32:192410 req->Start();
[email protected]255620da2013-08-19 13:14:292411 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442412
2413 // Check we see a failed request.
[email protected]d8fc4722014-06-13 13:17:152414 // The proxy server is not set before failure.
tbansal2ecbbc72016-10-06 17:15:472415 EXPECT_FALSE(req->proxy_server().is_valid());
maksim.sisovb53724b52016-09-16 05:30:502416 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:442417
2418 EXPECT_EQ(1, network_delegate.error_count());
robpercival214763f2016-07-01 23:27:012419 EXPECT_THAT(network_delegate.last_error(),
2420 IsError(ERR_PROXY_CONNECTION_FAILED));
[email protected]316c1e5e2012-09-12 15:17:442421 EXPECT_EQ(1, network_delegate.completed_requests());
2422}
2423
[email protected]cba24642014-08-15 20:49:592424// Make sure that NetworkDelegate::NotifyCompleted is called if
[email protected]316c1e5e2012-09-12 15:17:442425// content is empty.
2426TEST_F(URLRequestTest, RequestCompletionForEmptyResponse) {
2427 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:162428 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
2429 GURL("data:,"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192430 req->Start();
[email protected]255620da2013-08-19 13:14:292431 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442432 EXPECT_EQ("", d.data_received());
2433 EXPECT_EQ(1, default_network_delegate_.completed_requests());
2434}
2435
[email protected]5033ab82013-03-22 20:17:462436// Make sure that SetPriority actually sets the URLRequest's priority
2437// correctly, both before and after start.
2438TEST_F(URLRequestTest, SetPriorityBasic) {
2439 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362440 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162441 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2442 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192443 EXPECT_EQ(DEFAULT_PRIORITY, req->priority());
[email protected]5033ab82013-03-22 20:17:462444
[email protected]f7022f32014-08-21 16:32:192445 req->SetPriority(LOW);
2446 EXPECT_EQ(LOW, req->priority());
[email protected]5033ab82013-03-22 20:17:462447
[email protected]f7022f32014-08-21 16:32:192448 req->Start();
2449 EXPECT_EQ(LOW, req->priority());
[email protected]5033ab82013-03-22 20:17:462450
[email protected]f7022f32014-08-21 16:32:192451 req->SetPriority(MEDIUM);
2452 EXPECT_EQ(MEDIUM, req->priority());
[email protected]5033ab82013-03-22 20:17:462453}
2454
2455// Make sure that URLRequest calls SetPriority on a job before calling
2456// Start on it.
2457TEST_F(URLRequestTest, SetJobPriorityBeforeJobStart) {
2458 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362459 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162460 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2461 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192462 EXPECT_EQ(DEFAULT_PRIORITY, req->priority());
[email protected]5033ab82013-03-22 20:17:462463
mmenkeed0498b2015-12-08 23:20:422464 RequestPriority job_priority;
danakj8522a25b2016-04-16 00:17:362465 std::unique_ptr<URLRequestJob> job(new PriorityMonitoringURLRequestJob(
mmenkeed0498b2015-12-08 23:20:422466 req.get(), &default_network_delegate_, &job_priority));
2467 AddTestInterceptor()->set_main_intercept_job(std::move(job));
2468 EXPECT_EQ(DEFAULT_PRIORITY, job_priority);
[email protected]5033ab82013-03-22 20:17:462469
[email protected]f7022f32014-08-21 16:32:192470 req->SetPriority(LOW);
[email protected]5033ab82013-03-22 20:17:462471
[email protected]f7022f32014-08-21 16:32:192472 req->Start();
mmenkeed0498b2015-12-08 23:20:422473 EXPECT_EQ(LOW, job_priority);
[email protected]5033ab82013-03-22 20:17:462474}
2475
2476// Make sure that URLRequest passes on its priority updates to its
2477// job.
2478TEST_F(URLRequestTest, SetJobPriority) {
2479 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362480 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162481 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2482 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5033ab82013-03-22 20:17:462483
mmenkeed0498b2015-12-08 23:20:422484 RequestPriority job_priority;
danakj8522a25b2016-04-16 00:17:362485 std::unique_ptr<URLRequestJob> job(new PriorityMonitoringURLRequestJob(
mmenkeed0498b2015-12-08 23:20:422486 req.get(), &default_network_delegate_, &job_priority));
2487 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]5033ab82013-03-22 20:17:462488
[email protected]f7022f32014-08-21 16:32:192489 req->SetPriority(LOW);
2490 req->Start();
mmenkeed0498b2015-12-08 23:20:422491 EXPECT_EQ(LOW, job_priority);
[email protected]5033ab82013-03-22 20:17:462492
[email protected]f7022f32014-08-21 16:32:192493 req->SetPriority(MEDIUM);
2494 EXPECT_EQ(MEDIUM, req->priority());
mmenkeed0498b2015-12-08 23:20:422495 EXPECT_EQ(MEDIUM, job_priority);
[email protected]5033ab82013-03-22 20:17:462496}
2497
[email protected]bb1c4662013-11-14 00:00:072498// Setting the IGNORE_LIMITS load flag should be okay if the priority
2499// is MAXIMUM_PRIORITY.
2500TEST_F(URLRequestTest, PriorityIgnoreLimits) {
2501 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362502 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162503 GURL("http://test_intercept/foo"), MAXIMUM_PRIORITY, &d,
2504 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192505 EXPECT_EQ(MAXIMUM_PRIORITY, req->priority());
[email protected]bb1c4662013-11-14 00:00:072506
mmenkeed0498b2015-12-08 23:20:422507 RequestPriority job_priority;
danakj8522a25b2016-04-16 00:17:362508 std::unique_ptr<URLRequestJob> job(new PriorityMonitoringURLRequestJob(
mmenkeed0498b2015-12-08 23:20:422509 req.get(), &default_network_delegate_, &job_priority));
2510 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]bb1c4662013-11-14 00:00:072511
[email protected]f7022f32014-08-21 16:32:192512 req->SetLoadFlags(LOAD_IGNORE_LIMITS);
2513 EXPECT_EQ(MAXIMUM_PRIORITY, req->priority());
[email protected]bb1c4662013-11-14 00:00:072514
[email protected]f7022f32014-08-21 16:32:192515 req->SetPriority(MAXIMUM_PRIORITY);
2516 EXPECT_EQ(MAXIMUM_PRIORITY, req->priority());
[email protected]bb1c4662013-11-14 00:00:072517
[email protected]f7022f32014-08-21 16:32:192518 req->Start();
2519 EXPECT_EQ(MAXIMUM_PRIORITY, req->priority());
mmenkeed0498b2015-12-08 23:20:422520 EXPECT_EQ(MAXIMUM_PRIORITY, job_priority);
[email protected]bb1c4662013-11-14 00:00:072521}
2522
nick5d570de92015-05-04 20:16:162523namespace {
2524
2525// Less verbose way of running a simple testserver for the tests below.
David Benjamin42116f62017-11-20 21:45:392526class HttpTestServer : public EmbeddedTestServer {
[email protected]316c1e5e2012-09-12 15:17:442527 public:
David Benjamin42116f62017-11-20 21:45:392528 explicit HttpTestServer(const base::FilePath& document_root) {
tommycli59a63432015-11-06 00:10:552529 AddDefaultHandlers(document_root);
tommyclieae5f75f2015-11-05 19:07:272530 }
tommycli59a63432015-11-06 00:10:552531
David Benjamin42116f62017-11-20 21:45:392532 HttpTestServer() { AddDefaultHandlers(base::FilePath()); }
tommycli59a63432015-11-06 00:10:552533};
tommyclieae5f75f2015-11-05 19:07:272534
nick5d570de92015-05-04 20:16:162535} // namespace
2536
[email protected]f2f31b32013-01-16 23:24:092537TEST_F(URLRequestTest, DelayedCookieCallback) {
David Benjamin42116f62017-11-20 21:45:392538 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442539 ASSERT_TRUE(test_server.Start());
2540
2541 TestURLRequestContext context;
danakj8522a25b2016-04-16 00:17:362542 std::unique_ptr<DelayedCookieMonster> delayed_cm(new DelayedCookieMonster());
[email protected]90499482013-06-01 00:39:502543 context.set_cookie_store(delayed_cm.get());
[email protected]316c1e5e2012-09-12 15:17:442544
2545 // Set up a cookie.
2546 {
2547 TestNetworkDelegate network_delegate;
2548 context.set_network_delegate(&network_delegate);
2549 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362550 std::unique_ptr<URLRequest> req(context.CreateRequest(
tommycli59a63432015-11-06 00:10:552551 test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162552 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192553 req->Start();
[email protected]255620da2013-08-19 13:14:292554 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442555 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2556 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2557 EXPECT_EQ(1, network_delegate.set_cookie_count());
2558 }
2559
2560 // Verify that the cookie is set.
2561 {
2562 TestNetworkDelegate network_delegate;
2563 context.set_network_delegate(&network_delegate);
2564 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362565 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162566 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2567 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192568 req->Start();
[email protected]255620da2013-08-19 13:14:292569 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442570
2571 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
2572 != std::string::npos);
2573 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2574 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2575 }
2576}
2577
[email protected]f2f31b32013-01-16 23:24:092578TEST_F(URLRequestTest, DoNotSendCookies) {
David Benjamin42116f62017-11-20 21:45:392579 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442580 ASSERT_TRUE(test_server.Start());
2581
2582 // Set up a cookie.
2583 {
2584 TestNetworkDelegate network_delegate;
2585 default_context_.set_network_delegate(&network_delegate);
2586 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362587 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552588 test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162589 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192590 req->Start();
[email protected]255620da2013-08-19 13:14:292591 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442592 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2593 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2594 }
2595
2596 // Verify that the cookie is set.
2597 {
2598 TestNetworkDelegate network_delegate;
2599 default_context_.set_network_delegate(&network_delegate);
2600 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362601 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162602 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2603 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192604 req->Start();
[email protected]255620da2013-08-19 13:14:292605 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442606
2607 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
2608 != std::string::npos);
2609 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2610 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2611 }
2612
2613 // Verify that the cookie isn't sent when LOAD_DO_NOT_SEND_COOKIES is set.
2614 {
2615 TestNetworkDelegate network_delegate;
2616 default_context_.set_network_delegate(&network_delegate);
2617 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362618 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162619 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2620 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192621 req->SetLoadFlags(LOAD_DO_NOT_SEND_COOKIES);
2622 req->Start();
[email protected]255620da2013-08-19 13:14:292623 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442624
2625 EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
2626 == std::string::npos);
2627
2628 // LOAD_DO_NOT_SEND_COOKIES does not trigger OnGetCookies.
2629 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2630 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2631 }
2632}
2633
2634TEST_F(URLRequestTest, DoNotSaveCookies) {
David Benjamin42116f62017-11-20 21:45:392635 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442636 ASSERT_TRUE(test_server.Start());
2637
2638 // Set up a cookie.
2639 {
2640 TestNetworkDelegate network_delegate;
2641 default_context_.set_network_delegate(&network_delegate);
2642 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362643 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552644 test_server.GetURL("/set-cookie?CookieToNotUpdate=2"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162645 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192646 req->Start();
[email protected]255620da2013-08-19 13:14:292647 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442648
2649 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2650 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2651 EXPECT_EQ(1, network_delegate.set_cookie_count());
2652 }
2653
2654 // Try to set-up another cookie and update the previous cookie.
2655 {
2656 TestNetworkDelegate network_delegate;
2657 default_context_.set_network_delegate(&network_delegate);
2658 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362659 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552660 test_server.GetURL("/set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
rhalavatib7bd7c792017-04-27 05:25:162661 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192662 req->SetLoadFlags(LOAD_DO_NOT_SAVE_COOKIES);
2663 req->Start();
[email protected]316c1e5e2012-09-12 15:17:442664
[email protected]255620da2013-08-19 13:14:292665 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442666
2667 // LOAD_DO_NOT_SAVE_COOKIES does not trigger OnSetCookie.
2668 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2669 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2670 EXPECT_EQ(0, network_delegate.set_cookie_count());
2671 }
2672
2673 // Verify the cookies weren't saved or updated.
2674 {
2675 TestNetworkDelegate network_delegate;
2676 default_context_.set_network_delegate(&network_delegate);
2677 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362678 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162679 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2680 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192681 req->Start();
[email protected]255620da2013-08-19 13:14:292682 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442683
2684 EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
2685 == std::string::npos);
2686 EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
2687 != std::string::npos);
2688
2689 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2690 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2691 EXPECT_EQ(0, network_delegate.set_cookie_count());
2692 }
2693}
2694
2695TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy) {
David Benjamin42116f62017-11-20 21:45:392696 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442697 ASSERT_TRUE(test_server.Start());
2698
2699 // Set up a cookie.
2700 {
2701 TestNetworkDelegate network_delegate;
2702 default_context_.set_network_delegate(&network_delegate);
2703 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362704 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552705 test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162706 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192707 req->Start();
[email protected]255620da2013-08-19 13:14:292708 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442709
2710 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2711 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2712 }
2713
2714 // Verify that the cookie is set.
2715 {
2716 TestNetworkDelegate network_delegate;
2717 default_context_.set_network_delegate(&network_delegate);
2718 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362719 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162720 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2721 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192722 req->Start();
[email protected]255620da2013-08-19 13:14:292723 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442724
2725 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
2726 != std::string::npos);
2727
2728 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2729 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2730 }
2731
2732 // Verify that the cookie isn't sent.
2733 {
2734 TestNetworkDelegate network_delegate;
2735 default_context_.set_network_delegate(&network_delegate);
2736 TestDelegate d;
2737 network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
danakj8522a25b2016-04-16 00:17:362738 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162739 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2740 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192741 req->Start();
[email protected]255620da2013-08-19 13:14:292742 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442743
2744 EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
2745 == std::string::npos);
2746
[email protected]22e045f2013-09-20 03:54:032747 EXPECT_EQ(1, network_delegate.blocked_get_cookies_count());
[email protected]316c1e5e2012-09-12 15:17:442748 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2749 }
2750}
2751
marqf14fff8d2015-12-02 15:52:292752// TODO(crbug.com/564656) This test is flaky on iOS.
2753#if defined(OS_IOS)
2754#define MAYBE_DoNotSaveCookies_ViaPolicy FLAKY_DoNotSaveCookies_ViaPolicy
2755#else
2756#define MAYBE_DoNotSaveCookies_ViaPolicy DoNotSaveCookies_ViaPolicy
2757#endif
[email protected]316c1e5e2012-09-12 15:17:442758TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy) {
David Benjamin42116f62017-11-20 21:45:392759 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442760 ASSERT_TRUE(test_server.Start());
2761
2762 // Set up a cookie.
2763 {
2764 TestNetworkDelegate network_delegate;
2765 default_context_.set_network_delegate(&network_delegate);
2766 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362767 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552768 test_server.GetURL("/set-cookie?CookieToNotUpdate=2"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162769 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192770 req->Start();
[email protected]255620da2013-08-19 13:14:292771 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442772
2773 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2774 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2775 }
2776
2777 // Try to set-up another cookie and update the previous cookie.
2778 {
2779 TestNetworkDelegate network_delegate;
2780 default_context_.set_network_delegate(&network_delegate);
2781 TestDelegate d;
2782 network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
danakj8522a25b2016-04-16 00:17:362783 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552784 test_server.GetURL("/set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
rhalavatib7bd7c792017-04-27 05:25:162785 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192786 req->Start();
[email protected]316c1e5e2012-09-12 15:17:442787
[email protected]255620da2013-08-19 13:14:292788 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442789
2790 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2791 EXPECT_EQ(2, network_delegate.blocked_set_cookie_count());
2792 }
2793
2794 // Verify the cookies weren't saved or updated.
2795 {
2796 TestNetworkDelegate network_delegate;
2797 default_context_.set_network_delegate(&network_delegate);
2798 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362799 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162800 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2801 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192802 req->Start();
[email protected]255620da2013-08-19 13:14:292803 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442804
2805 EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
2806 == std::string::npos);
2807 EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
2808 != std::string::npos);
2809
2810 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2811 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2812 }
2813}
2814
2815TEST_F(URLRequestTest, DoNotSaveEmptyCookies) {
David Benjamin42116f62017-11-20 21:45:392816 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442817 ASSERT_TRUE(test_server.Start());
2818
2819 // Set up an empty cookie.
2820 {
2821 TestNetworkDelegate network_delegate;
2822 default_context_.set_network_delegate(&network_delegate);
2823 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362824 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162825 test_server.GetURL("/set-cookie"), DEFAULT_PRIORITY, &d,
2826 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192827 req->Start();
[email protected]255620da2013-08-19 13:14:292828 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442829
2830 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2831 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2832 EXPECT_EQ(0, network_delegate.set_cookie_count());
2833 }
2834}
2835
2836TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy_Async) {
David Benjamin42116f62017-11-20 21:45:392837 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442838 ASSERT_TRUE(test_server.Start());
2839
2840 // Set up a cookie.
2841 {
2842 TestNetworkDelegate network_delegate;
2843 default_context_.set_network_delegate(&network_delegate);
2844 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362845 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552846 test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162847 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192848 req->Start();
[email protected]255620da2013-08-19 13:14:292849 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442850
2851 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2852 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2853 }
2854
2855 // Verify that the cookie is set.
2856 {
2857 TestNetworkDelegate network_delegate;
2858 default_context_.set_network_delegate(&network_delegate);
2859 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362860 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162861 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2862 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192863 req->Start();
[email protected]255620da2013-08-19 13:14:292864 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442865
2866 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
2867 != std::string::npos);
2868
2869 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2870 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2871 }
2872
2873 // Verify that the cookie isn't sent.
2874 {
2875 TestNetworkDelegate network_delegate;
2876 default_context_.set_network_delegate(&network_delegate);
2877 TestDelegate d;
2878 network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
danakj8522a25b2016-04-16 00:17:362879 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162880 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2881 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192882 req->Start();
[email protected]255620da2013-08-19 13:14:292883 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442884
2885 EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
2886 == std::string::npos);
2887
[email protected]22e045f2013-09-20 03:54:032888 EXPECT_EQ(1, network_delegate.blocked_get_cookies_count());
[email protected]316c1e5e2012-09-12 15:17:442889 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2890 }
2891}
2892
2893TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy_Async) {
David Benjamin42116f62017-11-20 21:45:392894 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442895 ASSERT_TRUE(test_server.Start());
2896
2897 // Set up a cookie.
2898 {
2899 TestNetworkDelegate network_delegate;
2900 default_context_.set_network_delegate(&network_delegate);
2901 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362902 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552903 test_server.GetURL("/set-cookie?CookieToNotUpdate=2"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162904 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192905 req->Start();
[email protected]255620da2013-08-19 13:14:292906 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442907
2908 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2909 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2910 }
2911
2912 // Try to set-up another cookie and update the previous cookie.
2913 {
2914 TestNetworkDelegate network_delegate;
2915 default_context_.set_network_delegate(&network_delegate);
2916 TestDelegate d;
2917 network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
danakj8522a25b2016-04-16 00:17:362918 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552919 test_server.GetURL("/set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
rhalavatib7bd7c792017-04-27 05:25:162920 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192921 req->Start();
[email protected]316c1e5e2012-09-12 15:17:442922
[email protected]255620da2013-08-19 13:14:292923 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442924
2925 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2926 EXPECT_EQ(2, network_delegate.blocked_set_cookie_count());
2927 }
2928
2929 // Verify the cookies weren't saved or updated.
2930 {
2931 TestNetworkDelegate network_delegate;
2932 default_context_.set_network_delegate(&network_delegate);
2933 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362934 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162935 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2936 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192937 req->Start();
[email protected]255620da2013-08-19 13:14:292938 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442939
2940 EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
2941 == std::string::npos);
2942 EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
2943 != std::string::npos);
2944
2945 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2946 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2947 }
2948}
2949
mkwstc5fa7762016-03-28 09:28:232950TEST_F(URLRequestTest, SameSiteCookies) {
David Benjamin42116f62017-11-20 21:45:392951 HttpTestServer test_server;
mkwst3f3daac2015-02-26 20:15:262952 ASSERT_TRUE(test_server.Start());
2953
mkwst202534e32016-01-15 16:07:152954 TestNetworkDelegate network_delegate;
mkwst202534e32016-01-15 16:07:152955 default_context_.set_network_delegate(&network_delegate);
2956
mkwstf71d0bd2016-03-21 14:15:242957 const std::string kHost = "example.test";
2958 const std::string kSubHost = "subdomain.example.test";
2959 const std::string kCrossHost = "cross-origin.test";
2960
2961 // Set up two 'SameSite' cookies on 'example.test'
mkwst3f3daac2015-02-26 20:15:262962 {
mkwst3f3daac2015-02-26 20:15:262963 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362964 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
mkwstf71d0bd2016-03-21 14:15:242965 test_server.GetURL(kHost,
2966 "/set-cookie?StrictSameSiteCookie=1;SameSite=Strict&"
2967 "LaxSameSiteCookie=1;SameSite=Lax"),
rhalavatib7bd7c792017-04-27 05:25:162968 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
mkwst3f3daac2015-02-26 20:15:262969 req->Start();
2970 base::RunLoop().Run();
2971 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2972 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
mkwstf71d0bd2016-03-21 14:15:242973 EXPECT_EQ(2, network_delegate.set_cookie_count());
mkwst3f3daac2015-02-26 20:15:262974 }
2975
mkwstf71d0bd2016-03-21 14:15:242976 // Verify that both cookies are sent for same-site requests.
mkwst3f3daac2015-02-26 20:15:262977 {
mkwst3f3daac2015-02-26 20:15:262978 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362979 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162980 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2981 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:462982 req->set_site_for_cookies(test_server.GetURL(kHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:462983 req->set_initiator(url::Origin::Create(test_server.GetURL(kHost, "/")));
mkwst3f3daac2015-02-26 20:15:262984 req->Start();
2985 base::RunLoop().Run();
2986
mkwstf71d0bd2016-03-21 14:15:242987 EXPECT_NE(std::string::npos,
2988 d.data_received().find("StrictSameSiteCookie=1"));
2989 EXPECT_NE(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
mkwst3f3daac2015-02-26 20:15:262990 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2991 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2992 }
2993
clamyfd58ca072016-12-21 17:18:322994 // Verify that both cookies are sent when the request has no initiator (can
2995 // happen for main frame browser-initiated navigations).
2996 {
2997 TestDelegate d;
2998 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162999 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3000 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463001 req->set_site_for_cookies(test_server.GetURL(kHost, "/"));
clamyfd58ca072016-12-21 17:18:323002 req->Start();
3003 base::RunLoop().Run();
3004
3005 EXPECT_NE(std::string::npos,
3006 d.data_received().find("StrictSameSiteCookie=1"));
3007 EXPECT_NE(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
3008 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3009 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3010 }
3011
mkwstf71d0bd2016-03-21 14:15:243012 // Verify that both cookies are sent for same-registrable-domain requests.
mkwst3f3daac2015-02-26 20:15:263013 {
mkwst3f3daac2015-02-26 20:15:263014 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363015 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163016 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3017 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463018 req->set_site_for_cookies(test_server.GetURL(kSubHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463019 req->set_initiator(url::Origin::Create(test_server.GetURL(kSubHost, "/")));
mkwst202534e32016-01-15 16:07:153020 req->Start();
3021 base::RunLoop().Run();
3022
mkwstf71d0bd2016-03-21 14:15:243023 EXPECT_NE(std::string::npos,
3024 d.data_received().find("StrictSameSiteCookie=1"));
3025 EXPECT_NE(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
mkwst202534e32016-01-15 16:07:153026 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3027 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3028 }
3029
mkwstf71d0bd2016-03-21 14:15:243030 // Verify that neither cookie is not sent for cross-site requests.
3031 {
3032 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363033 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163034 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3035 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463036 req->set_site_for_cookies(test_server.GetURL(kCrossHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463037 req->set_initiator(
3038 url::Origin::Create(test_server.GetURL(kCrossHost, "/")));
mkwstf71d0bd2016-03-21 14:15:243039 req->Start();
3040 base::RunLoop().Run();
3041
3042 EXPECT_EQ(std::string::npos,
3043 d.data_received().find("StrictSameSiteCookie=1"));
3044 EXPECT_EQ(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
3045 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3046 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3047 }
3048
3049 // Verify that the lax cookie is sent for cross-site initiators when the
mkwst202534e32016-01-15 16:07:153050 // method is "safe".
3051 {
3052 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363053 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163054 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3055 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463056 req->set_site_for_cookies(test_server.GetURL(kHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463057 req->set_initiator(
3058 url::Origin::Create(test_server.GetURL(kCrossHost, "/")));
mkwstf71d0bd2016-03-21 14:15:243059 req->set_method("GET");
mkwst202534e32016-01-15 16:07:153060 req->Start();
3061 base::RunLoop().Run();
3062
mkwstf71d0bd2016-03-21 14:15:243063 EXPECT_EQ(std::string::npos,
3064 d.data_received().find("StrictSameSiteCookie=1"));
3065 EXPECT_NE(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
mkwst202534e32016-01-15 16:07:153066 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3067 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3068 }
3069
mkwstf71d0bd2016-03-21 14:15:243070 // Verify that neither cookie is sent for cross-site initiators when the
mkwst202534e32016-01-15 16:07:153071 // method is unsafe (e.g. POST).
3072 {
3073 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363074 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163075 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3076 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463077 req->set_site_for_cookies(test_server.GetURL(kHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463078 req->set_initiator(
3079 url::Origin::Create(test_server.GetURL(kCrossHost, "/")));
mkwst202534e32016-01-15 16:07:153080 req->set_method("POST");
mkwst3f3daac2015-02-26 20:15:263081 req->Start();
3082 base::RunLoop().Run();
3083
mkwstf71d0bd2016-03-21 14:15:243084 EXPECT_EQ(std::string::npos,
3085 d.data_received().find("StrictSameSiteCookie=1"));
3086 EXPECT_EQ(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
mkwst3f3daac2015-02-26 20:15:263087 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3088 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3089 }
3090}
3091
estark557a5eb82015-12-01 22:57:103092// Tests that __Secure- cookies can't be set on non-secure origins.
estarkcd39c11f2015-10-19 19:46:363093TEST_F(URLRequestTest, SecureCookiePrefixOnNonsecureOrigin) {
tommycli59a63432015-11-06 00:10:553094 EmbeddedTestServer http_server;
3095 http_server.AddDefaultHandlers(
estarkcd39c11f2015-10-19 19:46:363096 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
tommycli59a63432015-11-06 00:10:553097 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3098 https_server.AddDefaultHandlers(
3099 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3100 ASSERT_TRUE(http_server.Start());
3101 ASSERT_TRUE(https_server.Start());
estarkcd39c11f2015-10-19 19:46:363102
estarkb15166b2015-12-18 16:56:383103 TestNetworkDelegate network_delegate;
estarkcd39c11f2015-10-19 19:46:363104 TestURLRequestContext context(true);
3105 context.set_network_delegate(&network_delegate);
3106 context.Init();
3107
estarkb15166b2015-12-18 16:56:383108 // Try to set a Secure __Secure- cookie.
estarkcd39c11f2015-10-19 19:46:363109 {
3110 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363111 std::unique_ptr<URLRequest> req(context.CreateRequest(
estark557a5eb82015-12-01 22:57:103112 http_server.GetURL("/set-cookie?__Secure-nonsecure-origin=1;Secure"),
rhalavatib7bd7c792017-04-27 05:25:163113 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363114 req->Start();
3115 base::RunLoop().Run();
3116 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3117 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3118 }
3119
3120 // Verify that the cookie is not set.
3121 {
3122 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363123 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163124 https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3125 TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363126 req->Start();
3127 base::RunLoop().Run();
3128
jww79aceda2015-12-07 01:56:343129 EXPECT_EQ(d.data_received().find("__Secure-nonsecure-origin=1"),
3130 std::string::npos);
estarkcd39c11f2015-10-19 19:46:363131 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3132 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3133 }
3134}
3135
estarkb15166b2015-12-18 16:56:383136TEST_F(URLRequestTest, SecureCookiePrefixNonsecure) {
tommycli59a63432015-11-06 00:10:553137 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3138 https_server.AddDefaultHandlers(
estarkcd39c11f2015-10-19 19:46:363139 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
tommycli59a63432015-11-06 00:10:553140 ASSERT_TRUE(https_server.Start());
estarkcd39c11f2015-10-19 19:46:363141
3142 TestNetworkDelegate network_delegate;
3143 TestURLRequestContext context(true);
3144 context.set_network_delegate(&network_delegate);
3145 context.Init();
3146
estarkb15166b2015-12-18 16:56:383147 // Try to set a non-Secure __Secure- cookie.
estarkcd39c11f2015-10-19 19:46:363148 {
3149 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:163150 std::unique_ptr<URLRequest> req(context.CreateRequest(
3151 https_server.GetURL("/set-cookie?__Secure-foo=1"), DEFAULT_PRIORITY, &d,
3152 TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363153 req->Start();
3154 base::RunLoop().Run();
3155 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3156 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3157 }
3158
3159 // Verify that the cookie is not set.
3160 {
3161 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363162 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163163 https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3164 TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363165 req->Start();
3166 base::RunLoop().Run();
3167
jww79aceda2015-12-07 01:56:343168 EXPECT_EQ(d.data_received().find("__Secure-foo=1"), std::string::npos);
estarkcd39c11f2015-10-19 19:46:363169 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3170 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3171 }
3172}
3173
estarkb15166b2015-12-18 16:56:383174TEST_F(URLRequestTest, SecureCookiePrefixSecure) {
tommycli59a63432015-11-06 00:10:553175 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3176 https_server.AddDefaultHandlers(
estarkcd39c11f2015-10-19 19:46:363177 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
tommycli59a63432015-11-06 00:10:553178 ASSERT_TRUE(https_server.Start());
estarkcd39c11f2015-10-19 19:46:363179
estarkb15166b2015-12-18 16:56:383180 TestNetworkDelegate network_delegate;
estarkcd39c11f2015-10-19 19:46:363181 TestURLRequestContext context(true);
3182 context.set_network_delegate(&network_delegate);
3183 context.Init();
3184
estarkb15166b2015-12-18 16:56:383185 // Try to set a Secure __Secure- cookie.
estarkcd39c11f2015-10-19 19:46:363186 {
3187 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363188 std::unique_ptr<URLRequest> req(context.CreateRequest(
estark557a5eb82015-12-01 22:57:103189 https_server.GetURL("/set-cookie?__Secure-bar=1;Secure"),
rhalavatib7bd7c792017-04-27 05:25:163190 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363191 req->Start();
3192 base::RunLoop().Run();
3193 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3194 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3195 }
3196
3197 // Verify that the cookie is set.
3198 {
3199 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363200 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163201 https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3202 TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363203 req->Start();
3204 base::RunLoop().Run();
3205
jww79aceda2015-12-07 01:56:343206 EXPECT_NE(d.data_received().find("__Secure-bar=1"), std::string::npos);
3207 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3208 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3209 }
3210}
3211
3212// Tests that secure cookies can't be set on non-secure origins if strict secure
3213// cookies are enabled.
3214TEST_F(URLRequestTest, StrictSecureCookiesOnNonsecureOrigin) {
3215 EmbeddedTestServer http_server;
3216 http_server.AddDefaultHandlers(
3217 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3218 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3219 https_server.AddDefaultHandlers(
3220 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3221 ASSERT_TRUE(http_server.Start());
3222 ASSERT_TRUE(https_server.Start());
3223
3224 TestExperimentalFeaturesNetworkDelegate network_delegate;
3225 TestURLRequestContext context(true);
3226 context.set_network_delegate(&network_delegate);
3227 context.Init();
3228
3229 // Try to set a Secure cookie, with experimental features enabled.
3230 {
3231 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363232 std::unique_ptr<URLRequest> req(context.CreateRequest(
jww79aceda2015-12-07 01:56:343233 http_server.GetURL("/set-cookie?nonsecure-origin=1;Secure"),
rhalavatib7bd7c792017-04-27 05:25:163234 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
jww79aceda2015-12-07 01:56:343235 req->Start();
3236 base::RunLoop().Run();
3237 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3238 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3239 }
3240
3241 // Verify that the cookie is not set.
3242 {
3243 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363244 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163245 https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3246 TRAFFIC_ANNOTATION_FOR_TESTS));
jww79aceda2015-12-07 01:56:343247 req->Start();
3248 base::RunLoop().Run();
3249
3250 EXPECT_EQ(d.data_received().find("nonsecure-origin=1"), std::string::npos);
3251 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3252 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3253 }
3254}
3255
3256// Tests that secure cookies can be set on secure origins even if strict secure
3257// cookies are enabled.
3258TEST_F(URLRequestTest, StrictSecureCookiesOnSecureOrigin) {
3259 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3260 https_server.AddDefaultHandlers(
3261 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3262 ASSERT_TRUE(https_server.Start());
3263
3264 TestExperimentalFeaturesNetworkDelegate network_delegate;
3265 TestURLRequestContext context(true);
3266 context.set_network_delegate(&network_delegate);
3267 context.Init();
3268
3269 // Try to set a Secure cookie, with experimental features enabled.
3270 {
3271 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363272 std::unique_ptr<URLRequest> req(context.CreateRequest(
jww79aceda2015-12-07 01:56:343273 https_server.GetURL("/set-cookie?secure-origin=1;Secure"),
rhalavatib7bd7c792017-04-27 05:25:163274 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
jww79aceda2015-12-07 01:56:343275 req->Start();
3276 base::RunLoop().Run();
3277 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3278 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3279 }
3280
3281 // Verify that the cookie is not set.
3282 {
3283 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363284 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163285 https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3286 TRAFFIC_ANNOTATION_FOR_TESTS));
jww79aceda2015-12-07 01:56:343287 req->Start();
3288 base::RunLoop().Run();
3289
3290 EXPECT_NE(d.data_received().find("secure-origin=1"), std::string::npos);
estarkcd39c11f2015-10-19 19:46:363291 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3292 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3293 }
3294}
3295
Mike West86149882017-07-28 10:41:493296TEST_F(URLRequestTest, CookieAgeMetrics) {
3297 EmbeddedTestServer http_server;
3298 http_server.AddDefaultHandlers(
3299 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3300 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3301 https_server.AddDefaultHandlers(
3302 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3303 ASSERT_TRUE(http_server.Start());
3304 ASSERT_TRUE(https_server.Start());
3305
3306 TestNetworkDelegate network_delegate;
3307 default_context_.set_network_delegate(&network_delegate);
3308 base::HistogramTester histograms;
3309
3310 const std::string kHost = "example.test";
3311 const std::string kCrossHost = "cross-origin.test";
3312
3313 // Set a test cookie.
3314 {
3315 TestDelegate d;
3316 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3317 http_server.GetURL(kHost, "/set-cookie?cookie=value"), DEFAULT_PRIORITY,
3318 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
3319 req->Start();
3320 base::RunLoop().Run();
3321 ASSERT_EQ(1, network_delegate.set_cookie_count());
3322 }
3323
3324 // Make a secure request to `example.test`: we shouldn't record data.
3325 {
3326 TestDelegate d;
3327 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3328 https_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3329 TRAFFIC_ANNOTATION_FOR_TESTS));
3330 req->Start();
3331 base::RunLoop().Run();
3332 histograms.ExpectTotalCount("Cookie.AgeForNonSecureCrossSiteRequest", 0);
3333 histograms.ExpectTotalCount("Cookie.AgeForNonSecureSameSiteRequest", 0);
3334 }
3335
3336 // Make a non-secure same-site request.
3337 {
3338 TestDelegate d;
3339 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3340 http_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3341 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463342 req->set_site_for_cookies(http_server.GetURL(kHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463343 req->set_initiator(url::Origin::Create(http_server.GetURL(kHost, "/")));
Mike West86149882017-07-28 10:41:493344 req->Start();
3345 base::RunLoop().Run();
3346 histograms.ExpectTotalCount("Cookie.AgeForNonSecureCrossSiteRequest", 0);
3347 histograms.ExpectTotalCount("Cookie.AgeForNonSecureSameSiteRequest", 1);
3348 }
3349
3350 // Make a non-secure cross-site request.
3351 {
3352 TestDelegate d;
3353 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3354 http_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3355 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463356 req->set_site_for_cookies(http_server.GetURL(kCrossHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463357 req->set_initiator(
3358 url::Origin::Create(http_server.GetURL(kCrossHost, "/")));
Mike West86149882017-07-28 10:41:493359 req->Start();
3360 base::RunLoop().Run();
3361 histograms.ExpectTotalCount("Cookie.AgeForNonSecureCrossSiteRequest", 1);
3362 histograms.ExpectTotalCount("Cookie.AgeForNonSecureSameSiteRequest", 1);
3363 }
3364}
3365
mmenkefb18c772015-09-30 22:22:503366// Tests that a request is cancelled while entering suspend mode. Uses mocks
3367// rather than a spawned test server because the connection used to talk to
3368// the test server is affected by entering suspend mode on Android.
3369TEST_F(URLRequestTest, CancelOnSuspend) {
3370 TestPowerMonitorSource* power_monitor_source = new TestPowerMonitorSource();
danakj8522a25b2016-04-16 00:17:363371 base::PowerMonitor power_monitor(base::WrapUnique(power_monitor_source));
mmenkefb18c772015-09-30 22:22:503372
3373 URLRequestFailedJob::AddUrlHandler();
3374
3375 TestDelegate d;
3376 // Request that just hangs.
3377 GURL url(URLRequestFailedJob::GetMockHttpUrl(ERR_IO_PENDING));
rhalavatib7bd7c792017-04-27 05:25:163378 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
3379 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
mmenkefb18c772015-09-30 22:22:503380 r->Start();
3381
3382 power_monitor_source->Suspend();
3383 // Wait for the suspend notification to cause the request to fail.
3384 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:503385 EXPECT_EQ(ERR_ABORTED, d.request_status());
mmenkefb18c772015-09-30 22:22:503386 EXPECT_TRUE(d.request_failed());
3387 EXPECT_EQ(1, default_network_delegate_.completed_requests());
3388
3389 URLRequestFilter::GetInstance()->ClearHandlers();
3390
3391 // Shouldn't be needed, but just in case.
3392 power_monitor_source->Resume();
3393}
3394
[email protected]5095cd72012-11-01 10:29:163395// FixedDateNetworkDelegate swaps out the server's HTTP Date response header
3396// value for the |fixed_date| argument given to the constructor.
3397class FixedDateNetworkDelegate : public TestNetworkDelegate {
3398 public:
3399 explicit FixedDateNetworkDelegate(const std::string& fixed_date)
3400 : fixed_date_(fixed_date) {}
dchengb03027d2014-10-21 12:00:203401 ~FixedDateNetworkDelegate() override {}
[email protected]5095cd72012-11-01 10:29:163402
[email protected]cba24642014-08-15 20:49:593403 // NetworkDelegate implementation
dchengb03027d2014-10-21 12:00:203404 int OnHeadersReceived(
[email protected]cba24642014-08-15 20:49:593405 URLRequest* request,
3406 const CompletionCallback& callback,
3407 const HttpResponseHeaders* original_response_headers,
3408 scoped_refptr<HttpResponseHeaders>* override_response_headers,
mostynbba063d6032014-10-09 11:01:133409 GURL* allowed_unsafe_redirect_url) override;
[email protected]5095cd72012-11-01 10:29:163410
3411 private:
3412 std::string fixed_date_;
3413
3414 DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate);
3415};
3416
3417int FixedDateNetworkDelegate::OnHeadersReceived(
[email protected]cba24642014-08-15 20:49:593418 URLRequest* request,
3419 const CompletionCallback& callback,
3420 const HttpResponseHeaders* original_response_headers,
3421 scoped_refptr<HttpResponseHeaders>* override_response_headers,
[email protected]5f714132014-03-26 10:41:163422 GURL* allowed_unsafe_redirect_url) {
[email protected]cba24642014-08-15 20:49:593423 HttpResponseHeaders* new_response_headers =
3424 new HttpResponseHeaders(original_response_headers->raw_headers());
[email protected]5095cd72012-11-01 10:29:163425
3426 new_response_headers->RemoveHeader("Date");
3427 new_response_headers->AddHeader("Date: " + fixed_date_);
3428
3429 *override_response_headers = new_response_headers;
3430 return TestNetworkDelegate::OnHeadersReceived(request,
3431 callback,
3432 original_response_headers,
[email protected]5f714132014-03-26 10:41:163433 override_response_headers,
3434 allowed_unsafe_redirect_url);
[email protected]5095cd72012-11-01 10:29:163435}
3436
3437// Test that cookie expiration times are adjusted for server/client clock
3438// skew and that we handle incorrect timezone specifier "UTC" in HTTP Date
3439// headers by defaulting to GMT. (crbug.com/135131)
3440TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) {
David Benjamin42116f62017-11-20 21:45:393441 HttpTestServer test_server;
[email protected]5095cd72012-11-01 10:29:163442 ASSERT_TRUE(test_server.Start());
3443
3444 // Set up an expired cookie.
3445 {
3446 TestNetworkDelegate network_delegate;
3447 default_context_.set_network_delegate(&network_delegate);
3448 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363449 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
[email protected]2ca01e52013-10-31 22:05:193450 test_server.GetURL(
tommycli59a63432015-11-06 00:10:553451 "/set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
rhalavatib7bd7c792017-04-27 05:25:163452 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193453 req->Start();
[email protected]255620da2013-08-19 13:14:293454 base::RunLoop().Run();
[email protected]5095cd72012-11-01 10:29:163455 }
3456 // Verify that the cookie is not set.
3457 {
3458 TestNetworkDelegate network_delegate;
3459 default_context_.set_network_delegate(&network_delegate);
3460 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363461 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163462 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3463 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193464 req->Start();
[email protected]255620da2013-08-19 13:14:293465 base::RunLoop().Run();
[email protected]5095cd72012-11-01 10:29:163466
3467 EXPECT_TRUE(d.data_received().find("StillGood=1") == std::string::npos);
3468 }
3469 // Set up a cookie with clock skew and "UTC" HTTP Date timezone specifier.
3470 {
3471 FixedDateNetworkDelegate network_delegate("18-Apr-1977 22:49:13 UTC");
3472 default_context_.set_network_delegate(&network_delegate);
3473 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363474 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
[email protected]2ca01e52013-10-31 22:05:193475 test_server.GetURL(
tommycli59a63432015-11-06 00:10:553476 "/set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
rhalavatib7bd7c792017-04-27 05:25:163477 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193478 req->Start();
[email protected]255620da2013-08-19 13:14:293479 base::RunLoop().Run();
[email protected]5095cd72012-11-01 10:29:163480 }
3481 // Verify that the cookie is set.
3482 {
3483 TestNetworkDelegate network_delegate;
3484 default_context_.set_network_delegate(&network_delegate);
3485 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363486 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163487 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3488 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193489 req->Start();
[email protected]255620da2013-08-19 13:14:293490 base::RunLoop().Run();
[email protected]5095cd72012-11-01 10:29:163491
3492 EXPECT_TRUE(d.data_received().find("StillGood=1") != std::string::npos);
3493 }
3494}
3495
3496
[email protected]316c1e5e2012-09-12 15:17:443497// Check that it is impossible to change the referrer in the extra headers of
3498// an URLRequest.
3499TEST_F(URLRequestTest, DoNotOverrideReferrer) {
David Benjamin42116f62017-11-20 21:45:393500 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:443501 ASSERT_TRUE(test_server.Start());
3502
3503 // If extra headers contain referer and the request contains a referer,
3504 // only the latter shall be respected.
3505 {
3506 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363507 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163508 test_server.GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
3509 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193510 req->SetReferrer("http://foo.com/");
[email protected]316c1e5e2012-09-12 15:17:443511
3512 HttpRequestHeaders headers;
3513 headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/");
[email protected]f7022f32014-08-21 16:32:193514 req->SetExtraRequestHeaders(headers);
[email protected]316c1e5e2012-09-12 15:17:443515
[email protected]f7022f32014-08-21 16:32:193516 req->Start();
[email protected]255620da2013-08-19 13:14:293517 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:443518
3519 EXPECT_EQ("http://foo.com/", d.data_received());
3520 }
3521
3522 // If extra headers contain a referer but the request does not, no referer
3523 // shall be sent in the header.
3524 {
3525 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363526 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163527 test_server.GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
3528 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:443529
3530 HttpRequestHeaders headers;
3531 headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/");
[email protected]f7022f32014-08-21 16:32:193532 req->SetExtraRequestHeaders(headers);
3533 req->SetLoadFlags(LOAD_VALIDATE_CACHE);
[email protected]316c1e5e2012-09-12 15:17:443534
[email protected]f7022f32014-08-21 16:32:193535 req->Start();
[email protected]255620da2013-08-19 13:14:293536 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:443537
3538 EXPECT_EQ("None", d.data_received());
3539 }
3540}
3541
[email protected]b89290212009-08-14 22:37:353542class URLRequestTestHTTP : public URLRequestTest {
[email protected]95409e12010-08-17 20:07:113543 public:
mmenke9f2ec60c2015-06-01 20:59:473544 URLRequestTestHTTP() : test_server_(base::FilePath(kTestFilePath)) {}
[email protected]95409e12010-08-17 20:07:113545
[email protected]b89290212009-08-14 22:37:353546 protected:
[email protected]21184962011-10-26 00:50:303547 // Requests |redirect_url|, which must return a HTTP 3xx redirect.
3548 // |request_method| is the method to use for the initial request.
3549 // |redirect_method| is the method that is expected to be used for the second
3550 // request, after redirection.
3551 // If |include_data| is true, data is uploaded with the request. The
3552 // response body is expected to match it exactly, if and only if
3553 // |request_method| == |redirect_method|.
3554 void HTTPRedirectMethodTest(const GURL& redirect_url,
3555 const std::string& request_method,
3556 const std::string& redirect_method,
3557 bool include_data) {
3558 static const char kData[] = "hello world";
3559 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:163560 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3561 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193562 req->set_method(request_method);
[email protected]21184962011-10-26 00:50:303563 if (include_data) {
mmenkecbc2b712014-10-09 20:29:073564 req->set_upload(CreateSimpleUploadData(kData));
[email protected]21184962011-10-26 00:50:303565 HttpRequestHeaders headers;
3566 headers.SetHeader(HttpRequestHeaders::kContentLength,
riceac912aec2015-07-09 07:26:513567 base::SizeTToString(arraysize(kData) - 1));
svaldez5b3a8972015-10-09 23:23:543568 headers.SetHeader(HttpRequestHeaders::kContentType, "text/plain");
[email protected]f7022f32014-08-21 16:32:193569 req->SetExtraRequestHeaders(headers);
[email protected]21184962011-10-26 00:50:303570 }
[email protected]f7022f32014-08-21 16:32:193571 req->Start();
[email protected]255620da2013-08-19 13:14:293572 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:193573 EXPECT_EQ(redirect_method, req->method());
maksim.sisovb53724b52016-09-16 05:30:503574 EXPECT_EQ(OK, d.request_status());
[email protected]21184962011-10-26 00:50:303575 if (include_data) {
3576 if (request_method == redirect_method) {
svaldez5b3a8972015-10-09 23:23:543577 EXPECT_TRUE(req->extra_request_headers().HasHeader(
3578 HttpRequestHeaders::kContentLength));
3579 EXPECT_TRUE(req->extra_request_headers().HasHeader(
3580 HttpRequestHeaders::kContentType));
[email protected]21184962011-10-26 00:50:303581 EXPECT_EQ(kData, d.data_received());
3582 } else {
svaldez5b3a8972015-10-09 23:23:543583 EXPECT_FALSE(req->extra_request_headers().HasHeader(
3584 HttpRequestHeaders::kContentLength));
3585 EXPECT_FALSE(req->extra_request_headers().HasHeader(
3586 HttpRequestHeaders::kContentType));
[email protected]21184962011-10-26 00:50:303587 EXPECT_NE(kData, d.data_received());
3588 }
3589 }
3590 if (HasFailure())
3591 LOG(WARNING) << "Request method was: " << request_method;
3592 }
3593
Alex Clarke1e08882b32017-10-06 14:22:403594 // Requests |redirect_url|, which must return a HTTP 3xx redirect. It's also
3595 // used as the initial origin.
jww5fe460ff2015-03-28 00:22:513596 // |request_method| is the method to use for the initial request.
3597 // |redirect_method| is the method that is expected to be used for the second
3598 // request, after redirection.
Alex Clarke1e08882b32017-10-06 14:22:403599 // |expected_origin_value| is the expected value for the Origin header after
jww5fe460ff2015-03-28 00:22:513600 // redirection. If empty, expects that there will be no Origin header.
3601 void HTTPRedirectOriginHeaderTest(const GURL& redirect_url,
3602 const std::string& request_method,
3603 const std::string& redirect_method,
Alex Clarke1e08882b32017-10-06 14:22:403604 const std::string& expected_origin_value) {
jww5fe460ff2015-03-28 00:22:513605 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:163606 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3607 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
jww5fe460ff2015-03-28 00:22:513608 req->set_method(request_method);
3609 req->SetExtraRequestHeaderByName(HttpRequestHeaders::kOrigin,
3610 redirect_url.GetOrigin().spec(), false);
3611 req->Start();
3612
3613 base::RunLoop().Run();
3614
3615 EXPECT_EQ(redirect_method, req->method());
3616 // Note that there is no check for request success here because, for
3617 // purposes of testing, the request very well may fail. For example, if the
3618 // test redirects to an HTTPS server from an HTTP origin, thus it is cross
3619 // origin, there is not an HTTPS server in this unit test framework, so the
3620 // request would fail. However, that's fine, as long as the request headers
3621 // are in order and pass the checks below.
Alex Clarke1e08882b32017-10-06 14:22:403622 if (expected_origin_value.empty()) {
jww5fe460ff2015-03-28 00:22:513623 EXPECT_FALSE(
3624 req->extra_request_headers().HasHeader(HttpRequestHeaders::kOrigin));
3625 } else {
3626 std::string origin_header;
3627 EXPECT_TRUE(req->extra_request_headers().GetHeader(
3628 HttpRequestHeaders::kOrigin, &origin_header));
Alex Clarke1e08882b32017-10-06 14:22:403629 EXPECT_EQ(expected_origin_value, origin_header);
jww5fe460ff2015-03-28 00:22:513630 }
3631 }
3632
[email protected]762d2db2010-01-11 19:03:013633 void HTTPUploadDataOperationTest(const std::string& method) {
[email protected]762d2db2010-01-11 19:03:013634 const int kMsgSize = 20000; // multiple of 10
3635 const int kIterations = 50;
[email protected]f43b89f32012-05-01 19:39:483636 char* uploadBytes = new char[kMsgSize+1];
3637 char* ptr = uploadBytes;
[email protected]762d2db2010-01-11 19:03:013638 char marker = 'a';
3639 for (int idx = 0; idx < kMsgSize/10; idx++) {
3640 memcpy(ptr, "----------", 10);
3641 ptr += 10;
3642 if (idx % 100 == 0) {
3643 ptr--;
3644 *ptr++ = marker;
3645 if (++marker > 'z')
3646 marker = 'a';
3647 }
3648 }
3649 uploadBytes[kMsgSize] = '\0';
3650
[email protected]762d2db2010-01-11 19:03:013651 for (int i = 0; i < kIterations; ++i) {
3652 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363653 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163654 test_server_.GetURL("/echo"), DEFAULT_PRIORITY, &d,
3655 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193656 r->set_method(method.c_str());
[email protected]762d2db2010-01-11 19:03:013657
mmenkecbc2b712014-10-09 20:29:073658 r->set_upload(CreateSimpleUploadData(uploadBytes));
[email protected]762d2db2010-01-11 19:03:013659
[email protected]f7022f32014-08-21 16:32:193660 r->Start();
3661 EXPECT_TRUE(r->is_pending());
[email protected]762d2db2010-01-11 19:03:013662
[email protected]255620da2013-08-19 13:14:293663 base::RunLoop().Run();
[email protected]762d2db2010-01-11 19:03:013664
maksim.sisovb53724b52016-09-16 05:30:503665 ASSERT_EQ(1, d.response_started_count()) << "request failed. Error: "
3666 << d.request_status();
[email protected]762d2db2010-01-11 19:03:013667
3668 EXPECT_FALSE(d.received_data_before_response());
3669 EXPECT_EQ(uploadBytes, d.data_received());
[email protected]762d2db2010-01-11 19:03:013670 }
3671 delete[] uploadBytes;
3672 }
3673
[email protected]ede03212012-09-07 12:52:263674 bool DoManyCookiesRequest(int num_cookies) {
[email protected]263163f2012-06-14 22:40:343675 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363676 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:553677 test_server_.GetURL("/set-many-cookies?" +
davidben151423e2015-03-23 18:48:363678 base::IntToString(num_cookies)),
rhalavatib7bd7c792017-04-27 05:25:163679 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]263163f2012-06-14 22:40:343680
[email protected]f7022f32014-08-21 16:32:193681 r->Start();
3682 EXPECT_TRUE(r->is_pending());
[email protected]263163f2012-06-14 22:40:343683
[email protected]255620da2013-08-19 13:14:293684 base::RunLoop().Run();
[email protected]263163f2012-06-14 22:40:343685
maksim.sisovb53724b52016-09-16 05:30:503686 if (d.request_status() != OK) {
3687 EXPECT_EQ(ERR_RESPONSE_HEADERS_TOO_BIG, d.request_status());
3688 return false;
3689 }
[email protected]263163f2012-06-14 22:40:343690
maksim.sisovb53724b52016-09-16 05:30:503691 return true;
[email protected]263163f2012-06-14 22:40:343692 }
3693
David Benjamin42116f62017-11-20 21:45:393694 HttpTestServer* http_test_server() { return &test_server_; }
bengr1bf8e942014-11-07 01:36:503695
tommycli59a63432015-11-06 00:10:553696 private:
David Benjamin42116f62017-11-20 21:45:393697 HttpTestServer test_server_;
[email protected]b89290212009-08-14 22:37:353698};
3699
tommycli59a63432015-11-06 00:10:553700namespace {
3701
danakj8522a25b2016-04-16 00:17:363702std::unique_ptr<test_server::HttpResponse> HandleRedirectConnect(
tommycli59a63432015-11-06 00:10:553703 const test_server::HttpRequest& request) {
3704 if (request.headers.find("Host") == request.headers.end() ||
3705 request.headers.at("Host") != "www.redirect.com" ||
3706 request.method != test_server::METHOD_CONNECT) {
3707 return nullptr;
3708 }
3709
danakj8522a25b2016-04-16 00:17:363710 std::unique_ptr<test_server::BasicHttpResponse> http_response(
tommycli59a63432015-11-06 00:10:553711 new test_server::BasicHttpResponse);
3712 http_response->set_code(HTTP_FOUND);
3713 http_response->AddCustomHeader("Location",
3714 "http://www.destination.com/foo.js");
dchengc7eeda422015-12-26 03:56:483715 return std::move(http_response);
tommycli59a63432015-11-06 00:10:553716}
3717
3718} // namespace
3719
nharperb7441ef2016-01-25 23:54:143720class TestSSLConfigService : public SSLConfigService {
3721 public:
3722 TestSSLConfigService(bool ev_enabled,
3723 bool online_rev_checking,
3724 bool rev_checking_required_local_anchors,
3725 bool token_binding_enabled)
3726 : ev_enabled_(ev_enabled),
3727 online_rev_checking_(online_rev_checking),
3728 rev_checking_required_local_anchors_(
3729 rev_checking_required_local_anchors),
3730 token_binding_enabled_(token_binding_enabled),
davidben095ebb52017-04-12 22:23:343731 min_version_(kDefaultSSLVersionMin),
3732 max_version_(kDefaultSSLVersionMax) {}
nharperb7441ef2016-01-25 23:54:143733
davidben095ebb52017-04-12 22:23:343734 void set_max_version(uint16_t version) { max_version_ = version; }
nharperb7441ef2016-01-25 23:54:143735 void set_min_version(uint16_t version) { min_version_ = version; }
3736
nharperb7441ef2016-01-25 23:54:143737 // SSLConfigService:
3738 void GetSSLConfig(SSLConfig* config) override {
3739 *config = SSLConfig();
3740 config->rev_checking_enabled = online_rev_checking_;
3741 config->verify_ev_cert = ev_enabled_;
3742 config->rev_checking_required_local_anchors =
3743 rev_checking_required_local_anchors_;
davidben095ebb52017-04-12 22:23:343744 config->version_min = min_version_;
3745 config->version_max = max_version_;
nharperb7441ef2016-01-25 23:54:143746 if (token_binding_enabled_) {
3747 config->token_binding_params.push_back(TB_PARAM_ECDSAP256);
3748 }
3749 }
3750
3751 protected:
3752 ~TestSSLConfigService() override {}
3753
3754 private:
3755 const bool ev_enabled_;
3756 const bool online_rev_checking_;
3757 const bool rev_checking_required_local_anchors_;
3758 const bool token_binding_enabled_;
3759 uint16_t min_version_;
davidben095ebb52017-04-12 22:23:343760 uint16_t max_version_;
nharperb7441ef2016-01-25 23:54:143761};
3762
3763// TODO(svaldez): Update tests to use EmbeddedTestServer.
3764#if !defined(OS_IOS)
3765class TokenBindingURLRequestTest : public URLRequestTestHTTP {
3766 public:
fdoray9f0b4782017-02-10 12:55:473767 TokenBindingURLRequestTest() = default;
fdoraya89e673c2017-01-31 21:44:213768
nharperb7441ef2016-01-25 23:54:143769 void SetUp() override {
3770 default_context_.set_ssl_config_service(
3771 new TestSSLConfigService(false, false, false, true));
fdoraya89e673c2017-01-31 21:44:213772 channel_id_service_.reset(
3773 new ChannelIDService(new DefaultChannelIDStore(NULL)));
nharperb7441ef2016-01-25 23:54:143774 default_context_.set_channel_id_service(channel_id_service_.get());
3775 URLRequestTestHTTP::SetUp();
3776 }
3777
3778 protected:
danakj8522a25b2016-04-16 00:17:363779 std::unique_ptr<ChannelIDService> channel_id_service_;
nharperb7441ef2016-01-25 23:54:143780};
3781
3782TEST_F(TokenBindingURLRequestTest, TokenBindingTest) {
3783 SpawnedTestServer::SSLOptions ssl_options;
3784 ssl_options.supported_token_binding_params.push_back(TB_PARAM_ECDSAP256);
3785 SpawnedTestServer https_test_server(SpawnedTestServer::TYPE_HTTPS,
3786 ssl_options,
3787 base::FilePath(kTestFilePath));
3788 ASSERT_TRUE(https_test_server.Start());
3789
3790 TestDelegate d;
3791 {
danakj8522a25b2016-04-16 00:17:363792 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163793 https_test_server.GetURL("tokbind-ekm"), DEFAULT_PRIORITY, &d,
3794 TRAFFIC_ANNOTATION_FOR_TESTS));
nharperb7441ef2016-01-25 23:54:143795 r->Start();
3796 EXPECT_TRUE(r->is_pending());
3797
3798 base::RunLoop().Run();
3799
maksim.sisovb53724b52016-09-16 05:30:503800 EXPECT_EQ(OK, d.request_status());
nharperb7441ef2016-01-25 23:54:143801
3802 HttpRequestHeaders headers;
3803 std::string token_binding_header, token_binding_message;
3804 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
3805 EXPECT_TRUE(headers.GetHeader(HttpRequestHeaders::kTokenBinding,
3806 &token_binding_header));
3807 EXPECT_TRUE(base::Base64UrlDecode(
nharper78e6d2b2016-09-21 05:42:353808 token_binding_header, base::Base64UrlDecodePolicy::DISALLOW_PADDING,
nharperb7441ef2016-01-25 23:54:143809 &token_binding_message));
nharperd6e65822016-03-30 23:05:483810 std::vector<TokenBinding> token_bindings;
3811 ASSERT_TRUE(
3812 ParseTokenBindingMessage(token_binding_message, &token_bindings));
3813 ASSERT_EQ(1ull, token_bindings.size());
nharperb7441ef2016-01-25 23:54:143814
3815 EXPECT_GT(d.bytes_received(), 0);
3816 std::string ekm = d.data_received();
3817
nharperd6e65822016-03-30 23:05:483818 EXPECT_EQ(TokenBindingType::PROVIDED, token_bindings[0].type);
nharper78e6d2b2016-09-21 05:42:353819 EXPECT_TRUE(VerifyTokenBindingSignature(token_bindings[0].ec_point,
3820 token_bindings[0].signature,
3821 TokenBindingType::PROVIDED, ekm));
nharperb7441ef2016-01-25 23:54:143822 }
3823}
nharperd6e65822016-03-30 23:05:483824
3825TEST_F(TokenBindingURLRequestTest, ForwardTokenBinding) {
3826 SpawnedTestServer::SSLOptions ssl_options;
3827 ssl_options.supported_token_binding_params.push_back(TB_PARAM_ECDSAP256);
3828 SpawnedTestServer https_test_server(SpawnedTestServer::TYPE_HTTPS,
3829 ssl_options,
3830 base::FilePath(kTestFilePath));
3831 ASSERT_TRUE(https_test_server.Start());
3832
3833 TestDelegate d;
3834 {
3835 GURL redirect_url =
3836 https_test_server.GetURL("forward-tokbind?/tokbind-ekm");
rhalavatib7bd7c792017-04-27 05:25:163837 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
3838 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
nharperd6e65822016-03-30 23:05:483839 r->Start();
3840 EXPECT_TRUE(r->is_pending());
3841
3842 base::RunLoop().Run();
3843
maksim.sisovb53724b52016-09-16 05:30:503844 EXPECT_EQ(OK, d.request_status());
nharperd6e65822016-03-30 23:05:483845
3846 HttpRequestHeaders headers;
3847 std::string token_binding_header, token_binding_message;
3848 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
3849 EXPECT_TRUE(headers.GetHeader(HttpRequestHeaders::kTokenBinding,
3850 &token_binding_header));
3851 EXPECT_TRUE(base::Base64UrlDecode(
nharper78e6d2b2016-09-21 05:42:353852 token_binding_header, base::Base64UrlDecodePolicy::DISALLOW_PADDING,
nharperd6e65822016-03-30 23:05:483853 &token_binding_message));
3854 std::vector<TokenBinding> token_bindings;
3855 ASSERT_TRUE(
3856 ParseTokenBindingMessage(token_binding_message, &token_bindings));
3857 ASSERT_EQ(2ull, token_bindings.size());
3858
3859 EXPECT_GT(d.bytes_received(), 0);
3860 std::string ekm = d.data_received();
3861
3862 EXPECT_EQ(TokenBindingType::PROVIDED, token_bindings[0].type);
nharper78e6d2b2016-09-21 05:42:353863 EXPECT_TRUE(VerifyTokenBindingSignature(token_bindings[0].ec_point,
3864 token_bindings[0].signature,
3865 TokenBindingType::PROVIDED, ekm));
nharperd6e65822016-03-30 23:05:483866 EXPECT_EQ(TokenBindingType::REFERRED, token_bindings[1].type);
nharper78e6d2b2016-09-21 05:42:353867 EXPECT_TRUE(VerifyTokenBindingSignature(token_bindings[1].ec_point,
3868 token_bindings[1].signature,
3869 TokenBindingType::REFERRED, ekm));
nharperd6e65822016-03-30 23:05:483870 }
3871}
3872
3873// TODO(nharper): Remove this #ifdef and replace SpawnedTestServer with
3874// EmbeddedTestServer once crbug.com/599187 is resolved.
3875#if !defined(OS_ANDROID)
3876TEST_F(TokenBindingURLRequestTest, DontForwardHeaderFromHttp) {
Sergey Ulanov9e8d6f32017-08-14 22:12:583877 SpawnedTestServer http_server(SpawnedTestServer::TYPE_HTTP, base::FilePath());
nharperd6e65822016-03-30 23:05:483878 ASSERT_TRUE(http_server.Start());
3879 SpawnedTestServer::SSLOptions ssl_options;
3880 ssl_options.supported_token_binding_params.push_back(TB_PARAM_ECDSAP256);
3881 SpawnedTestServer https_test_server(SpawnedTestServer::TYPE_HTTPS,
3882 ssl_options,
3883 base::FilePath(kTestFilePath));
3884 ASSERT_TRUE(https_test_server.Start());
3885
3886 TestDelegate d;
3887 {
3888 GURL redirect_url = http_server.GetURL(
3889 "forward-tokbind?" + https_test_server.GetURL("tokbind-ekm").spec());
rhalavatib7bd7c792017-04-27 05:25:163890 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
3891 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
nharperd6e65822016-03-30 23:05:483892 r->Start();
3893 EXPECT_TRUE(r->is_pending());
3894
3895 base::RunLoop().Run();
3896
maksim.sisovb53724b52016-09-16 05:30:503897 EXPECT_EQ(OK, d.request_status());
nharperd6e65822016-03-30 23:05:483898
3899 HttpRequestHeaders headers;
3900 std::string token_binding_header, token_binding_message;
3901 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
3902 EXPECT_TRUE(headers.GetHeader(HttpRequestHeaders::kTokenBinding,
3903 &token_binding_header));
3904 EXPECT_TRUE(base::Base64UrlDecode(
nharper78e6d2b2016-09-21 05:42:353905 token_binding_header, base::Base64UrlDecodePolicy::DISALLOW_PADDING,
nharperd6e65822016-03-30 23:05:483906 &token_binding_message));
3907 std::vector<TokenBinding> token_bindings;
3908 ASSERT_TRUE(
3909 ParseTokenBindingMessage(token_binding_message, &token_bindings));
3910 ASSERT_EQ(1ull, token_bindings.size());
3911
3912 EXPECT_GT(d.bytes_received(), 0);
3913 std::string ekm = d.data_received();
3914
3915 EXPECT_EQ(TokenBindingType::PROVIDED, token_bindings[0].type);
nharper78e6d2b2016-09-21 05:42:353916 EXPECT_TRUE(VerifyTokenBindingSignature(token_bindings[0].ec_point,
3917 token_bindings[0].signature,
3918 TokenBindingType::PROVIDED, ekm));
nharperd6e65822016-03-30 23:05:483919 }
3920}
3921
3922// Test that if a server supporting Token Binding redirects (with
nharper86f0be22016-07-14 00:49:363923// Include-Referred-Token-Binding-ID) to an https url on a server that does not
nharperd6e65822016-03-30 23:05:483924// support Token Binding, then we do not send a Sec-Token-Binding when following
3925// the redirect.
3926TEST_F(TokenBindingURLRequestTest, ForwardWithoutTokenBinding) {
3927 SpawnedTestServer::SSLOptions ssl_options;
3928 SpawnedTestServer https_test_server(SpawnedTestServer::TYPE_HTTPS,
3929 ssl_options,
3930 base::FilePath(kTestFilePath));
3931 ASSERT_TRUE(https_test_server.Start());
3932 ssl_options.supported_token_binding_params.push_back(TB_PARAM_ECDSAP256);
3933 SpawnedTestServer token_binding_test_server(SpawnedTestServer::TYPE_HTTPS,
3934 ssl_options,
3935 base::FilePath(kTestFilePath));
3936 ASSERT_TRUE(token_binding_test_server.Start());
3937
3938 TestDelegate d;
3939 {
3940 GURL redirect_url = token_binding_test_server.GetURL(
3941 "forward-tokbind?" + https_test_server.GetURL("tokbind-ekm").spec());
rhalavatib7bd7c792017-04-27 05:25:163942 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
3943 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
nharperd6e65822016-03-30 23:05:483944 r->Start();
3945 EXPECT_TRUE(r->is_pending());
3946
3947 base::RunLoop().Run();
3948
maksim.sisovb53724b52016-09-16 05:30:503949 EXPECT_EQ(OK, d.request_status());
nharperd6e65822016-03-30 23:05:483950
3951 HttpRequestHeaders headers;
3952 std::string token_binding_header, token_binding_message;
3953 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
3954 EXPECT_FALSE(headers.GetHeader(HttpRequestHeaders::kTokenBinding,
3955 &token_binding_header));
3956 }
3957}
3958#endif // !defined(OS_ANDROID)
nharperb7441ef2016-01-25 23:54:143959#endif // !defined(OS_IOS)
3960
3961// In this unit test, we're using the HTTPTestServer as a proxy server and
[email protected]95409e12010-08-17 20:07:113962// issuing a CONNECT request with the magic host name "www.redirect.com".
tommycli59a63432015-11-06 00:10:553963// The EmbeddedTestServer will return a 302 response, which we should not
[email protected]95409e12010-08-17 20:07:113964// follow.
[email protected]f2f31b32013-01-16 23:24:093965TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) {
tommycli59a63432015-11-06 00:10:553966 http_test_server()->RegisterRequestHandler(
3967 base::Bind(&HandleRedirectConnect));
3968 ASSERT_TRUE(http_test_server()->Start());
[email protected]95409e12010-08-17 20:07:113969
[email protected]ceefd7fd2012-11-29 00:36:243970 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]d5a4dd62012-05-23 01:41:043971 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:553972 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]87a09a92011-07-14 15:50:503973
[email protected]d1ec59082009-02-11 02:48:153974 TestDelegate d;
3975 {
danakj8522a25b2016-04-16 00:17:363976 std::unique_ptr<URLRequest> r(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163977 GURL("https://www.redirect.com/"), DEFAULT_PRIORITY, &d,
3978 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193979 r->Start();
3980 EXPECT_TRUE(r->is_pending());
[email protected]d1ec59082009-02-11 02:48:153981
[email protected]255620da2013-08-19 13:14:293982 base::RunLoop().Run();
[email protected]d1ec59082009-02-11 02:48:153983
[email protected]d8fc4722014-06-13 13:17:153984 // The proxy server is not set before failure.
tbansal2ecbbc72016-10-06 17:15:473985 EXPECT_FALSE(r->proxy_server().is_valid());
maksim.sisovb53724b52016-09-16 05:30:503986 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status());
[email protected]dc651782009-02-14 01:45:083987 EXPECT_EQ(1, d.response_started_count());
[email protected]d1ec59082009-02-11 02:48:153988 // We should not have followed the redirect.
3989 EXPECT_EQ(0, d.received_redirect_count());
3990 }
3991}
3992
[email protected]8202d0c2011-02-23 08:31:143993// This is the same as the previous test, but checks that the network delegate
3994// registers the error.
[email protected]c044616e2013-02-20 02:01:263995TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) {
tommycli59a63432015-11-06 00:10:553996 ASSERT_TRUE(http_test_server()->Start());
[email protected]8202d0c2011-02-23 08:31:143997
[email protected]ceefd7fd2012-11-29 00:36:243998 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]d5a4dd62012-05-23 01:41:043999 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554000 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]87a09a92011-07-14 15:50:504001
[email protected]8202d0c2011-02-23 08:31:144002 TestDelegate d;
4003 {
danakj8522a25b2016-04-16 00:17:364004 std::unique_ptr<URLRequest> r(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164005 GURL("https://www.redirect.com/"), DEFAULT_PRIORITY, &d,
4006 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194007 r->Start();
4008 EXPECT_TRUE(r->is_pending());
[email protected]8202d0c2011-02-23 08:31:144009
[email protected]255620da2013-08-19 13:14:294010 base::RunLoop().Run();
[email protected]8202d0c2011-02-23 08:31:144011
[email protected]d8fc4722014-06-13 13:17:154012 // The proxy server is not set before failure.
tbansal2ecbbc72016-10-06 17:15:474013 EXPECT_FALSE(r->proxy_server().is_valid());
[email protected]8202d0c2011-02-23 08:31:144014 EXPECT_EQ(1, d.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:504015 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status());
[email protected]8202d0c2011-02-23 08:31:144016 // We should not have followed the redirect.
4017 EXPECT_EQ(0, d.received_redirect_count());
4018
4019 EXPECT_EQ(1, network_delegate.error_count());
robpercival214763f2016-07-01 23:27:014020 EXPECT_THAT(network_delegate.last_error(),
4021 IsError(ERR_TUNNEL_CONNECTION_FAILED));
[email protected]8202d0c2011-02-23 08:31:144022 }
4023}
4024
[email protected]dc5a5cf2012-09-26 02:49:304025// Tests that we can block and asynchronously return OK in various stages.
4026TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) {
4027 static const BlockingNetworkDelegate::Stage blocking_stages[] = {
4028 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
4029 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
4030 BlockingNetworkDelegate::ON_HEADERS_RECEIVED
4031 };
4032 static const size_t blocking_stages_length = arraysize(blocking_stages);
4033
tommycli59a63432015-11-06 00:10:554034 ASSERT_TRUE(http_test_server()->Start());
[email protected]dc5a5cf2012-09-26 02:49:304035
4036 TestDelegate d;
4037 BlockingNetworkDelegate network_delegate(
4038 BlockingNetworkDelegate::USER_CALLBACK);
4039 network_delegate.set_block_on(
4040 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST |
4041 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS |
4042 BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
4043
4044 TestURLRequestContext context(true);
4045 context.set_network_delegate(&network_delegate);
4046 context.Init();
4047
4048 {
danakj8522a25b2016-04-16 00:17:364049 std::unique_ptr<URLRequest> r(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164050 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
4051 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]dc5a5cf2012-09-26 02:49:304052
[email protected]f7022f32014-08-21 16:32:194053 r->Start();
[email protected]dc5a5cf2012-09-26 02:49:304054 for (size_t i = 0; i < blocking_stages_length; ++i) {
[email protected]255620da2013-08-19 13:14:294055 base::RunLoop().Run();
[email protected]dc5a5cf2012-09-26 02:49:304056 EXPECT_EQ(blocking_stages[i],
4057 network_delegate.stage_blocked_for_callback());
4058 network_delegate.DoCallback(OK);
4059 }
[email protected]255620da2013-08-19 13:14:294060 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:194061 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:504062 EXPECT_EQ(OK, d.request_status());
[email protected]dc5a5cf2012-09-26 02:49:304063 EXPECT_EQ(1, network_delegate.created_requests());
4064 EXPECT_EQ(0, network_delegate.destroyed_requests());
4065 }
4066 EXPECT_EQ(1, network_delegate.destroyed_requests());
4067}
4068
[email protected]4c76d7c2011-04-15 19:14:124069// Tests that the network delegate can block and cancel a request.
4070TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequest) {
tommycli59a63432015-11-06 00:10:554071 ASSERT_TRUE(http_test_server()->Start());
[email protected]4c76d7c2011-04-15 19:14:124072
4073 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304074 BlockingNetworkDelegate network_delegate(
4075 BlockingNetworkDelegate::AUTO_CALLBACK);
4076 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
4077 network_delegate.set_retval(ERR_EMPTY_RESPONSE);
[email protected]4c76d7c2011-04-15 19:14:124078
[email protected]d5a4dd62012-05-23 01:41:044079 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554080 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]87a09a92011-07-14 15:50:504081
[email protected]4c76d7c2011-04-15 19:14:124082 {
rhalavatib7bd7c792017-04-27 05:25:164083 std::unique_ptr<URLRequest> r(
4084 context.CreateRequest(http_test_server()->GetURL("/"), DEFAULT_PRIORITY,
4085 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]4c76d7c2011-04-15 19:14:124086
[email protected]f7022f32014-08-21 16:32:194087 r->Start();
[email protected]255620da2013-08-19 13:14:294088 base::RunLoop().Run();
[email protected]4c76d7c2011-04-15 19:14:124089
[email protected]d8fc4722014-06-13 13:17:154090 // The proxy server is not set before cancellation.
tbansal2ecbbc72016-10-06 17:15:474091 EXPECT_FALSE(r->proxy_server().is_valid());
maksim.sisovb53724b52016-09-16 05:30:504092 EXPECT_EQ(ERR_EMPTY_RESPONSE, d.request_status());
[email protected]4c76d7c2011-04-15 19:14:124093 EXPECT_EQ(1, network_delegate.created_requests());
4094 EXPECT_EQ(0, network_delegate.destroyed_requests());
4095 }
4096 EXPECT_EQ(1, network_delegate.destroyed_requests());
4097}
4098
[email protected]b4438d32012-09-27 06:15:304099// Helper function for NetworkDelegateCancelRequestAsynchronously and
4100// NetworkDelegateCancelRequestSynchronously. Sets up a blocking network
4101// delegate operating in |block_mode| and a request for |url|. It blocks the
4102// request in |stage| and cancels it with ERR_BLOCKED_BY_CLIENT.
4103void NetworkDelegateCancelRequest(BlockingNetworkDelegate::BlockMode block_mode,
4104 BlockingNetworkDelegate::Stage stage,
4105 const GURL& url) {
[email protected]3cd384c602011-08-31 16:12:364106 TestDelegate d;
[email protected]b4438d32012-09-27 06:15:304107 BlockingNetworkDelegate network_delegate(block_mode);
4108 network_delegate.set_retval(ERR_BLOCKED_BY_CLIENT);
4109 network_delegate.set_block_on(stage);
[email protected]3cd384c602011-08-31 16:12:364110
[email protected]b4438d32012-09-27 06:15:304111 TestURLRequestContext context(true);
4112 context.set_network_delegate(&network_delegate);
4113 context.Init();
[email protected]3cd384c602011-08-31 16:12:364114
4115 {
rhalavatib7bd7c792017-04-27 05:25:164116 std::unique_ptr<URLRequest> r(context.CreateRequest(
4117 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]3cd384c602011-08-31 16:12:364118
[email protected]f7022f32014-08-21 16:32:194119 r->Start();
[email protected]255620da2013-08-19 13:14:294120 base::RunLoop().Run();
[email protected]3cd384c602011-08-31 16:12:364121
[email protected]d8fc4722014-06-13 13:17:154122 // The proxy server is not set before cancellation.
tbansal2ecbbc72016-10-06 17:15:474123 if (stage == BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST ||
4124 stage == BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS) {
4125 EXPECT_FALSE(r->proxy_server().is_valid());
4126 } else if (stage == BlockingNetworkDelegate::ON_HEADERS_RECEIVED) {
4127 EXPECT_TRUE(r->proxy_server().is_direct());
4128 } else {
4129 NOTREACHED();
4130 }
maksim.sisovb53724b52016-09-16 05:30:504131 EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, d.request_status());
[email protected]3cd384c602011-08-31 16:12:364132 EXPECT_EQ(1, network_delegate.created_requests());
4133 EXPECT_EQ(0, network_delegate.destroyed_requests());
4134 }
4135 EXPECT_EQ(1, network_delegate.destroyed_requests());
4136}
4137
[email protected]b4438d32012-09-27 06:15:304138// The following 3 tests check that the network delegate can cancel a request
4139// synchronously in various stages of the request.
4140TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) {
tommycli59a63432015-11-06 00:10:554141 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304142 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
4143 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
tommycli59a63432015-11-06 00:10:554144 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304145}
4146
4147TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously2) {
tommycli59a63432015-11-06 00:10:554148 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304149 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
4150 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
tommycli59a63432015-11-06 00:10:554151 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304152}
4153
4154TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously3) {
tommycli59a63432015-11-06 00:10:554155 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304156 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
4157 BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
tommycli59a63432015-11-06 00:10:554158 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304159}
4160
4161// The following 3 tests check that the network delegate can cancel a request
4162// asynchronously in various stages of the request.
4163TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously1) {
tommycli59a63432015-11-06 00:10:554164 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304165 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
4166 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
tommycli59a63432015-11-06 00:10:554167 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304168}
4169
4170TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously2) {
tommycli59a63432015-11-06 00:10:554171 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304172 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
4173 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
tommycli59a63432015-11-06 00:10:554174 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304175}
4176
4177TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously3) {
tommycli59a63432015-11-06 00:10:554178 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304179 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
4180 BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
tommycli59a63432015-11-06 00:10:554181 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304182}
4183
[email protected]4c76d7c2011-04-15 19:14:124184// Tests that the network delegate can block and redirect a request to a new
4185// URL.
4186TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequest) {
tommycli59a63432015-11-06 00:10:554187 ASSERT_TRUE(http_test_server()->Start());
[email protected]4c76d7c2011-04-15 19:14:124188
4189 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304190 BlockingNetworkDelegate network_delegate(
4191 BlockingNetworkDelegate::AUTO_CALLBACK);
4192 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
tommycli59a63432015-11-06 00:10:554193 GURL redirect_url(http_test_server()->GetURL("/simple.html"));
[email protected]4c76d7c2011-04-15 19:14:124194 network_delegate.set_redirect_url(redirect_url);
4195
[email protected]d5a4dd62012-05-23 01:41:044196 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554197 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]87a09a92011-07-14 15:50:504198
[email protected]4c76d7c2011-04-15 19:14:124199 {
tommycli59a63432015-11-06 00:10:554200 GURL original_url(http_test_server()->GetURL("/defaultresponse"));
rhalavatib7bd7c792017-04-27 05:25:164201 std::unique_ptr<URLRequest> r(context.CreateRequest(
4202 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]4c76d7c2011-04-15 19:14:124203
[email protected]6be6fa92014-08-06 23:44:564204 // Quit after hitting the redirect, so can check the headers.
4205 d.set_quit_on_redirect(true);
[email protected]f7022f32014-08-21 16:32:194206 r->Start();
[email protected]255620da2013-08-19 13:14:294207 base::RunLoop().Run();
[email protected]4c76d7c2011-04-15 19:14:124208
[email protected]6be6fa92014-08-06 23:44:564209 // Check headers from URLRequestJob.
[email protected]f7022f32014-08-21 16:32:194210 EXPECT_EQ(307, r->GetResponseCode());
4211 EXPECT_EQ(307, r->response_headers()->response_code());
[email protected]6be6fa92014-08-06 23:44:564212 std::string location;
[email protected]f7022f32014-08-21 16:32:194213 ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location",
4214 &location));
[email protected]6be6fa92014-08-06 23:44:564215 EXPECT_EQ(redirect_url, GURL(location));
4216
4217 // Let the request finish.
[email protected]f7022f32014-08-21 16:32:194218 r->FollowDeferredRedirect();
[email protected]6be6fa92014-08-06 23:44:564219 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:504220 EXPECT_EQ(OK, d.request_status());
tbansal2ecbbc72016-10-06 17:15:474221 EXPECT_EQ(ProxyServer(ProxyServer::SCHEME_HTTP,
4222 http_test_server()->host_port_pair()),
4223 r->proxy_server());
ryansturm49a8cb12016-06-15 16:51:094224 // before_send_headers_with_proxy_count only increments for headers sent
4225 // through an untunneled proxy.
4226 EXPECT_EQ(1, network_delegate.before_send_headers_with_proxy_count());
tommycli59a63432015-11-06 00:10:554227 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals(
4228 http_test_server()->host_port_pair()));
[email protected]597a1ab2014-06-26 08:12:274229
maksim.sisovb53724b52016-09-16 05:30:504230 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194231 EXPECT_EQ(redirect_url, r->url());
4232 EXPECT_EQ(original_url, r->original_url());
4233 EXPECT_EQ(2U, r->url_chain().size());
[email protected]4c76d7c2011-04-15 19:14:124234 EXPECT_EQ(1, network_delegate.created_requests());
4235 EXPECT_EQ(0, network_delegate.destroyed_requests());
4236 }
4237 EXPECT_EQ(1, network_delegate.destroyed_requests());
4238}
4239
[email protected]b813ed72012-04-05 08:21:364240// Tests that the network delegate can block and redirect a request to a new
4241// URL by setting a redirect_url and returning in OnBeforeURLRequest directly.
4242TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestSynchronously) {
tommycli59a63432015-11-06 00:10:554243 ASSERT_TRUE(http_test_server()->Start());
[email protected]b813ed72012-04-05 08:21:364244
4245 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304246 BlockingNetworkDelegate network_delegate(
4247 BlockingNetworkDelegate::SYNCHRONOUS);
tommycli59a63432015-11-06 00:10:554248 GURL redirect_url(http_test_server()->GetURL("/simple.html"));
[email protected]b813ed72012-04-05 08:21:364249 network_delegate.set_redirect_url(redirect_url);
[email protected]b813ed72012-04-05 08:21:364250
[email protected]d5a4dd62012-05-23 01:41:044251 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554252 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]b813ed72012-04-05 08:21:364253
4254 {
tommycli59a63432015-11-06 00:10:554255 GURL original_url(http_test_server()->GetURL("/defaultresponse"));
rhalavatib7bd7c792017-04-27 05:25:164256 std::unique_ptr<URLRequest> r(context.CreateRequest(
4257 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]b813ed72012-04-05 08:21:364258
[email protected]6be6fa92014-08-06 23:44:564259 // Quit after hitting the redirect, so can check the headers.
4260 d.set_quit_on_redirect(true);
[email protected]f7022f32014-08-21 16:32:194261 r->Start();
[email protected]255620da2013-08-19 13:14:294262 base::RunLoop().Run();
[email protected]b813ed72012-04-05 08:21:364263
[email protected]6be6fa92014-08-06 23:44:564264 // Check headers from URLRequestJob.
[email protected]f7022f32014-08-21 16:32:194265 EXPECT_EQ(307, r->GetResponseCode());
4266 EXPECT_EQ(307, r->response_headers()->response_code());
[email protected]6be6fa92014-08-06 23:44:564267 std::string location;
[email protected]f7022f32014-08-21 16:32:194268 ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location",
4269 &location));
[email protected]6be6fa92014-08-06 23:44:564270 EXPECT_EQ(redirect_url, GURL(location));
4271
4272 // Let the request finish.
[email protected]f7022f32014-08-21 16:32:194273 r->FollowDeferredRedirect();
[email protected]6be6fa92014-08-06 23:44:564274 base::RunLoop().Run();
4275
maksim.sisovb53724b52016-09-16 05:30:504276 EXPECT_EQ(OK, d.request_status());
tbansal2ecbbc72016-10-06 17:15:474277 EXPECT_EQ(ProxyServer(ProxyServer::SCHEME_HTTP,
4278 http_test_server()->host_port_pair()),
4279 r->proxy_server());
ryansturm49a8cb12016-06-15 16:51:094280 // before_send_headers_with_proxy_count only increments for headers sent
4281 // through an untunneled proxy.
4282 EXPECT_EQ(1, network_delegate.before_send_headers_with_proxy_count());
tommycli59a63432015-11-06 00:10:554283 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals(
4284 http_test_server()->host_port_pair()));
maksim.sisovb53724b52016-09-16 05:30:504285 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194286 EXPECT_EQ(redirect_url, r->url());
4287 EXPECT_EQ(original_url, r->original_url());
4288 EXPECT_EQ(2U, r->url_chain().size());
[email protected]b813ed72012-04-05 08:21:364289 EXPECT_EQ(1, network_delegate.created_requests());
4290 EXPECT_EQ(0, network_delegate.destroyed_requests());
4291 }
4292 EXPECT_EQ(1, network_delegate.destroyed_requests());
4293}
4294
[email protected]3c5ca8c2011-09-29 01:14:514295// Tests that redirects caused by the network delegate preserve POST data.
4296TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestPost) {
tommycli59a63432015-11-06 00:10:554297 ASSERT_TRUE(http_test_server()->Start());
[email protected]3c5ca8c2011-09-29 01:14:514298
4299 const char kData[] = "hello world";
4300
4301 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304302 BlockingNetworkDelegate network_delegate(
4303 BlockingNetworkDelegate::AUTO_CALLBACK);
4304 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
tommycli59a63432015-11-06 00:10:554305 GURL redirect_url(http_test_server()->GetURL("/echo"));
[email protected]3c5ca8c2011-09-29 01:14:514306 network_delegate.set_redirect_url(redirect_url);
4307
[email protected]ef2bf422012-05-11 03:27:094308 TestURLRequestContext context(true);
4309 context.set_network_delegate(&network_delegate);
4310 context.Init();
[email protected]3c5ca8c2011-09-29 01:14:514311
4312 {
tommycli59a63432015-11-06 00:10:554313 GURL original_url(http_test_server()->GetURL("/defaultresponse"));
rhalavatib7bd7c792017-04-27 05:25:164314 std::unique_ptr<URLRequest> r(context.CreateRequest(
4315 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194316 r->set_method("POST");
mmenkecbc2b712014-10-09 20:29:074317 r->set_upload(CreateSimpleUploadData(kData));
[email protected]3c5ca8c2011-09-29 01:14:514318 HttpRequestHeaders headers;
4319 headers.SetHeader(HttpRequestHeaders::kContentLength,
riceac912aec2015-07-09 07:26:514320 base::SizeTToString(arraysize(kData) - 1));
[email protected]f7022f32014-08-21 16:32:194321 r->SetExtraRequestHeaders(headers);
[email protected]6be6fa92014-08-06 23:44:564322
4323 // Quit after hitting the redirect, so can check the headers.
4324 d.set_quit_on_redirect(true);
[email protected]f7022f32014-08-21 16:32:194325 r->Start();
[email protected]255620da2013-08-19 13:14:294326 base::RunLoop().Run();
[email protected]3c5ca8c2011-09-29 01:14:514327
[email protected]6be6fa92014-08-06 23:44:564328 // Check headers from URLRequestJob.
[email protected]f7022f32014-08-21 16:32:194329 EXPECT_EQ(307, r->GetResponseCode());
4330 EXPECT_EQ(307, r->response_headers()->response_code());
[email protected]6be6fa92014-08-06 23:44:564331 std::string location;
[email protected]f7022f32014-08-21 16:32:194332 ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location",
4333 &location));
[email protected]6be6fa92014-08-06 23:44:564334 EXPECT_EQ(redirect_url, GURL(location));
4335
4336 // Let the request finish.
[email protected]f7022f32014-08-21 16:32:194337 r->FollowDeferredRedirect();
[email protected]6be6fa92014-08-06 23:44:564338 base::RunLoop().Run();
4339
maksim.sisovb53724b52016-09-16 05:30:504340 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194341 EXPECT_EQ(redirect_url, r->url());
4342 EXPECT_EQ(original_url, r->original_url());
4343 EXPECT_EQ(2U, r->url_chain().size());
[email protected]3c5ca8c2011-09-29 01:14:514344 EXPECT_EQ(1, network_delegate.created_requests());
4345 EXPECT_EQ(0, network_delegate.destroyed_requests());
[email protected]f7022f32014-08-21 16:32:194346 EXPECT_EQ("POST", r->method());
[email protected]3c5ca8c2011-09-29 01:14:514347 EXPECT_EQ(kData, d.data_received());
4348 }
4349 EXPECT_EQ(1, network_delegate.destroyed_requests());
4350}
4351
[email protected]5f714132014-03-26 10:41:164352// Tests that the network delegate can block and redirect a request to a new
4353// URL during OnHeadersReceived.
4354TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestOnHeadersReceived) {
tommycli59a63432015-11-06 00:10:554355 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:164356
4357 TestDelegate d;
4358 BlockingNetworkDelegate network_delegate(
4359 BlockingNetworkDelegate::AUTO_CALLBACK);
4360 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
tommycli59a63432015-11-06 00:10:554361 GURL redirect_url(http_test_server()->GetURL("/simple.html"));
[email protected]5f714132014-03-26 10:41:164362 network_delegate.set_redirect_on_headers_received_url(redirect_url);
4363
4364 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554365 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]5f714132014-03-26 10:41:164366
4367 {
tommycli59a63432015-11-06 00:10:554368 GURL original_url(http_test_server()->GetURL("/defaultresponse"));
rhalavatib7bd7c792017-04-27 05:25:164369 std::unique_ptr<URLRequest> r(context.CreateRequest(
4370 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:164371
[email protected]f7022f32014-08-21 16:32:194372 r->Start();
[email protected]5f714132014-03-26 10:41:164373 base::RunLoop().Run();
4374
maksim.sisovb53724b52016-09-16 05:30:504375 EXPECT_EQ(OK, d.request_status());
tbansal2ecbbc72016-10-06 17:15:474376 EXPECT_EQ(ProxyServer(ProxyServer::SCHEME_HTTP,
4377 http_test_server()->host_port_pair()),
4378 r->proxy_server());
ryansturm49a8cb12016-06-15 16:51:094379 // before_send_headers_with_proxy_count only increments for headers sent
4380 // through an untunneled proxy.
4381 EXPECT_EQ(2, network_delegate.before_send_headers_with_proxy_count());
tommycli59a63432015-11-06 00:10:554382 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals(
4383 http_test_server()->host_port_pair()));
[email protected]f7022f32014-08-21 16:32:194384
maksim.sisovb53724b52016-09-16 05:30:504385 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194386 EXPECT_EQ(redirect_url, r->url());
4387 EXPECT_EQ(original_url, r->original_url());
4388 EXPECT_EQ(2U, r->url_chain().size());
[email protected]5f714132014-03-26 10:41:164389 EXPECT_EQ(2, network_delegate.created_requests());
4390 EXPECT_EQ(0, network_delegate.destroyed_requests());
4391 }
4392 EXPECT_EQ(1, network_delegate.destroyed_requests());
4393}
4394
[email protected]c2911d72011-10-03 22:16:364395// Tests that the network delegate can synchronously complete OnAuthRequired
4396// by taking no action. This indicates that the NetworkDelegate does not want to
4397// handle the challenge, and is passing the buck along to the
4398// URLRequest::Delegate.
4399TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) {
tommycli59a63432015-11-06 00:10:554400 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364401
4402 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304403 BlockingNetworkDelegate network_delegate(
4404 BlockingNetworkDelegate::SYNCHRONOUS);
[email protected]c2911d72011-10-03 22:16:364405
[email protected]ef2bf422012-05-11 03:27:094406 TestURLRequestContext context(true);
4407 context.set_network_delegate(&network_delegate);
4408 context.Init();
[email protected]c2911d72011-10-03 22:16:364409
[email protected]f3cf9802011-10-28 18:44:584410 d.set_credentials(AuthCredentials(kUser, kSecret));
[email protected]c2911d72011-10-03 22:16:364411
4412 {
tommycli59a63432015-11-06 00:10:554413 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164414 std::unique_ptr<URLRequest> r(context.CreateRequest(
4415 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194416 r->Start();
[email protected]79e1fd62013-06-20 06:50:044417
[email protected]255620da2013-08-19 13:14:294418 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:044419
maksim.sisovb53724b52016-09-16 05:30:504420 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194421 EXPECT_EQ(200, r->GetResponseCode());
[email protected]79e1fd62013-06-20 06:50:044422 EXPECT_TRUE(d.auth_required_called());
4423 EXPECT_EQ(1, network_delegate.created_requests());
4424 EXPECT_EQ(0, network_delegate.destroyed_requests());
4425 }
4426 EXPECT_EQ(1, network_delegate.destroyed_requests());
4427}
4428
4429TEST_F(URLRequestTestHTTP,
4430 NetworkDelegateOnAuthRequiredSyncNoAction_GetFullRequestHeaders) {
tommycli59a63432015-11-06 00:10:554431 ASSERT_TRUE(http_test_server()->Start());
[email protected]79e1fd62013-06-20 06:50:044432
4433 TestDelegate d;
4434 BlockingNetworkDelegate network_delegate(
4435 BlockingNetworkDelegate::SYNCHRONOUS);
4436
4437 TestURLRequestContext context(true);
4438 context.set_network_delegate(&network_delegate);
4439 context.Init();
4440
4441 d.set_credentials(AuthCredentials(kUser, kSecret));
4442
4443 {
tommycli59a63432015-11-06 00:10:554444 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164445 std::unique_ptr<URLRequest> r(context.CreateRequest(
4446 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194447 r->Start();
[email protected]79e1fd62013-06-20 06:50:044448
shivanisha8061c4202017-06-13 23:35:524449 base::RunLoop().Run();
4450
[email protected]79e1fd62013-06-20 06:50:044451 {
4452 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:194453 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
shivanisha8061c4202017-06-13 23:35:524454 EXPECT_TRUE(headers.HasHeader("Authorization"));
[email protected]79e1fd62013-06-20 06:50:044455 }
4456
maksim.sisovb53724b52016-09-16 05:30:504457 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194458 EXPECT_EQ(200, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364459 EXPECT_TRUE(d.auth_required_called());
4460 EXPECT_EQ(1, network_delegate.created_requests());
4461 EXPECT_EQ(0, network_delegate.destroyed_requests());
4462 }
4463 EXPECT_EQ(1, network_delegate.destroyed_requests());
4464}
4465
4466// Tests that the network delegate can synchronously complete OnAuthRequired
[email protected]1e110eae2013-05-10 22:02:404467// by setting credentials.
[email protected]c2911d72011-10-03 22:16:364468TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncSetAuth) {
tommycli59a63432015-11-06 00:10:554469 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364470
4471 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304472 BlockingNetworkDelegate network_delegate(
4473 BlockingNetworkDelegate::SYNCHRONOUS);
4474 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]c2911d72011-10-03 22:16:364475 network_delegate.set_auth_retval(
4476 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
4477
[email protected]f3cf9802011-10-28 18:44:584478 network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret));
[email protected]c2911d72011-10-03 22:16:364479
[email protected]ef2bf422012-05-11 03:27:094480 TestURLRequestContext context(true);
4481 context.set_network_delegate(&network_delegate);
4482 context.Init();
[email protected]c2911d72011-10-03 22:16:364483
4484 {
tommycli59a63432015-11-06 00:10:554485 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164486 std::unique_ptr<URLRequest> r(context.CreateRequest(
4487 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194488 r->Start();
[email protected]255620da2013-08-19 13:14:294489 base::RunLoop().Run();
[email protected]c2911d72011-10-03 22:16:364490
maksim.sisovb53724b52016-09-16 05:30:504491 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194492 EXPECT_EQ(200, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364493 EXPECT_FALSE(d.auth_required_called());
4494 EXPECT_EQ(1, network_delegate.created_requests());
4495 EXPECT_EQ(0, network_delegate.destroyed_requests());
4496 }
4497 EXPECT_EQ(1, network_delegate.destroyed_requests());
4498}
4499
[email protected]79e1fd62013-06-20 06:50:044500// Same as above, but also tests that GetFullRequestHeaders returns the proper
4501// headers (for the first or second request) when called at the proper times.
4502TEST_F(URLRequestTestHTTP,
4503 NetworkDelegateOnAuthRequiredSyncSetAuth_GetFullRequestHeaders) {
tommycli59a63432015-11-06 00:10:554504 ASSERT_TRUE(http_test_server()->Start());
[email protected]79e1fd62013-06-20 06:50:044505
4506 TestDelegate d;
4507 BlockingNetworkDelegate network_delegate(
4508 BlockingNetworkDelegate::SYNCHRONOUS);
4509 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
4510 network_delegate.set_auth_retval(
4511 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
4512
4513 network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret));
4514
4515 TestURLRequestContext context(true);
4516 context.set_network_delegate(&network_delegate);
4517 context.Init();
4518
4519 {
tommycli59a63432015-11-06 00:10:554520 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164521 std::unique_ptr<URLRequest> r(context.CreateRequest(
4522 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194523 r->Start();
[email protected]255620da2013-08-19 13:14:294524 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:044525
maksim.sisovb53724b52016-09-16 05:30:504526 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194527 EXPECT_EQ(200, r->GetResponseCode());
[email protected]79e1fd62013-06-20 06:50:044528 EXPECT_FALSE(d.auth_required_called());
4529 EXPECT_EQ(1, network_delegate.created_requests());
4530 EXPECT_EQ(0, network_delegate.destroyed_requests());
4531
4532 {
4533 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:194534 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
[email protected]79e1fd62013-06-20 06:50:044535 EXPECT_TRUE(headers.HasHeader("Authorization"));
4536 }
4537 }
4538 EXPECT_EQ(1, network_delegate.destroyed_requests());
4539}
4540
[email protected]c2911d72011-10-03 22:16:364541// Tests that the network delegate can synchronously complete OnAuthRequired
4542// by cancelling authentication.
4543TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncCancel) {
tommycli59a63432015-11-06 00:10:554544 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364545
4546 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304547 BlockingNetworkDelegate network_delegate(
4548 BlockingNetworkDelegate::SYNCHRONOUS);
4549 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]c2911d72011-10-03 22:16:364550 network_delegate.set_auth_retval(
4551 NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH);
4552
[email protected]ef2bf422012-05-11 03:27:094553 TestURLRequestContext context(true);
4554 context.set_network_delegate(&network_delegate);
4555 context.Init();
[email protected]c2911d72011-10-03 22:16:364556
4557 {
tommycli59a63432015-11-06 00:10:554558 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164559 std::unique_ptr<URLRequest> r(context.CreateRequest(
4560 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194561 r->Start();
[email protected]255620da2013-08-19 13:14:294562 base::RunLoop().Run();
[email protected]c2911d72011-10-03 22:16:364563
maksim.sisovb53724b52016-09-16 05:30:504564 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194565 EXPECT_EQ(401, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364566 EXPECT_FALSE(d.auth_required_called());
4567 EXPECT_EQ(1, network_delegate.created_requests());
4568 EXPECT_EQ(0, network_delegate.destroyed_requests());
4569 }
4570 EXPECT_EQ(1, network_delegate.destroyed_requests());
4571}
4572
4573// Tests that the network delegate can asynchronously complete OnAuthRequired
4574// by taking no action. This indicates that the NetworkDelegate does not want
4575// to handle the challenge, and is passing the buck along to the
4576// URLRequest::Delegate.
4577TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncNoAction) {
tommycli59a63432015-11-06 00:10:554578 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364579
4580 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304581 BlockingNetworkDelegate network_delegate(
4582 BlockingNetworkDelegate::AUTO_CALLBACK);
4583 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]c2911d72011-10-03 22:16:364584
[email protected]ef2bf422012-05-11 03:27:094585 TestURLRequestContext context(true);
4586 context.set_network_delegate(&network_delegate);
4587 context.Init();
[email protected]c2911d72011-10-03 22:16:364588
[email protected]f3cf9802011-10-28 18:44:584589 d.set_credentials(AuthCredentials(kUser, kSecret));
[email protected]c2911d72011-10-03 22:16:364590
4591 {
tommycli59a63432015-11-06 00:10:554592 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164593 std::unique_ptr<URLRequest> r(context.CreateRequest(
4594 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194595 r->Start();
[email protected]255620da2013-08-19 13:14:294596 base::RunLoop().Run();
[email protected]c2911d72011-10-03 22:16:364597
maksim.sisovb53724b52016-09-16 05:30:504598 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194599 EXPECT_EQ(200, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364600 EXPECT_TRUE(d.auth_required_called());
4601 EXPECT_EQ(1, network_delegate.created_requests());
4602 EXPECT_EQ(0, network_delegate.destroyed_requests());
4603 }
4604 EXPECT_EQ(1, network_delegate.destroyed_requests());
4605}
4606
4607// Tests that the network delegate can asynchronously complete OnAuthRequired
4608// by setting credentials.
4609TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncSetAuth) {
tommycli59a63432015-11-06 00:10:554610 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364611
4612 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304613 BlockingNetworkDelegate network_delegate(
4614 BlockingNetworkDelegate::AUTO_CALLBACK);
4615 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]c2911d72011-10-03 22:16:364616 network_delegate.set_auth_retval(
[email protected]c2911d72011-10-03 22:16:364617 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
4618
[email protected]f3cf9802011-10-28 18:44:584619 AuthCredentials auth_credentials(kUser, kSecret);
[email protected]c2911d72011-10-03 22:16:364620 network_delegate.set_auth_credentials(auth_credentials);
4621
[email protected]ef2bf422012-05-11 03:27:094622 TestURLRequestContext context(true);
4623 context.set_network_delegate(&network_delegate);
4624 context.Init();
[email protected]c2911d72011-10-03 22:16:364625
4626 {
tommycli59a63432015-11-06 00:10:554627 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164628 std::unique_ptr<URLRequest> r(context.CreateRequest(
4629 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194630 r->Start();
[email protected]255620da2013-08-19 13:14:294631 base::RunLoop().Run();
[email protected]c2911d72011-10-03 22:16:364632
maksim.sisovb53724b52016-09-16 05:30:504633 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194634 EXPECT_EQ(200, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364635 EXPECT_FALSE(d.auth_required_called());
4636 EXPECT_EQ(1, network_delegate.created_requests());
4637 EXPECT_EQ(0, network_delegate.destroyed_requests());
4638 }
4639 EXPECT_EQ(1, network_delegate.destroyed_requests());
4640}
4641
4642// Tests that the network delegate can asynchronously complete OnAuthRequired
4643// by cancelling authentication.
4644TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncCancel) {
tommycli59a63432015-11-06 00:10:554645 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364646
4647 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304648 BlockingNetworkDelegate network_delegate(
4649 BlockingNetworkDelegate::AUTO_CALLBACK);
4650 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]c2911d72011-10-03 22:16:364651 network_delegate.set_auth_retval(
[email protected]c2911d72011-10-03 22:16:364652 NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH);
4653
[email protected]ef2bf422012-05-11 03:27:094654 TestURLRequestContext context(true);
4655 context.set_network_delegate(&network_delegate);
4656 context.Init();
[email protected]c2911d72011-10-03 22:16:364657
4658 {
tommycli59a63432015-11-06 00:10:554659 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164660 std::unique_ptr<URLRequest> r(context.CreateRequest(
4661 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194662 r->Start();
[email protected]255620da2013-08-19 13:14:294663 base::RunLoop().Run();
[email protected]c2911d72011-10-03 22:16:364664
maksim.sisovb53724b52016-09-16 05:30:504665 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194666 EXPECT_EQ(401, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364667 EXPECT_FALSE(d.auth_required_called());
4668 EXPECT_EQ(1, network_delegate.created_requests());
4669 EXPECT_EQ(0, network_delegate.destroyed_requests());
4670 }
4671 EXPECT_EQ(1, network_delegate.destroyed_requests());
4672}
4673
[email protected]9045b8822012-01-13 20:35:354674// Tests that we can handle when a network request was canceled while we were
4675// waiting for the network delegate.
4676// Part 1: Request is cancelled while waiting for OnBeforeURLRequest callback.
4677TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting1) {
tommycli59a63432015-11-06 00:10:554678 ASSERT_TRUE(http_test_server()->Start());
[email protected]9045b8822012-01-13 20:35:354679
4680 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304681 BlockingNetworkDelegate network_delegate(
4682 BlockingNetworkDelegate::USER_CALLBACK);
4683 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
[email protected]9045b8822012-01-13 20:35:354684
[email protected]ef2bf422012-05-11 03:27:094685 TestURLRequestContext context(true);
4686 context.set_network_delegate(&network_delegate);
4687 context.Init();
[email protected]9045b8822012-01-13 20:35:354688
4689 {
rhalavatib7bd7c792017-04-27 05:25:164690 std::unique_ptr<URLRequest> r(
4691 context.CreateRequest(http_test_server()->GetURL("/"), DEFAULT_PRIORITY,
4692 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]9045b8822012-01-13 20:35:354693
[email protected]f7022f32014-08-21 16:32:194694 r->Start();
[email protected]255620da2013-08-19 13:14:294695 base::RunLoop().Run();
[email protected]dc5a5cf2012-09-26 02:49:304696 EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
4697 network_delegate.stage_blocked_for_callback());
[email protected]9045b8822012-01-13 20:35:354698 EXPECT_EQ(0, network_delegate.completed_requests());
4699 // Cancel before callback.
[email protected]f7022f32014-08-21 16:32:194700 r->Cancel();
[email protected]9045b8822012-01-13 20:35:354701 // Ensure that network delegate is notified.
4702 EXPECT_EQ(1, network_delegate.completed_requests());
maksim.sisovb53724b52016-09-16 05:30:504703 EXPECT_EQ(1, network_delegate.canceled_requests());
[email protected]9045b8822012-01-13 20:35:354704 EXPECT_EQ(1, network_delegate.created_requests());
4705 EXPECT_EQ(0, network_delegate.destroyed_requests());
4706 }
4707 EXPECT_EQ(1, network_delegate.destroyed_requests());
4708}
4709
4710// Tests that we can handle when a network request was canceled while we were
4711// waiting for the network delegate.
ryansturm2343cb62016-06-15 01:09:004712// Part 2: Request is cancelled while waiting for OnBeforeStartTransaction
4713// callback.
[email protected]9045b8822012-01-13 20:35:354714TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting2) {
tommycli59a63432015-11-06 00:10:554715 ASSERT_TRUE(http_test_server()->Start());
[email protected]9045b8822012-01-13 20:35:354716
4717 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304718 BlockingNetworkDelegate network_delegate(
4719 BlockingNetworkDelegate::USER_CALLBACK);
4720 network_delegate.set_block_on(
4721 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS);
[email protected]9045b8822012-01-13 20:35:354722
[email protected]ef2bf422012-05-11 03:27:094723 TestURLRequestContext context(true);
4724 context.set_network_delegate(&network_delegate);
4725 context.Init();
[email protected]9045b8822012-01-13 20:35:354726
4727 {
rhalavatib7bd7c792017-04-27 05:25:164728 std::unique_ptr<URLRequest> r(
4729 context.CreateRequest(http_test_server()->GetURL("/"), DEFAULT_PRIORITY,
4730 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]9045b8822012-01-13 20:35:354731
[email protected]f7022f32014-08-21 16:32:194732 r->Start();
[email protected]255620da2013-08-19 13:14:294733 base::RunLoop().Run();
[email protected]dc5a5cf2012-09-26 02:49:304734 EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
4735 network_delegate.stage_blocked_for_callback());
[email protected]9045b8822012-01-13 20:35:354736 EXPECT_EQ(0, network_delegate.completed_requests());
4737 // Cancel before callback.
[email protected]f7022f32014-08-21 16:32:194738 r->Cancel();
[email protected]9045b8822012-01-13 20:35:354739 // Ensure that network delegate is notified.
4740 EXPECT_EQ(1, network_delegate.completed_requests());
maksim.sisovb53724b52016-09-16 05:30:504741 EXPECT_EQ(1, network_delegate.canceled_requests());
[email protected]9045b8822012-01-13 20:35:354742 EXPECT_EQ(1, network_delegate.created_requests());
4743 EXPECT_EQ(0, network_delegate.destroyed_requests());
4744 }
4745 EXPECT_EQ(1, network_delegate.destroyed_requests());
4746}
4747
4748// Tests that we can handle when a network request was canceled while we were
4749// waiting for the network delegate.
4750// Part 3: Request is cancelled while waiting for OnHeadersReceived callback.
4751TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting3) {
tommycli59a63432015-11-06 00:10:554752 ASSERT_TRUE(http_test_server()->Start());
[email protected]9045b8822012-01-13 20:35:354753
4754 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304755 BlockingNetworkDelegate network_delegate(
4756 BlockingNetworkDelegate::USER_CALLBACK);
4757 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
[email protected]9045b8822012-01-13 20:35:354758
[email protected]ef2bf422012-05-11 03:27:094759 TestURLRequestContext context(true);
4760 context.set_network_delegate(&network_delegate);
4761 context.Init();
[email protected]9045b8822012-01-13 20:35:354762
4763 {
rhalavatib7bd7c792017-04-27 05:25:164764 std::unique_ptr<URLRequest> r(
4765 context.CreateRequest(http_test_server()->GetURL("/"), DEFAULT_PRIORITY,
4766 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]9045b8822012-01-13 20:35:354767
[email protected]f7022f32014-08-21 16:32:194768 r->Start();
[email protected]255620da2013-08-19 13:14:294769 base::RunLoop().Run();
[email protected]dc5a5cf2012-09-26 02:49:304770 EXPECT_EQ(BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
4771 network_delegate.stage_blocked_for_callback());
[email protected]9045b8822012-01-13 20:35:354772 EXPECT_EQ(0, network_delegate.completed_requests());
4773 // Cancel before callback.
[email protected]f7022f32014-08-21 16:32:194774 r->Cancel();
[email protected]9045b8822012-01-13 20:35:354775 // Ensure that network delegate is notified.
4776 EXPECT_EQ(1, network_delegate.completed_requests());
maksim.sisovb53724b52016-09-16 05:30:504777 EXPECT_EQ(1, network_delegate.canceled_requests());
[email protected]9045b8822012-01-13 20:35:354778 EXPECT_EQ(1, network_delegate.created_requests());
4779 EXPECT_EQ(0, network_delegate.destroyed_requests());
4780 }
4781 EXPECT_EQ(1, network_delegate.destroyed_requests());
4782}
4783
4784// Tests that we can handle when a network request was canceled while we were
4785// waiting for the network delegate.
4786// Part 4: Request is cancelled while waiting for OnAuthRequired callback.
[email protected]bfe8b302013-02-15 12:16:024787TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting4) {
tommycli59a63432015-11-06 00:10:554788 ASSERT_TRUE(http_test_server()->Start());
[email protected]9045b8822012-01-13 20:35:354789
4790 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304791 BlockingNetworkDelegate network_delegate(
4792 BlockingNetworkDelegate::USER_CALLBACK);
4793 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]9045b8822012-01-13 20:35:354794
[email protected]ef2bf422012-05-11 03:27:094795 TestURLRequestContext context(true);
4796 context.set_network_delegate(&network_delegate);
4797 context.Init();
[email protected]9045b8822012-01-13 20:35:354798
4799 {
danakj8522a25b2016-04-16 00:17:364800 std::unique_ptr<URLRequest> r(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164801 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
4802 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]9045b8822012-01-13 20:35:354803
[email protected]f7022f32014-08-21 16:32:194804 r->Start();
[email protected]255620da2013-08-19 13:14:294805 base::RunLoop().Run();
[email protected]dc5a5cf2012-09-26 02:49:304806 EXPECT_EQ(BlockingNetworkDelegate::ON_AUTH_REQUIRED,
4807 network_delegate.stage_blocked_for_callback());
[email protected]9045b8822012-01-13 20:35:354808 EXPECT_EQ(0, network_delegate.completed_requests());
4809 // Cancel before callback.
[email protected]f7022f32014-08-21 16:32:194810 r->Cancel();
[email protected]9045b8822012-01-13 20:35:354811 // Ensure that network delegate is notified.
4812 EXPECT_EQ(1, network_delegate.completed_requests());
maksim.sisovb53724b52016-09-16 05:30:504813 EXPECT_EQ(1, network_delegate.canceled_requests());
[email protected]9045b8822012-01-13 20:35:354814 EXPECT_EQ(1, network_delegate.created_requests());
4815 EXPECT_EQ(0, network_delegate.destroyed_requests());
4816 }
4817 EXPECT_EQ(1, network_delegate.destroyed_requests());
4818}
4819
tommycli59a63432015-11-06 00:10:554820namespace {
4821
danakj8522a25b2016-04-16 00:17:364822std::unique_ptr<test_server::HttpResponse> HandleServerAuthConnect(
tommycli59a63432015-11-06 00:10:554823 const test_server::HttpRequest& request) {
4824 if (request.headers.find("Host") == request.headers.end() ||
4825 request.headers.at("Host") != "www.server-auth.com" ||
4826 request.method != test_server::METHOD_CONNECT) {
4827 return nullptr;
4828 }
4829
danakj8522a25b2016-04-16 00:17:364830 std::unique_ptr<test_server::BasicHttpResponse> http_response(
tommycli59a63432015-11-06 00:10:554831 new test_server::BasicHttpResponse);
4832 http_response->set_code(HTTP_UNAUTHORIZED);
4833 http_response->AddCustomHeader("WWW-Authenticate",
4834 "Basic realm=\"WallyWorld\"");
dchengc7eeda422015-12-26 03:56:484835 return std::move(http_response);
tommycli59a63432015-11-06 00:10:554836}
4837
4838} // namespace
4839
4840// In this unit test, we're using the EmbeddedTestServer as a proxy server and
[email protected]95409e12010-08-17 20:07:114841// issuing a CONNECT request with the magic host name "www.server-auth.com".
tommycli59a63432015-11-06 00:10:554842// The EmbeddedTestServer will return a 401 response, which we should balk at.
[email protected]b89290212009-08-14 22:37:354843TEST_F(URLRequestTestHTTP, UnexpectedServerAuthTest) {
tommycli59a63432015-11-06 00:10:554844 http_test_server()->RegisterRequestHandler(
4845 base::Bind(&HandleServerAuthConnect));
4846 ASSERT_TRUE(http_test_server()->Start());
[email protected]95409e12010-08-17 20:07:114847
[email protected]ceefd7fd2012-11-29 00:36:244848 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]d5a4dd62012-05-23 01:41:044849 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554850 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]87a09a92011-07-14 15:50:504851
[email protected]dc651782009-02-14 01:45:084852 TestDelegate d;
4853 {
danakj8522a25b2016-04-16 00:17:364854 std::unique_ptr<URLRequest> r(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164855 GURL("https://www.server-auth.com/"), DEFAULT_PRIORITY, &d,
4856 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]dc651782009-02-14 01:45:084857
[email protected]f7022f32014-08-21 16:32:194858 r->Start();
4859 EXPECT_TRUE(r->is_pending());
[email protected]dc651782009-02-14 01:45:084860
[email protected]255620da2013-08-19 13:14:294861 base::RunLoop().Run();
[email protected]dc651782009-02-14 01:45:084862
[email protected]d8fc4722014-06-13 13:17:154863 // The proxy server is not set before failure.
tbansal2ecbbc72016-10-06 17:15:474864 EXPECT_FALSE(r->proxy_server().is_valid());
maksim.sisovb53724b52016-09-16 05:30:504865 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status());
[email protected]dc651782009-02-14 01:45:084866 }
4867}
4868
[email protected]b89290212009-08-14 22:37:354869TEST_F(URLRequestTestHTTP, GetTest_NoCache) {
tommycli59a63432015-11-06 00:10:554870 ASSERT_TRUE(http_test_server()->Start());
[email protected]95409e12010-08-17 20:07:114871
initial.commit586acc5fe2008-07-26 22:42:524872 TestDelegate d;
4873 {
danakj8522a25b2016-04-16 00:17:364874 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164875 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
4876 TRAFFIC_ANNOTATION_FOR_TESTS));
initial.commit586acc5fe2008-07-26 22:42:524877
[email protected]f7022f32014-08-21 16:32:194878 r->Start();
4879 EXPECT_TRUE(r->is_pending());
initial.commit586acc5fe2008-07-26 22:42:524880
[email protected]255620da2013-08-19 13:14:294881 base::RunLoop().Run();
initial.commit586acc5fe2008-07-26 22:42:524882
4883 EXPECT_EQ(1, d.response_started_count());
4884 EXPECT_FALSE(d.received_data_before_response());
4885 EXPECT_NE(0, d.bytes_received());
tommycli59a63432015-11-06 00:10:554886 EXPECT_EQ(http_test_server()->host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:194887 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:554888 EXPECT_EQ(http_test_server()->host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:194889 r->GetSocketAddress().port());
[email protected]c31a54592009-09-04 02:36:164890
[email protected]9e743cd2010-03-16 07:03:534891 // TODO(eroman): Add back the NetLog tests...
initial.commit586acc5fe2008-07-26 22:42:524892 }
initial.commit586acc5fe2008-07-26 22:42:524893}
4894
[email protected]263163f2012-06-14 22:40:344895// This test has the server send a large number of cookies to the client.
4896// To ensure that no number of cookies causes a crash, a galloping binary
4897// search is used to estimate that maximum number of cookies that are accepted
4898// by the browser. Beyond the maximum number, the request will fail with
4899// ERR_RESPONSE_HEADERS_TOO_BIG.
Sergey Ulanov0fb900c2017-09-20 00:27:314900#if defined(OS_WIN) || defined(OS_FUCHSIA)
[email protected]69dd6fe2013-02-23 23:15:304901// http://crbug.com/177916
4902#define MAYBE_GetTest_ManyCookies DISABLED_GetTest_ManyCookies
4903#else
4904#define MAYBE_GetTest_ManyCookies GetTest_ManyCookies
4905#endif // defined(OS_WIN)
4906TEST_F(URLRequestTestHTTP, MAYBE_GetTest_ManyCookies) {
tommycli59a63432015-11-06 00:10:554907 ASSERT_TRUE(http_test_server()->Start());
[email protected]263163f2012-06-14 22:40:344908
4909 int lower_bound = 0;
4910 int upper_bound = 1;
4911
4912 // Double the number of cookies until the response header limits are
4913 // exceeded.
4914 while (DoManyCookiesRequest(upper_bound)) {
4915 lower_bound = upper_bound;
4916 upper_bound *= 2;
4917 ASSERT_LT(upper_bound, 1000000);
4918 }
4919
pkasting6b68a162014-12-01 22:10:294920 int tolerance = static_cast<int>(upper_bound * 0.005);
[email protected]263163f2012-06-14 22:40:344921 if (tolerance < 2)
4922 tolerance = 2;
4923
4924 // Perform a binary search to find the highest possible number of cookies,
4925 // within the desired tolerance.
4926 while (upper_bound - lower_bound >= tolerance) {
4927 int num_cookies = (lower_bound + upper_bound) / 2;
4928
4929 if (DoManyCookiesRequest(num_cookies))
4930 lower_bound = num_cookies;
4931 else
4932 upper_bound = num_cookies;
4933 }
4934 // Success: the test did not crash.
4935}
4936
[email protected]b89290212009-08-14 22:37:354937TEST_F(URLRequestTestHTTP, GetTest) {
tommycli59a63432015-11-06 00:10:554938 ASSERT_TRUE(http_test_server()->Start());
[email protected]95409e12010-08-17 20:07:114939
initial.commit586acc5fe2008-07-26 22:42:524940 TestDelegate d;
4941 {
danakj8522a25b2016-04-16 00:17:364942 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164943 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
4944 TRAFFIC_ANNOTATION_FOR_TESTS));
initial.commit586acc5fe2008-07-26 22:42:524945
[email protected]f7022f32014-08-21 16:32:194946 r->Start();
4947 EXPECT_TRUE(r->is_pending());
initial.commit586acc5fe2008-07-26 22:42:524948
[email protected]255620da2013-08-19 13:14:294949 base::RunLoop().Run();
initial.commit586acc5fe2008-07-26 22:42:524950
4951 EXPECT_EQ(1, d.response_started_count());
4952 EXPECT_FALSE(d.received_data_before_response());
4953 EXPECT_NE(0, d.bytes_received());
tommycli59a63432015-11-06 00:10:554954 EXPECT_EQ(http_test_server()->host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:194955 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:554956 EXPECT_EQ(http_test_server()->host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:194957 r->GetSocketAddress().port());
initial.commit586acc5fe2008-07-26 22:42:524958 }
[email protected]5d7b373e2009-09-02 07:19:034959}
4960
[email protected]79e1fd62013-06-20 06:50:044961TEST_F(URLRequestTestHTTP, GetTest_GetFullRequestHeaders) {
tommycli59a63432015-11-06 00:10:554962 ASSERT_TRUE(http_test_server()->Start());
[email protected]79e1fd62013-06-20 06:50:044963
4964 TestDelegate d;
4965 {
tommycli59a63432015-11-06 00:10:554966 GURL test_url(http_test_server()->GetURL("/defaultresponse"));
rhalavatib7bd7c792017-04-27 05:25:164967 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
4968 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]79e1fd62013-06-20 06:50:044969
4970 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:194971 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]79e1fd62013-06-20 06:50:044972
[email protected]f7022f32014-08-21 16:32:194973 r->Start();
4974 EXPECT_TRUE(r->is_pending());
[email protected]79e1fd62013-06-20 06:50:044975
[email protected]255620da2013-08-19 13:14:294976 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:044977
4978 EXPECT_EQ(1, d.response_started_count());
4979 EXPECT_FALSE(d.received_data_before_response());
4980 EXPECT_NE(0, d.bytes_received());
tommycli59a63432015-11-06 00:10:554981 EXPECT_EQ(http_test_server()->host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:194982 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:554983 EXPECT_EQ(http_test_server()->host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:194984 r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:044985
4986 EXPECT_TRUE(d.have_full_request_headers());
4987 CheckFullRequestHeaders(d.full_request_headers(), test_url);
4988 }
4989}
4990
[email protected]58e32bb2013-01-21 18:23:254991TEST_F(URLRequestTestHTTP, GetTestLoadTiming) {
tommycli59a63432015-11-06 00:10:554992 ASSERT_TRUE(http_test_server()->Start());
[email protected]58e32bb2013-01-21 18:23:254993
4994 TestDelegate d;
4995 {
danakj8522a25b2016-04-16 00:17:364996 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164997 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
4998 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]58e32bb2013-01-21 18:23:254999
[email protected]f7022f32014-08-21 16:32:195000 r->Start();
5001 EXPECT_TRUE(r->is_pending());
[email protected]58e32bb2013-01-21 18:23:255002
[email protected]255620da2013-08-19 13:14:295003 base::RunLoop().Run();
[email protected]58e32bb2013-01-21 18:23:255004
5005 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:195006 r->GetLoadTimingInfo(&load_timing_info);
[email protected]58e32bb2013-01-21 18:23:255007 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
5008
5009 EXPECT_EQ(1, d.response_started_count());
5010 EXPECT_FALSE(d.received_data_before_response());
5011 EXPECT_NE(0, d.bytes_received());
tommycli59a63432015-11-06 00:10:555012 EXPECT_EQ(http_test_server()->host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:195013 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:555014 EXPECT_EQ(http_test_server()->host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:195015 r->GetSocketAddress().port());
[email protected]58e32bb2013-01-21 18:23:255016 }
5017}
5018
tommycli59a63432015-11-06 00:10:555019// TODO(svaldez): Update tests to use EmbeddedTestServer.
5020#if !defined(OS_IOS)
[email protected]aad63572011-05-24 20:14:395021TEST_F(URLRequestTestHTTP, GetZippedTest) {
tommycli59a63432015-11-06 00:10:555022 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
tommycli59a63432015-11-06 00:10:555023 base::FilePath(kTestFilePath));
5024
5025 ASSERT_TRUE(test_server.Start());
[email protected]aad63572011-05-24 20:14:395026
5027 // Parameter that specifies the Content-Length field in the response:
5028 // C - Compressed length.
5029 // U - Uncompressed length.
5030 // L - Large length (larger than both C & U).
5031 // M - Medium length (between C & U).
5032 // S - Small length (smaller than both C & U).
5033 const char test_parameters[] = "CULMS";
5034 const int num_tests = arraysize(test_parameters)- 1; // Skip NULL.
5035 // C & U should be OK.
[email protected]f0e2bf42011-07-22 21:21:445036 // L & M are larger than the data sent, and show an error.
[email protected]aad63572011-05-24 20:14:395037 // S has too little data, but we seem to accept it.
5038 const bool test_expect_success[num_tests] =
[email protected]f001bd6a2011-12-08 04:31:375039 { true, true, false, false, true };
[email protected]aad63572011-05-24 20:14:395040
xunjielifb4da222016-07-14 18:38:595041 base::FilePath file_path;
5042 PathService::Get(base::DIR_SOURCE_ROOT, &file_path);
5043 file_path = file_path.Append(kTestFilePath);
5044 file_path = file_path.Append(FILE_PATH_LITERAL("BullRunSpeech.txt"));
5045 std::string expected_content;
5046 ASSERT_TRUE(base::ReadFileToString(file_path, &expected_content));
5047
5048 for (int i = 0; i < num_tests; i++) {
[email protected]aad63572011-05-24 20:14:395049 TestDelegate d;
5050 {
tommycli59a63432015-11-06 00:10:555051 std::string test_file = base::StringPrintf(
5052 "compressedfiles/BullRunSpeech.txt?%c", test_parameters[i]);
[email protected]aad63572011-05-24 20:14:395053
[email protected]ceefd7fd2012-11-29 00:36:245054 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]ef2bf422012-05-11 03:27:095055 TestURLRequestContext context(true);
5056 context.set_network_delegate(&network_delegate);
5057 context.Init();
[email protected]87a09a92011-07-14 15:50:505058
rhalavatib7bd7c792017-04-27 05:25:165059 std::unique_ptr<URLRequest> r(
5060 context.CreateRequest(test_server.GetURL(test_file), DEFAULT_PRIORITY,
5061 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195062 r->Start();
5063 EXPECT_TRUE(r->is_pending());
[email protected]aad63572011-05-24 20:14:395064
[email protected]255620da2013-08-19 13:14:295065 base::RunLoop().Run();
[email protected]aad63572011-05-24 20:14:395066
5067 EXPECT_EQ(1, d.response_started_count());
5068 EXPECT_FALSE(d.received_data_before_response());
5069 VLOG(1) << " Received " << d.bytes_received() << " bytes"
maksim.sisovb53724b52016-09-16 05:30:505070 << " error = " << d.request_status();
[email protected]aad63572011-05-24 20:14:395071 if (test_expect_success[i]) {
maksim.sisovb53724b52016-09-16 05:30:505072 EXPECT_EQ(OK, d.request_status()) << " Parameter = \"" << test_file
5073 << "\"";
xunjielifb4da222016-07-14 18:38:595074 if (test_parameters[i] == 'S') {
5075 // When content length is smaller than both compressed length and
5076 // uncompressed length, HttpStreamParser might not read the full
5077 // response body.
5078 continue;
5079 }
5080 EXPECT_EQ(expected_content, d.data_received());
[email protected]aad63572011-05-24 20:14:395081 } else {
maksim.sisovb53724b52016-09-16 05:30:505082 EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, d.request_status())
[email protected]aad63572011-05-24 20:14:395083 << " Parameter = \"" << test_file << "\"";
5084 }
5085 }
5086 }
5087}
tommycli59a63432015-11-06 00:10:555088#endif // !defined(OS_IOS)
[email protected]aad63572011-05-24 20:14:395089
[email protected]58e32bb2013-01-21 18:23:255090TEST_F(URLRequestTestHTTP, RedirectLoadTiming) {
tommycli59a63432015-11-06 00:10:555091 ASSERT_TRUE(http_test_server()->Start());
[email protected]58e32bb2013-01-21 18:23:255092
tommycli59a63432015-11-06 00:10:555093 GURL destination_url = http_test_server()->GetURL("/");
[email protected]007b3f82013-04-09 08:46:455094 GURL original_url =
tommycli59a63432015-11-06 00:10:555095 http_test_server()->GetURL("/server-redirect?" + destination_url.spec());
[email protected]58e32bb2013-01-21 18:23:255096 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:165097 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
5098 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195099 req->Start();
[email protected]255620da2013-08-19 13:14:295100 base::RunLoop().Run();
[email protected]58e32bb2013-01-21 18:23:255101
5102 EXPECT_EQ(1, d.response_started_count());
5103 EXPECT_EQ(1, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:195104 EXPECT_EQ(destination_url, req->url());
5105 EXPECT_EQ(original_url, req->original_url());
5106 ASSERT_EQ(2U, req->url_chain().size());
5107 EXPECT_EQ(original_url, req->url_chain()[0]);
5108 EXPECT_EQ(destination_url, req->url_chain()[1]);
[email protected]58e32bb2013-01-21 18:23:255109
5110 LoadTimingInfo load_timing_info_before_redirect;
5111 EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeRedirect(
5112 &load_timing_info_before_redirect));
5113 TestLoadTimingNotReused(load_timing_info_before_redirect,
5114 CONNECT_TIMING_HAS_DNS_TIMES);
5115
5116 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:195117 req->GetLoadTimingInfo(&load_timing_info);
[email protected]58e32bb2013-01-21 18:23:255118 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
5119
5120 // Check that a new socket was used on redirect, since the server does not
5121 // supposed keep-alive sockets, and that the times before the redirect are
5122 // before the ones recorded for the second request.
5123 EXPECT_NE(load_timing_info_before_redirect.socket_log_id,
5124 load_timing_info.socket_log_id);
5125 EXPECT_LE(load_timing_info_before_redirect.receive_headers_end,
5126 load_timing_info.connect_timing.connect_start);
5127}
5128
[email protected]8f1ac082011-04-19 21:14:135129TEST_F(URLRequestTestHTTP, MultipleRedirectTest) {
tommycli59a63432015-11-06 00:10:555130 ASSERT_TRUE(http_test_server()->Start());
[email protected]8f1ac082011-04-19 21:14:135131
tommycli59a63432015-11-06 00:10:555132 GURL destination_url = http_test_server()->GetURL("/");
[email protected]007b3f82013-04-09 08:46:455133 GURL middle_redirect_url =
tommycli59a63432015-11-06 00:10:555134 http_test_server()->GetURL("/server-redirect?" + destination_url.spec());
5135 GURL original_url = http_test_server()->GetURL("/server-redirect?" +
5136 middle_redirect_url.spec());
[email protected]8f1ac082011-04-19 21:14:135137 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:165138 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
5139 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195140 req->Start();
[email protected]255620da2013-08-19 13:14:295141 base::RunLoop().Run();
[email protected]8f1ac082011-04-19 21:14:135142
5143 EXPECT_EQ(1, d.response_started_count());
5144 EXPECT_EQ(2, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:195145 EXPECT_EQ(destination_url, req->url());
5146 EXPECT_EQ(original_url, req->original_url());
5147 ASSERT_EQ(3U, req->url_chain().size());
5148 EXPECT_EQ(original_url, req->url_chain()[0]);
5149 EXPECT_EQ(middle_redirect_url, req->url_chain()[1]);
5150 EXPECT_EQ(destination_url, req->url_chain()[2]);
[email protected]8f1ac082011-04-19 21:14:135151}
5152
[email protected]abe1c4a2013-10-25 19:28:515153// First and second pieces of information logged by delegates to URLRequests.
5154const char kFirstDelegateInfo[] = "Wonderful delegate";
5155const char kSecondDelegateInfo[] = "Exciting delegate";
5156
5157// Logs delegate information to a URLRequest. The first string is logged
5158// synchronously on Start(), using DELEGATE_INFO_DEBUG_ONLY. The second is
5159// logged asynchronously, using DELEGATE_INFO_DISPLAY_TO_USER. Then
5160// another asynchronous call is used to clear the delegate information
5161// before calling a callback. The object then deletes itself.
5162class AsyncDelegateLogger : public base::RefCounted<AsyncDelegateLogger> {
5163 public:
5164 typedef base::Callback<void()> Callback;
5165
5166 // Each time delegate information is added to the URLRequest, the resulting
5167 // load state is checked. The expected load state after each request is
5168 // passed in as an argument.
5169 static void Run(URLRequest* url_request,
5170 LoadState expected_first_load_state,
5171 LoadState expected_second_load_state,
5172 LoadState expected_third_load_state,
5173 const Callback& callback) {
5174 AsyncDelegateLogger* logger = new AsyncDelegateLogger(
5175 url_request,
5176 expected_first_load_state,
5177 expected_second_load_state,
5178 expected_third_load_state,
5179 callback);
5180 logger->Start();
5181 }
5182
5183 // Checks that the log entries, starting with log_position, contain the
5184 // DELEGATE_INFO NetLog events that an AsyncDelegateLogger should have
5185 // recorded. Returns the index of entry after the expected number of
5186 // events this logged, or entries.size() if there aren't enough entries.
mmenke43758e62015-05-04 21:09:465187 static size_t CheckDelegateInfo(const TestNetLogEntry::List& entries,
vishal.b62985ca92015-04-17 08:45:515188 size_t log_position) {
[email protected]abe1c4a2013-10-25 19:28:515189 // There should be 4 DELEGATE_INFO events: Two begins and two ends.
5190 if (log_position + 3 >= entries.size()) {
5191 ADD_FAILURE() << "Not enough log entries";
5192 return entries.size();
5193 }
5194 std::string delegate_info;
mikecirone8b85c432016-09-08 19:11:005195 EXPECT_EQ(NetLogEventType::DELEGATE_INFO, entries[log_position].type);
5196 EXPECT_EQ(NetLogEventPhase::BEGIN, entries[log_position].phase);
rdsmith37a0dde2017-01-04 00:12:075197 EXPECT_TRUE(entries[log_position].GetStringValue("delegate_blocked_by",
[email protected]abe1c4a2013-10-25 19:28:515198 &delegate_info));
5199 EXPECT_EQ(kFirstDelegateInfo, delegate_info);
5200
5201 ++log_position;
mikecirone8b85c432016-09-08 19:11:005202 EXPECT_EQ(NetLogEventType::DELEGATE_INFO, entries[log_position].type);
5203 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515204
5205 ++log_position;
mikecirone8b85c432016-09-08 19:11:005206 EXPECT_EQ(NetLogEventType::DELEGATE_INFO, entries[log_position].type);
5207 EXPECT_EQ(NetLogEventPhase::BEGIN, entries[log_position].phase);
rdsmith37a0dde2017-01-04 00:12:075208 EXPECT_TRUE(entries[log_position].GetStringValue("delegate_blocked_by",
[email protected]abe1c4a2013-10-25 19:28:515209 &delegate_info));
5210 EXPECT_EQ(kSecondDelegateInfo, delegate_info);
5211
5212 ++log_position;
mikecirone8b85c432016-09-08 19:11:005213 EXPECT_EQ(NetLogEventType::DELEGATE_INFO, entries[log_position].type);
5214 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515215
5216 return log_position + 1;
5217 }
5218
5219 private:
5220 friend class base::RefCounted<AsyncDelegateLogger>;
5221
5222 AsyncDelegateLogger(URLRequest* url_request,
5223 LoadState expected_first_load_state,
5224 LoadState expected_second_load_state,
5225 LoadState expected_third_load_state,
5226 const Callback& callback)
5227 : url_request_(url_request),
5228 expected_first_load_state_(expected_first_load_state),
5229 expected_second_load_state_(expected_second_load_state),
5230 expected_third_load_state_(expected_third_load_state),
5231 callback_(callback) {
5232 }
5233
5234 ~AsyncDelegateLogger() {}
5235
5236 void Start() {
[email protected]f8fe5cf2013-12-04 20:11:535237 url_request_->LogBlockedBy(kFirstDelegateInfo);
[email protected]abe1c4a2013-10-25 19:28:515238 LoadStateWithParam load_state = url_request_->GetLoadState();
5239 EXPECT_EQ(expected_first_load_state_, load_state.state);
5240 EXPECT_NE(ASCIIToUTF16(kFirstDelegateInfo), load_state.param);
skyostil4891b25b2015-06-11 11:43:455241 base::ThreadTaskRunnerHandle::Get()->PostTask(
5242 FROM_HERE, base::Bind(&AsyncDelegateLogger::LogSecondDelegate, this));
[email protected]abe1c4a2013-10-25 19:28:515243 }
5244
5245 void LogSecondDelegate() {
[email protected]f8fe5cf2013-12-04 20:11:535246 url_request_->LogAndReportBlockedBy(kSecondDelegateInfo);
[email protected]abe1c4a2013-10-25 19:28:515247 LoadStateWithParam load_state = url_request_->GetLoadState();
5248 EXPECT_EQ(expected_second_load_state_, load_state.state);
5249 if (expected_second_load_state_ == LOAD_STATE_WAITING_FOR_DELEGATE) {
5250 EXPECT_EQ(ASCIIToUTF16(kSecondDelegateInfo), load_state.param);
5251 } else {
5252 EXPECT_NE(ASCIIToUTF16(kSecondDelegateInfo), load_state.param);
5253 }
skyostil4891b25b2015-06-11 11:43:455254 base::ThreadTaskRunnerHandle::Get()->PostTask(
5255 FROM_HERE, base::Bind(&AsyncDelegateLogger::LogComplete, this));
[email protected]abe1c4a2013-10-25 19:28:515256 }
5257
5258 void LogComplete() {
[email protected]f8fe5cf2013-12-04 20:11:535259 url_request_->LogUnblocked();
[email protected]abe1c4a2013-10-25 19:28:515260 LoadStateWithParam load_state = url_request_->GetLoadState();
5261 EXPECT_EQ(expected_third_load_state_, load_state.state);
5262 if (expected_second_load_state_ == LOAD_STATE_WAITING_FOR_DELEGATE)
[email protected]754bd202013-12-18 08:29:085263 EXPECT_EQ(base::string16(), load_state.param);
[email protected]abe1c4a2013-10-25 19:28:515264 callback_.Run();
5265 }
5266
5267 URLRequest* url_request_;
5268 const int expected_first_load_state_;
5269 const int expected_second_load_state_;
5270 const int expected_third_load_state_;
5271 const Callback callback_;
5272
5273 DISALLOW_COPY_AND_ASSIGN(AsyncDelegateLogger);
5274};
5275
5276// NetworkDelegate that logs delegate information before a request is started,
5277// before headers are sent, when headers are read, and when auth information
5278// is requested. Uses AsyncDelegateLogger.
5279class AsyncLoggingNetworkDelegate : public TestNetworkDelegate {
5280 public:
5281 AsyncLoggingNetworkDelegate() {}
dchengb03027d2014-10-21 12:00:205282 ~AsyncLoggingNetworkDelegate() override {}
[email protected]abe1c4a2013-10-25 19:28:515283
5284 // NetworkDelegate implementation.
dchengb03027d2014-10-21 12:00:205285 int OnBeforeURLRequest(URLRequest* request,
5286 const CompletionCallback& callback,
5287 GURL* new_url) override {
[email protected]abe1c4a2013-10-25 19:28:515288 TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url);
5289 return RunCallbackAsynchronously(request, callback);
5290 }
5291
ryansturm2343cb62016-06-15 01:09:005292 int OnBeforeStartTransaction(URLRequest* request,
5293 const CompletionCallback& callback,
5294 HttpRequestHeaders* headers) override {
5295 TestNetworkDelegate::OnBeforeStartTransaction(request, callback, headers);
[email protected]abe1c4a2013-10-25 19:28:515296 return RunCallbackAsynchronously(request, callback);
5297 }
5298
dchengb03027d2014-10-21 12:00:205299 int OnHeadersReceived(
[email protected]abe1c4a2013-10-25 19:28:515300 URLRequest* request,
5301 const CompletionCallback& callback,
5302 const HttpResponseHeaders* original_response_headers,
[email protected]5f714132014-03-26 10:41:165303 scoped_refptr<HttpResponseHeaders>* override_response_headers,
mostynbba063d6032014-10-09 11:01:135304 GURL* allowed_unsafe_redirect_url) override {
[email protected]5f714132014-03-26 10:41:165305 TestNetworkDelegate::OnHeadersReceived(request,
5306 callback,
[email protected]abe1c4a2013-10-25 19:28:515307 original_response_headers,
[email protected]5f714132014-03-26 10:41:165308 override_response_headers,
5309 allowed_unsafe_redirect_url);
[email protected]abe1c4a2013-10-25 19:28:515310 return RunCallbackAsynchronously(request, callback);
5311 }
5312
dchengb03027d2014-10-21 12:00:205313 NetworkDelegate::AuthRequiredResponse OnAuthRequired(
[email protected]abe1c4a2013-10-25 19:28:515314 URLRequest* request,
5315 const AuthChallengeInfo& auth_info,
5316 const AuthCallback& callback,
mostynbba063d6032014-10-09 11:01:135317 AuthCredentials* credentials) override {
[email protected]abe1c4a2013-10-25 19:28:515318 AsyncDelegateLogger::Run(
5319 request,
5320 LOAD_STATE_WAITING_FOR_DELEGATE,
5321 LOAD_STATE_WAITING_FOR_DELEGATE,
5322 LOAD_STATE_WAITING_FOR_DELEGATE,
5323 base::Bind(&AsyncLoggingNetworkDelegate::SetAuthAndResume,
5324 callback, credentials));
5325 return AUTH_REQUIRED_RESPONSE_IO_PENDING;
5326 }
5327
5328 private:
5329 static int RunCallbackAsynchronously(
5330 URLRequest* request,
5331 const CompletionCallback& callback) {
5332 AsyncDelegateLogger::Run(
5333 request,
5334 LOAD_STATE_WAITING_FOR_DELEGATE,
5335 LOAD_STATE_WAITING_FOR_DELEGATE,
5336 LOAD_STATE_WAITING_FOR_DELEGATE,
5337 base::Bind(callback, OK));
5338 return ERR_IO_PENDING;
5339 }
5340
5341 static void SetAuthAndResume(const AuthCallback& callback,
5342 AuthCredentials* credentials) {
5343 *credentials = AuthCredentials(kUser, kSecret);
5344 callback.Run(NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
5345 }
5346
5347 DISALLOW_COPY_AND_ASSIGN(AsyncLoggingNetworkDelegate);
5348};
5349
5350// URLRequest::Delegate that logs delegate information when the headers
5351// are received, when each read completes, and during redirects. Uses
5352// AsyncDelegateLogger. Can optionally cancel a request in any phase.
5353//
5354// Inherits from TestDelegate to reuse the TestDelegate code to handle
5355// advancing to the next step in most cases, as well as cancellation.
5356class AsyncLoggingUrlRequestDelegate : public TestDelegate {
5357 public:
5358 enum CancelStage {
5359 NO_CANCEL = 0,
5360 CANCEL_ON_RECEIVED_REDIRECT,
5361 CANCEL_ON_RESPONSE_STARTED,
5362 CANCEL_ON_READ_COMPLETED
5363 };
5364
5365 explicit AsyncLoggingUrlRequestDelegate(CancelStage cancel_stage)
5366 : cancel_stage_(cancel_stage) {
5367 if (cancel_stage == CANCEL_ON_RECEIVED_REDIRECT)
5368 set_cancel_in_received_redirect(true);
5369 else if (cancel_stage == CANCEL_ON_RESPONSE_STARTED)
5370 set_cancel_in_response_started(true);
5371 else if (cancel_stage == CANCEL_ON_READ_COMPLETED)
5372 set_cancel_in_received_data(true);
5373 }
dchengb03027d2014-10-21 12:00:205374 ~AsyncLoggingUrlRequestDelegate() override {}
[email protected]abe1c4a2013-10-25 19:28:515375
5376 // URLRequest::Delegate implementation:
dchengb03027d2014-10-21 12:00:205377 void OnReceivedRedirect(URLRequest* request,
5378 const RedirectInfo& redirect_info,
5379 bool* defer_redirect) override {
[email protected]abe1c4a2013-10-25 19:28:515380 *defer_redirect = true;
5381 AsyncDelegateLogger::Run(
5382 request,
5383 LOAD_STATE_WAITING_FOR_DELEGATE,
5384 LOAD_STATE_WAITING_FOR_DELEGATE,
5385 LOAD_STATE_WAITING_FOR_DELEGATE,
5386 base::Bind(
5387 &AsyncLoggingUrlRequestDelegate::OnReceivedRedirectLoggingComplete,
[email protected]cba24642014-08-15 20:49:595388 base::Unretained(this), request, redirect_info));
[email protected]abe1c4a2013-10-25 19:28:515389 }
5390
maksim.sisov0f4aa142016-09-05 05:55:285391 void OnResponseStarted(URLRequest* request, int net_error) override {
[email protected]abe1c4a2013-10-25 19:28:515392 AsyncDelegateLogger::Run(
maksim.sisov0f4aa142016-09-05 05:55:285393 request, LOAD_STATE_WAITING_FOR_DELEGATE,
5394 LOAD_STATE_WAITING_FOR_DELEGATE, LOAD_STATE_WAITING_FOR_DELEGATE,
5395 base::Bind(
5396 &AsyncLoggingUrlRequestDelegate::OnResponseStartedLoggingComplete,
5397 base::Unretained(this), request, net_error));
[email protected]abe1c4a2013-10-25 19:28:515398 }
5399
dchengb03027d2014-10-21 12:00:205400 void OnReadCompleted(URLRequest* request, int bytes_read) override {
[email protected]abe1c4a2013-10-25 19:28:515401 AsyncDelegateLogger::Run(
5402 request,
5403 LOAD_STATE_IDLE,
5404 LOAD_STATE_IDLE,
5405 LOAD_STATE_IDLE,
5406 base::Bind(
5407 &AsyncLoggingUrlRequestDelegate::AfterReadCompletedLoggingComplete,
5408 base::Unretained(this), request, bytes_read));
5409 }
5410
5411 private:
5412 void OnReceivedRedirectLoggingComplete(URLRequest* request,
[email protected]cba24642014-08-15 20:49:595413 const RedirectInfo& redirect_info) {
[email protected]abe1c4a2013-10-25 19:28:515414 bool defer_redirect = false;
[email protected]cba24642014-08-15 20:49:595415 TestDelegate::OnReceivedRedirect(request, redirect_info, &defer_redirect);
[email protected]abe1c4a2013-10-25 19:28:515416 // FollowDeferredRedirect should not be called after cancellation.
5417 if (cancel_stage_ == CANCEL_ON_RECEIVED_REDIRECT)
5418 return;
5419 if (!defer_redirect)
5420 request->FollowDeferredRedirect();
5421 }
5422
maksim.sisov0f4aa142016-09-05 05:55:285423 void OnResponseStartedLoggingComplete(URLRequest* request, int net_error) {
[email protected]abe1c4a2013-10-25 19:28:515424 // The parent class continues the request.
maksim.sisov0f4aa142016-09-05 05:55:285425 TestDelegate::OnResponseStarted(request, net_error);
[email protected]abe1c4a2013-10-25 19:28:515426 }
5427
5428 void AfterReadCompletedLoggingComplete(URLRequest* request, int bytes_read) {
5429 // The parent class continues the request.
5430 TestDelegate::OnReadCompleted(request, bytes_read);
5431 }
5432
5433 const CancelStage cancel_stage_;
5434
5435 DISALLOW_COPY_AND_ASSIGN(AsyncLoggingUrlRequestDelegate);
5436};
5437
5438// Tests handling of delegate info before a request starts.
5439TEST_F(URLRequestTestHTTP, DelegateInfoBeforeStart) {
tommycli59a63432015-11-06 00:10:555440 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515441
5442 TestDelegate request_delegate;
5443 TestURLRequestContext context(true);
5444 context.set_network_delegate(NULL);
5445 context.set_net_log(&net_log_);
5446 context.Init();
5447
5448 {
rhalavatib7bd7c792017-04-27 05:25:165449 std::unique_ptr<URLRequest> r(context.CreateRequest(
5450 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY,
5451 &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195452 LoadStateWithParam load_state = r->GetLoadState();
[email protected]abe1c4a2013-10-25 19:28:515453 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state);
[email protected]754bd202013-12-18 08:29:085454 EXPECT_EQ(base::string16(), load_state.param);
[email protected]abe1c4a2013-10-25 19:28:515455
5456 AsyncDelegateLogger::Run(
[email protected]f7022f32014-08-21 16:32:195457 r.get(),
[email protected]abe1c4a2013-10-25 19:28:515458 LOAD_STATE_WAITING_FOR_DELEGATE,
5459 LOAD_STATE_WAITING_FOR_DELEGATE,
5460 LOAD_STATE_IDLE,
[email protected]f7022f32014-08-21 16:32:195461 base::Bind(&URLRequest::Start, base::Unretained(r.get())));
[email protected]abe1c4a2013-10-25 19:28:515462
5463 base::RunLoop().Run();
5464
[email protected]f7022f32014-08-21 16:32:195465 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505466 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515467 }
5468
mmenke43758e62015-05-04 21:09:465469 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515470 net_log_.GetEntries(&entries);
5471 size_t log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005472 entries, 0, NetLogEventType::DELEGATE_INFO, NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515473
5474 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, log_position);
5475
5476 // Nothing else should add any delegate info to the request.
mikecirone8b85c432016-09-08 19:11:005477 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5478 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515479}
5480
5481// Tests handling of delegate info from a network delegate.
5482TEST_F(URLRequestTestHTTP, NetworkDelegateInfo) {
tommycli59a63432015-11-06 00:10:555483 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515484
5485 TestDelegate request_delegate;
5486 AsyncLoggingNetworkDelegate network_delegate;
5487 TestURLRequestContext context(true);
5488 context.set_network_delegate(&network_delegate);
5489 context.set_net_log(&net_log_);
5490 context.Init();
5491
5492 {
rhalavatib7bd7c792017-04-27 05:25:165493 std::unique_ptr<URLRequest> r(context.CreateRequest(
5494 http_test_server()->GetURL("/simple.html"), DEFAULT_PRIORITY,
5495 &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195496 LoadStateWithParam load_state = r->GetLoadState();
[email protected]abe1c4a2013-10-25 19:28:515497 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state);
[email protected]754bd202013-12-18 08:29:085498 EXPECT_EQ(base::string16(), load_state.param);
[email protected]abe1c4a2013-10-25 19:28:515499
[email protected]f7022f32014-08-21 16:32:195500 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515501 base::RunLoop().Run();
5502
[email protected]f7022f32014-08-21 16:32:195503 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505504 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515505 EXPECT_EQ(1, network_delegate.created_requests());
5506 EXPECT_EQ(0, network_delegate.destroyed_requests());
5507 }
5508 EXPECT_EQ(1, network_delegate.destroyed_requests());
5509
5510 size_t log_position = 0;
mmenke43758e62015-05-04 21:09:465511 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515512 net_log_.GetEntries(&entries);
5513 for (size_t i = 0; i < 3; ++i) {
5514 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005515 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5516 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515517
5518 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5519 log_position + 1);
5520
5521 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005522 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5523 entries[log_position].type);
5524 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515525 }
5526
mikecirone8b85c432016-09-08 19:11:005527 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5528 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515529}
5530
5531// Tests handling of delegate info from a network delegate in the case of an
5532// HTTP redirect.
5533TEST_F(URLRequestTestHTTP, NetworkDelegateInfoRedirect) {
tommycli59a63432015-11-06 00:10:555534 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515535
5536 TestDelegate request_delegate;
5537 AsyncLoggingNetworkDelegate network_delegate;
5538 TestURLRequestContext context(true);
5539 context.set_network_delegate(&network_delegate);
5540 context.set_net_log(&net_log_);
5541 context.Init();
5542
5543 {
danakj8522a25b2016-04-16 00:17:365544 std::unique_ptr<URLRequest> r(context.CreateRequest(
tommycli59a63432015-11-06 00:10:555545 http_test_server()->GetURL("/server-redirect?simple.html"),
rhalavatib7bd7c792017-04-27 05:25:165546 DEFAULT_PRIORITY, &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195547 LoadStateWithParam load_state = r->GetLoadState();
[email protected]abe1c4a2013-10-25 19:28:515548 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state);
[email protected]754bd202013-12-18 08:29:085549 EXPECT_EQ(base::string16(), load_state.param);
[email protected]abe1c4a2013-10-25 19:28:515550
[email protected]f7022f32014-08-21 16:32:195551 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515552 base::RunLoop().Run();
5553
[email protected]f7022f32014-08-21 16:32:195554 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505555 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515556 EXPECT_EQ(2, network_delegate.created_requests());
5557 EXPECT_EQ(0, network_delegate.destroyed_requests());
5558 }
5559 EXPECT_EQ(1, network_delegate.destroyed_requests());
5560
5561 size_t log_position = 0;
mmenke43758e62015-05-04 21:09:465562 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515563 net_log_.GetEntries(&entries);
5564 // The NetworkDelegate logged information in OnBeforeURLRequest,
ryansturm2343cb62016-06-15 01:09:005565 // OnBeforeStartTransaction, and OnHeadersReceived.
[email protected]abe1c4a2013-10-25 19:28:515566 for (size_t i = 0; i < 3; ++i) {
5567 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005568 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5569 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515570
5571 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5572 log_position + 1);
5573
5574 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005575 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5576 entries[log_position].type);
5577 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515578 }
5579
5580 // The URLRequest::Delegate then gets informed about the redirect.
5581 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005582 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5583 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515584
5585 // The NetworkDelegate logged information in the same three events as before.
5586 for (size_t i = 0; i < 3; ++i) {
5587 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005588 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5589 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515590
5591 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5592 log_position + 1);
5593
5594 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005595 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5596 entries[log_position].type);
5597 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515598 }
5599
mikecirone8b85c432016-09-08 19:11:005600 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5601 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515602}
5603
5604// Tests handling of delegate info from a network delegate in the case of HTTP
5605// AUTH.
5606TEST_F(URLRequestTestHTTP, NetworkDelegateInfoAuth) {
tommycli59a63432015-11-06 00:10:555607 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515608
5609 TestDelegate request_delegate;
5610 AsyncLoggingNetworkDelegate network_delegate;
5611 TestURLRequestContext context(true);
5612 context.set_network_delegate(&network_delegate);
5613 context.set_net_log(&net_log_);
5614 context.Init();
5615
5616 {
rhalavatib7bd7c792017-04-27 05:25:165617 std::unique_ptr<URLRequest> r(context.CreateRequest(
5618 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY,
5619 &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195620 LoadStateWithParam load_state = r->GetLoadState();
[email protected]abe1c4a2013-10-25 19:28:515621 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state);
[email protected]754bd202013-12-18 08:29:085622 EXPECT_EQ(base::string16(), load_state.param);
[email protected]abe1c4a2013-10-25 19:28:515623
[email protected]f7022f32014-08-21 16:32:195624 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515625 base::RunLoop().Run();
5626
[email protected]f7022f32014-08-21 16:32:195627 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505628 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515629 EXPECT_EQ(1, network_delegate.created_requests());
5630 EXPECT_EQ(0, network_delegate.destroyed_requests());
5631 }
5632 EXPECT_EQ(1, network_delegate.destroyed_requests());
5633
5634 size_t log_position = 0;
mmenke43758e62015-05-04 21:09:465635 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515636 net_log_.GetEntries(&entries);
5637 // The NetworkDelegate should have logged information in OnBeforeURLRequest,
ryansturm2343cb62016-06-15 01:09:005638 // OnBeforeStartTransaction, OnHeadersReceived, OnAuthRequired, and then again
5639 // in
5640 // OnBeforeURLRequest and OnBeforeStartTransaction.
[email protected]abe1c4a2013-10-25 19:28:515641 for (size_t i = 0; i < 6; ++i) {
5642 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005643 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5644 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515645
5646 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5647 log_position + 1);
5648
5649 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005650 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5651 entries[log_position].type);
5652 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515653 }
5654
mikecirone8b85c432016-09-08 19:11:005655 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5656 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515657}
5658
tommycli59a63432015-11-06 00:10:555659// TODO(svaldez): Update tests to use EmbeddedTestServer.
5660#if !defined(OS_IOS)
[email protected]abe1c4a2013-10-25 19:28:515661// Tests handling of delegate info from a URLRequest::Delegate.
5662TEST_F(URLRequestTestHTTP, URLRequestDelegateInfo) {
tommycli59a63432015-11-06 00:10:555663 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
tommycli59a63432015-11-06 00:10:555664 base::FilePath(kTestFilePath));
5665
5666 ASSERT_TRUE(test_server.Start());
[email protected]abe1c4a2013-10-25 19:28:515667
5668 AsyncLoggingUrlRequestDelegate request_delegate(
5669 AsyncLoggingUrlRequestDelegate::NO_CANCEL);
5670 TestURLRequestContext context(true);
5671 context.set_network_delegate(NULL);
5672 context.set_net_log(&net_log_);
5673 context.Init();
5674
5675 {
5676 // A chunked response with delays between chunks is used to make sure that
5677 // attempts by the URLRequest delegate to log information while reading the
5678 // body are ignored. Since they are ignored, this test is robust against
[email protected]1826a402014-01-08 15:40:485679 // the possibility of multiple reads being combined in the unlikely event
[email protected]abe1c4a2013-10-25 19:28:515680 // that it occurs.
danakj8522a25b2016-04-16 00:17:365681 std::unique_ptr<URLRequest> r(context.CreateRequest(
tommycli59a63432015-11-06 00:10:555682 test_server.GetURL("/chunked?waitBetweenChunks=20"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:165683 &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195684 LoadStateWithParam load_state = r->GetLoadState();
5685 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515686 base::RunLoop().Run();
5687
[email protected]f7022f32014-08-21 16:32:195688 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505689 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515690 }
5691
mmenke43758e62015-05-04 21:09:465692 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515693 net_log_.GetEntries(&entries);
5694
[email protected]1826a402014-01-08 15:40:485695 size_t log_position = 0;
5696
[email protected]abe1c4a2013-10-25 19:28:515697 // The delegate info should only have been logged on header complete. Other
5698 // times it should silently be ignored.
mikecirone8b85c432016-09-08 19:11:005699 log_position = ExpectLogContainsSomewhereAfter(
5700 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5701 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515702
5703 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5704 log_position + 1);
5705
5706 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005707 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE, entries[log_position].type);
5708 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515709
mikecirone8b85c432016-09-08 19:11:005710 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5711 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515712 EXPECT_FALSE(LogContainsEntryWithTypeAfter(
mikecirone8b85c432016-09-08 19:11:005713 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE));
[email protected]abe1c4a2013-10-25 19:28:515714}
tommycli59a63432015-11-06 00:10:555715#endif // !defined(OS_IOS)
[email protected]abe1c4a2013-10-25 19:28:515716
5717// Tests handling of delegate info from a URLRequest::Delegate in the case of
5718// an HTTP redirect.
5719TEST_F(URLRequestTestHTTP, URLRequestDelegateInfoOnRedirect) {
tommycli59a63432015-11-06 00:10:555720 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515721
5722 AsyncLoggingUrlRequestDelegate request_delegate(
5723 AsyncLoggingUrlRequestDelegate::NO_CANCEL);
5724 TestURLRequestContext context(true);
5725 context.set_network_delegate(NULL);
5726 context.set_net_log(&net_log_);
5727 context.Init();
5728
5729 {
danakj8522a25b2016-04-16 00:17:365730 std::unique_ptr<URLRequest> r(context.CreateRequest(
tommycli59a63432015-11-06 00:10:555731 http_test_server()->GetURL("/server-redirect?simple.html"),
rhalavatib7bd7c792017-04-27 05:25:165732 DEFAULT_PRIORITY, &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195733 LoadStateWithParam load_state = r->GetLoadState();
5734 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515735 base::RunLoop().Run();
5736
[email protected]f7022f32014-08-21 16:32:195737 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505738 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515739 }
5740
mmenke43758e62015-05-04 21:09:465741 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515742 net_log_.GetEntries(&entries);
5743
5744 // Delegate info should only have been logged in OnReceivedRedirect and
5745 // OnResponseStarted.
5746 size_t log_position = 0;
5747 for (int i = 0; i < 2; ++i) {
5748 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005749 entries, log_position, NetLogEventType::URL_REQUEST_DELEGATE,
5750 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515751
5752 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5753 log_position + 1);
5754
5755 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005756 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5757 entries[log_position].type);
5758 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515759 }
5760
mikecirone8b85c432016-09-08 19:11:005761 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5762 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515763 EXPECT_FALSE(LogContainsEntryWithTypeAfter(
mikecirone8b85c432016-09-08 19:11:005764 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE));
[email protected]abe1c4a2013-10-25 19:28:515765}
5766
5767// Tests handling of delegate info from a URLRequest::Delegate in the case of
5768// an HTTP redirect, with cancellation at various points.
5769TEST_F(URLRequestTestHTTP, URLRequestDelegateOnRedirectCancelled) {
tommycli59a63432015-11-06 00:10:555770 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515771
5772 const AsyncLoggingUrlRequestDelegate::CancelStage kCancelStages[] = {
5773 AsyncLoggingUrlRequestDelegate::CANCEL_ON_RECEIVED_REDIRECT,
5774 AsyncLoggingUrlRequestDelegate::CANCEL_ON_RESPONSE_STARTED,
5775 AsyncLoggingUrlRequestDelegate::CANCEL_ON_READ_COMPLETED,
5776 };
5777
5778 for (size_t test_case = 0; test_case < arraysize(kCancelStages);
5779 ++test_case) {
5780 AsyncLoggingUrlRequestDelegate request_delegate(kCancelStages[test_case]);
vishal.b62985ca92015-04-17 08:45:515781 TestNetLog net_log;
krasin0bfeb6b2017-01-13 21:48:045782 TestURLRequestContext context(true);
[email protected]abe1c4a2013-10-25 19:28:515783 context.set_network_delegate(NULL);
5784 context.set_net_log(&net_log);
5785 context.Init();
5786
5787 {
danakj8522a25b2016-04-16 00:17:365788 std::unique_ptr<URLRequest> r(context.CreateRequest(
tommycli59a63432015-11-06 00:10:555789 http_test_server()->GetURL("/server-redirect?simple.html"),
rhalavatib7bd7c792017-04-27 05:25:165790 DEFAULT_PRIORITY, &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195791 LoadStateWithParam load_state = r->GetLoadState();
5792 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515793 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:505794 EXPECT_EQ(ERR_ABORTED, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515795 }
5796
mmenke43758e62015-05-04 21:09:465797 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515798 net_log.GetEntries(&entries);
5799
5800 // Delegate info is always logged in both OnReceivedRedirect and
5801 // OnResponseStarted. In the CANCEL_ON_RECEIVED_REDIRECT, the
5802 // OnResponseStarted delegate call is after cancellation, but logging is
5803 // still currently supported in that call.
5804 size_t log_position = 0;
5805 for (int i = 0; i < 2; ++i) {
5806 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005807 entries, log_position, NetLogEventType::URL_REQUEST_DELEGATE,
5808 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515809
5810 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5811 log_position + 1);
5812
5813 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005814 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5815 entries[log_position].type);
5816 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515817 }
5818
mikecirone8b85c432016-09-08 19:11:005819 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5820 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515821 EXPECT_FALSE(LogContainsEntryWithTypeAfter(
mikecirone8b85c432016-09-08 19:11:005822 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE));
[email protected]abe1c4a2013-10-25 19:28:515823 }
5824}
5825
[email protected]847c0fa92012-11-06 16:37:425826namespace {
5827
5828const char kExtraHeader[] = "Allow-Snafu";
5829const char kExtraValue[] = "fubar";
5830
5831class RedirectWithAdditionalHeadersDelegate : public TestDelegate {
dchengb03027d2014-10-21 12:00:205832 void OnReceivedRedirect(URLRequest* request,
5833 const RedirectInfo& redirect_info,
5834 bool* defer_redirect) override {
[email protected]cba24642014-08-15 20:49:595835 TestDelegate::OnReceivedRedirect(request, redirect_info, defer_redirect);
[email protected]847c0fa92012-11-06 16:37:425836 request->SetExtraRequestHeaderByName(kExtraHeader, kExtraValue, false);
5837 }
5838};
5839
5840} // namespace
5841
5842TEST_F(URLRequestTestHTTP, RedirectWithAdditionalHeadersTest) {
tommycli59a63432015-11-06 00:10:555843 ASSERT_TRUE(http_test_server()->Start());
[email protected]847c0fa92012-11-06 16:37:425844
tommycli59a63432015-11-06 00:10:555845 GURL destination_url =
5846 http_test_server()->GetURL("/echoheader?" + std::string(kExtraHeader));
5847 GURL original_url =
5848 http_test_server()->GetURL("/server-redirect?" + destination_url.spec());
[email protected]847c0fa92012-11-06 16:37:425849 RedirectWithAdditionalHeadersDelegate d;
rhalavatib7bd7c792017-04-27 05:25:165850 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
5851 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195852 req->Start();
[email protected]255620da2013-08-19 13:14:295853 base::RunLoop().Run();
[email protected]847c0fa92012-11-06 16:37:425854
5855 std::string value;
[email protected]f7022f32014-08-21 16:32:195856 const HttpRequestHeaders& headers = req->extra_request_headers();
[email protected]847c0fa92012-11-06 16:37:425857 EXPECT_TRUE(headers.GetHeader(kExtraHeader, &value));
5858 EXPECT_EQ(kExtraValue, value);
[email protected]f7022f32014-08-21 16:32:195859 EXPECT_FALSE(req->is_pending());
5860 EXPECT_FALSE(req->is_redirecting());
[email protected]847c0fa92012-11-06 16:37:425861 EXPECT_EQ(kExtraValue, d.data_received());
5862}
5863
[email protected]251a1b92012-11-13 11:01:095864namespace {
5865
5866const char kExtraHeaderToRemove[] = "To-Be-Removed";
5867
5868class RedirectWithHeaderRemovalDelegate : public TestDelegate {
dchengb03027d2014-10-21 12:00:205869 void OnReceivedRedirect(URLRequest* request,
5870 const RedirectInfo& redirect_info,
5871 bool* defer_redirect) override {
[email protected]cba24642014-08-15 20:49:595872 TestDelegate::OnReceivedRedirect(request, redirect_info, defer_redirect);
[email protected]251a1b92012-11-13 11:01:095873 request->RemoveRequestHeaderByName(kExtraHeaderToRemove);
5874 }
5875};
5876
5877} // namespace
5878
5879TEST_F(URLRequestTestHTTP, RedirectWithHeaderRemovalTest) {
tommycli59a63432015-11-06 00:10:555880 ASSERT_TRUE(http_test_server()->Start());
[email protected]251a1b92012-11-13 11:01:095881
tommycli59a63432015-11-06 00:10:555882 GURL destination_url = http_test_server()->GetURL(
5883 "/echoheader?" + std::string(kExtraHeaderToRemove));
5884 GURL original_url =
5885 http_test_server()->GetURL("/server-redirect?" + destination_url.spec());
[email protected]251a1b92012-11-13 11:01:095886 RedirectWithHeaderRemovalDelegate d;
rhalavatib7bd7c792017-04-27 05:25:165887 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
5888 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195889 req->SetExtraRequestHeaderByName(kExtraHeaderToRemove, "dummy", false);
5890 req->Start();
[email protected]255620da2013-08-19 13:14:295891 base::RunLoop().Run();
[email protected]251a1b92012-11-13 11:01:095892
5893 std::string value;
[email protected]f7022f32014-08-21 16:32:195894 const HttpRequestHeaders& headers = req->extra_request_headers();
[email protected]251a1b92012-11-13 11:01:095895 EXPECT_FALSE(headers.GetHeader(kExtraHeaderToRemove, &value));
[email protected]f7022f32014-08-21 16:32:195896 EXPECT_FALSE(req->is_pending());
5897 EXPECT_FALSE(req->is_redirecting());
[email protected]251a1b92012-11-13 11:01:095898 EXPECT_EQ("None", d.data_received());
5899}
5900
mmenke94f1bd92016-12-07 21:13:055901TEST_F(URLRequestTestHTTP, CancelAfterStart) {
[email protected]316c1e5e2012-09-12 15:17:445902 TestDelegate d;
5903 {
danakj8522a25b2016-04-16 00:17:365904 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:165905 GURL("http://www.google.com/"), DEFAULT_PRIORITY, &d,
5906 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:445907
[email protected]f7022f32014-08-21 16:32:195908 r->Start();
5909 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:445910
[email protected]f7022f32014-08-21 16:32:195911 r->Cancel();
[email protected]316c1e5e2012-09-12 15:17:445912
[email protected]255620da2013-08-19 13:14:295913 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:445914
5915 // We expect to receive OnResponseStarted even though the request has been
5916 // cancelled.
5917 EXPECT_EQ(1, d.response_started_count());
5918 EXPECT_EQ(0, d.bytes_received());
5919 EXPECT_FALSE(d.received_data_before_response());
5920 }
5921}
5922
mmenke94f1bd92016-12-07 21:13:055923TEST_F(URLRequestTestHTTP, CancelInResponseStarted) {
tommycli59a63432015-11-06 00:10:555924 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:445925
5926 TestDelegate d;
5927 {
danakj8522a25b2016-04-16 00:17:365928 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:165929 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d,
5930 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:445931
5932 d.set_cancel_in_response_started(true);
5933
[email protected]f7022f32014-08-21 16:32:195934 r->Start();
5935 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:445936
[email protected]255620da2013-08-19 13:14:295937 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:445938
5939 EXPECT_EQ(1, d.response_started_count());
5940 EXPECT_EQ(0, d.bytes_received());
5941 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:505942 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:445943 }
5944}
5945
mmenke94f1bd92016-12-07 21:13:055946TEST_F(URLRequestTestHTTP, CancelOnDataReceived) {
tommycli59a63432015-11-06 00:10:555947 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:445948
5949 TestDelegate d;
5950 {
danakj8522a25b2016-04-16 00:17:365951 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:165952 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
5953 TRAFFIC_ANNOTATION_FOR_TESTS));
mmenke94f1bd92016-12-07 21:13:055954
5955 d.set_cancel_in_received_data(true);
5956
5957 r->Start();
5958 EXPECT_TRUE(r->is_pending());
5959
5960 base::RunLoop().Run();
5961
5962 EXPECT_EQ(1, d.response_started_count());
5963 EXPECT_NE(0, d.received_bytes_count());
5964 EXPECT_FALSE(d.received_data_before_response());
5965 EXPECT_EQ(ERR_ABORTED, d.request_status());
5966 }
5967}
5968
5969TEST_F(URLRequestTestHTTP, CancelDuringEofRead) {
5970 ASSERT_TRUE(http_test_server()->Start());
5971
5972 TestDelegate d;
5973 {
5974 // This returns an empty response (With headers).
5975 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:165976 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d,
5977 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:445978
5979 d.set_cancel_in_received_data(true);
5980
[email protected]f7022f32014-08-21 16:32:195981 r->Start();
5982 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:445983
[email protected]255620da2013-08-19 13:14:295984 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:445985
5986 EXPECT_EQ(1, d.response_started_count());
mmenke94f1bd92016-12-07 21:13:055987 EXPECT_EQ(0, d.received_bytes_count());
[email protected]316c1e5e2012-09-12 15:17:445988 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:505989 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:445990 }
5991}
5992
mmenke94f1bd92016-12-07 21:13:055993TEST_F(URLRequestTestHTTP, CancelByDestroyingAfterStart) {
tommycli59a63432015-11-06 00:10:555994 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:445995
5996 TestDelegate d;
5997 {
danakj8522a25b2016-04-16 00:17:365998 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:165999 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d,
6000 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:446001
[email protected]f7022f32014-08-21 16:32:196002 r->Start();
6003 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446004
6005 // The request will be implicitly canceled when it is destroyed. The
6006 // test delegate must not post a quit message when this happens because
6007 // this test doesn't actually have a message loop. The quit message would
6008 // get put on this thread's message queue and the next test would exit
6009 // early, causing problems.
6010 d.set_quit_on_complete(false);
6011 }
6012 // expect things to just cleanup properly.
6013
kimwjdalsl2bb4ff02015-12-16 22:06:026014 // we won't actually get a received response here because we've never run the
[email protected]316c1e5e2012-09-12 15:17:446015 // message loop
6016 EXPECT_FALSE(d.received_data_before_response());
6017 EXPECT_EQ(0, d.bytes_received());
6018}
6019
mmenke94f1bd92016-12-07 21:13:056020TEST_F(URLRequestTestHTTP, CancelWhileReadingFromCache) {
tommycli59a63432015-11-06 00:10:556021 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446022
6023 // populate cache
6024 {
6025 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366026 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166027 http_test_server()->GetURL("/cachetime"), DEFAULT_PRIORITY, &d,
6028 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196029 r->Start();
[email protected]255620da2013-08-19 13:14:296030 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:506031 EXPECT_EQ(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:446032 }
6033
6034 // cancel read from cache (see bug 990242)
6035 {
6036 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366037 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166038 http_test_server()->GetURL("/cachetime"), DEFAULT_PRIORITY, &d,
6039 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196040 r->Start();
6041 r->Cancel();
[email protected]255620da2013-08-19 13:14:296042 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446043
maksim.sisovb53724b52016-09-16 05:30:506044 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:446045 EXPECT_EQ(1, d.response_started_count());
6046 EXPECT_EQ(0, d.bytes_received());
6047 EXPECT_FALSE(d.received_data_before_response());
6048 }
6049}
6050
6051TEST_F(URLRequestTestHTTP, PostTest) {
tommycli59a63432015-11-06 00:10:556052 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446053 HTTPUploadDataOperationTest("POST");
6054}
6055
6056TEST_F(URLRequestTestHTTP, PutTest) {
tommycli59a63432015-11-06 00:10:556057 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446058 HTTPUploadDataOperationTest("PUT");
6059}
6060
6061TEST_F(URLRequestTestHTTP, PostEmptyTest) {
tommycli59a63432015-11-06 00:10:556062 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446063
6064 TestDelegate d;
6065 {
danakj8522a25b2016-04-16 00:17:366066 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166067 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6068 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196069 r->set_method("POST");
[email protected]316c1e5e2012-09-12 15:17:446070
[email protected]f7022f32014-08-21 16:32:196071 r->Start();
6072 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446073
[email protected]255620da2013-08-19 13:14:296074 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446075
maksim.sisovb53724b52016-09-16 05:30:506076 ASSERT_EQ(1, d.response_started_count()) << "request failed. Error: "
6077 << d.request_status();
[email protected]316c1e5e2012-09-12 15:17:446078
6079 EXPECT_FALSE(d.received_data_before_response());
6080 EXPECT_TRUE(d.data_received().empty());
6081 }
6082}
6083
6084TEST_F(URLRequestTestHTTP, PostFileTest) {
tommycli59a63432015-11-06 00:10:556085 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446086
6087 TestDelegate d;
6088 {
danakj8522a25b2016-04-16 00:17:366089 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166090 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6091 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196092 r->set_method("POST");
[email protected]316c1e5e2012-09-12 15:17:446093
[email protected]6cdfd7f2013-02-08 20:40:156094 base::FilePath dir;
[email protected]316c1e5e2012-09-12 15:17:446095 PathService::Get(base::DIR_EXE, &dir);
[email protected]37b3c1992014-03-11 20:59:026096 base::SetCurrentDirectory(dir);
[email protected]316c1e5e2012-09-12 15:17:446097
danakj8522a25b2016-04-16 00:17:366098 std::vector<std::unique_ptr<UploadElementReader>> element_readers;
[email protected]316c1e5e2012-09-12 15:17:446099
[email protected]6cdfd7f2013-02-08 20:40:156100 base::FilePath path;
[email protected]316c1e5e2012-09-12 15:17:446101 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:476102 path = path.Append(kTestFilePath);
[email protected]316c1e5e2012-09-12 15:17:446103 path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
Jeremy Roman0579ed62017-08-29 15:56:196104 element_readers.push_back(std::make_unique<UploadFileElementReader>(
avibf0746c2015-12-09 19:53:146105 base::ThreadTaskRunnerHandle::Get().get(), path, 0,
ricea2deef682016-09-09 08:04:076106 std::numeric_limits<uint64_t>::max(), base::Time()));
Bence Béky8f9d7d3952017-10-09 19:58:046107 r->set_upload(std::make_unique<ElementsUploadDataStream>(
6108 std::move(element_readers), 0));
[email protected]316c1e5e2012-09-12 15:17:446109
[email protected]f7022f32014-08-21 16:32:196110 r->Start();
6111 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446112
[email protected]255620da2013-08-19 13:14:296113 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446114
avibf0746c2015-12-09 19:53:146115 int64_t size64 = 0;
pkasting6b68a162014-12-01 22:10:296116 ASSERT_EQ(true, base::GetFileSize(path, &size64));
6117 ASSERT_LE(size64, std::numeric_limits<int>::max());
6118 int size = static_cast<int>(size64);
danakj8522a25b2016-04-16 00:17:366119 std::unique_ptr<char[]> buf(new char[size]);
[email protected]316c1e5e2012-09-12 15:17:446120
[email protected]7600d0b2013-12-08 21:43:306121 ASSERT_EQ(size, base::ReadFile(path, buf.get(), size));
[email protected]316c1e5e2012-09-12 15:17:446122
maksim.sisovb53724b52016-09-16 05:30:506123 ASSERT_EQ(1, d.response_started_count()) << "request failed. Error: "
6124 << d.request_status();
[email protected]316c1e5e2012-09-12 15:17:446125
6126 EXPECT_FALSE(d.received_data_before_response());
6127
[email protected]329b68b2012-11-14 17:54:276128 EXPECT_EQ(size, d.bytes_received());
6129 EXPECT_EQ(std::string(&buf[0], size), d.data_received());
[email protected]316c1e5e2012-09-12 15:17:446130 }
6131}
6132
[email protected]999dd8c2013-11-12 06:45:546133TEST_F(URLRequestTestHTTP, PostUnreadableFileTest) {
tommycli59a63432015-11-06 00:10:556134 ASSERT_TRUE(http_test_server()->Start());
[email protected]999dd8c2013-11-12 06:45:546135
6136 TestDelegate d;
6137 {
danakj8522a25b2016-04-16 00:17:366138 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166139 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6140 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196141 r->set_method("POST");
[email protected]999dd8c2013-11-12 06:45:546142
danakj8522a25b2016-04-16 00:17:366143 std::vector<std::unique_ptr<UploadElementReader>> element_readers;
[email protected]999dd8c2013-11-12 06:45:546144
Jeremy Roman0579ed62017-08-29 15:56:196145 element_readers.push_back(std::make_unique<UploadFileElementReader>(
skyostil4891b25b2015-06-11 11:43:456146 base::ThreadTaskRunnerHandle::Get().get(),
[email protected]999dd8c2013-11-12 06:45:546147 base::FilePath(FILE_PATH_LITERAL(
6148 "c:\\path\\to\\non\\existant\\file.randomness.12345")),
ricea2deef682016-09-09 08:04:076149 0, std::numeric_limits<uint64_t>::max(), base::Time()));
Bence Béky8f9d7d3952017-10-09 19:58:046150 r->set_upload(std::make_unique<ElementsUploadDataStream>(
6151 std::move(element_readers), 0));
[email protected]999dd8c2013-11-12 06:45:546152
[email protected]f7022f32014-08-21 16:32:196153 r->Start();
6154 EXPECT_TRUE(r->is_pending());
[email protected]999dd8c2013-11-12 06:45:546155
6156 base::RunLoop().Run();
6157
[email protected]999dd8c2013-11-12 06:45:546158 EXPECT_TRUE(d.request_failed());
6159 EXPECT_FALSE(d.received_data_before_response());
6160 EXPECT_EQ(0, d.bytes_received());
maksim.sisovb53724b52016-09-16 05:30:506161 EXPECT_EQ(ERR_FILE_NOT_FOUND, d.request_status());
[email protected]999dd8c2013-11-12 06:45:546162 }
6163}
6164
mmenke56b0cbb912016-03-28 21:34:536165namespace {
6166
6167// Adds a standard set of data to an upload for chunked upload integration
6168// tests.
6169void AddDataToUpload(ChunkedUploadDataStream::Writer* writer) {
6170 writer->AppendData("a", 1, false);
6171 writer->AppendData("bcd", 3, false);
6172 writer->AppendData("this is a longer chunk than before.", 35, false);
6173 writer->AppendData("\r\n\r\n", 4, false);
6174 writer->AppendData("0", 1, false);
6175 writer->AppendData("2323", 4, true);
6176}
6177
6178// Checks that the upload data added in AddChunksToUpload() was echoed back from
6179// the server.
6180void VerifyReceivedDataMatchesChunks(URLRequest* r, TestDelegate* d) {
6181 // This should match the chunks sent by AddChunksToUpload().
6182 const std::string expected_data =
6183 "abcdthis is a longer chunk than before.\r\n\r\n02323";
6184
maksim.sisovb53724b52016-09-16 05:30:506185 ASSERT_EQ(1, d->response_started_count()) << "request failed. Error: "
6186 << d->request_status();
mmenke56b0cbb912016-03-28 21:34:536187
6188 EXPECT_FALSE(d->received_data_before_response());
6189
6190 EXPECT_EQ(expected_data.size(), static_cast<size_t>(d->bytes_received()));
6191 EXPECT_EQ(expected_data, d->data_received());
6192}
6193
6194} // namespace
6195
[email protected]316c1e5e2012-09-12 15:17:446196TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) {
tommycli59a63432015-11-06 00:10:556197 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446198
6199 TestDelegate d;
6200 {
danakj8522a25b2016-04-16 00:17:366201 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166202 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6203 TRAFFIC_ANNOTATION_FOR_TESTS));
danakj8522a25b2016-04-16 00:17:366204 std::unique_ptr<ChunkedUploadDataStream> upload_data_stream(
mmenke56b0cbb912016-03-28 21:34:536205 new ChunkedUploadDataStream(0));
danakj8522a25b2016-04-16 00:17:366206 std::unique_ptr<ChunkedUploadDataStream::Writer> writer =
mmenke56b0cbb912016-03-28 21:34:536207 upload_data_stream->CreateWriter();
6208 r->set_upload(std::move(upload_data_stream));
[email protected]f7022f32014-08-21 16:32:196209 r->set_method("POST");
mmenke56b0cbb912016-03-28 21:34:536210 AddDataToUpload(writer.get());
[email protected]f7022f32014-08-21 16:32:196211 r->Start();
6212 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446213
[email protected]255620da2013-08-19 13:14:296214 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446215
[email protected]f7022f32014-08-21 16:32:196216 VerifyReceivedDataMatchesChunks(r.get(), &d);
[email protected]316c1e5e2012-09-12 15:17:446217 }
6218}
6219
[email protected]329b68b2012-11-14 17:54:276220TEST_F(URLRequestTestHTTP, TestPostChunkedDataJustAfterStart) {
tommycli59a63432015-11-06 00:10:556221 ASSERT_TRUE(http_test_server()->Start());
[email protected]329b68b2012-11-14 17:54:276222
6223 TestDelegate d;
6224 {
danakj8522a25b2016-04-16 00:17:366225 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166226 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6227 TRAFFIC_ANNOTATION_FOR_TESTS));
danakj8522a25b2016-04-16 00:17:366228 std::unique_ptr<ChunkedUploadDataStream> upload_data_stream(
mmenke56b0cbb912016-03-28 21:34:536229 new ChunkedUploadDataStream(0));
danakj8522a25b2016-04-16 00:17:366230 std::unique_ptr<ChunkedUploadDataStream::Writer> writer =
mmenke56b0cbb912016-03-28 21:34:536231 upload_data_stream->CreateWriter();
Bence Béky8f9d7d3952017-10-09 19:58:046232 r->set_upload(std::move(upload_data_stream));
[email protected]f7022f32014-08-21 16:32:196233 r->set_method("POST");
6234 r->Start();
6235 EXPECT_TRUE(r->is_pending());
mmenke56b0cbb912016-03-28 21:34:536236 AddDataToUpload(writer.get());
[email protected]255620da2013-08-19 13:14:296237 base::RunLoop().Run();
[email protected]329b68b2012-11-14 17:54:276238
[email protected]f7022f32014-08-21 16:32:196239 VerifyReceivedDataMatchesChunks(r.get(), &d);
[email protected]329b68b2012-11-14 17:54:276240 }
6241}
6242
[email protected]316c1e5e2012-09-12 15:17:446243TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) {
tommycli59a63432015-11-06 00:10:556244 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446245
6246 TestDelegate d;
6247 {
danakj8522a25b2016-04-16 00:17:366248 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166249 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6250 TRAFFIC_ANNOTATION_FOR_TESTS));
danakj8522a25b2016-04-16 00:17:366251 std::unique_ptr<ChunkedUploadDataStream> upload_data_stream(
mmenke56b0cbb912016-03-28 21:34:536252 new ChunkedUploadDataStream(0));
danakj8522a25b2016-04-16 00:17:366253 std::unique_ptr<ChunkedUploadDataStream::Writer> writer =
mmenke56b0cbb912016-03-28 21:34:536254 upload_data_stream->CreateWriter();
6255 r->set_upload(std::move(upload_data_stream));
[email protected]f7022f32014-08-21 16:32:196256 r->set_method("POST");
6257 r->Start();
6258 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446259
[email protected]255620da2013-08-19 13:14:296260 base::RunLoop().RunUntilIdle();
mmenke56b0cbb912016-03-28 21:34:536261 AddDataToUpload(writer.get());
[email protected]255620da2013-08-19 13:14:296262 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446263
[email protected]f7022f32014-08-21 16:32:196264 VerifyReceivedDataMatchesChunks(r.get(), &d);
[email protected]316c1e5e2012-09-12 15:17:446265 }
6266}
6267
6268TEST_F(URLRequestTestHTTP, ResponseHeadersTest) {
tommycli59a63432015-11-06 00:10:556269 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446270
6271 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366272 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166273 http_test_server()->GetURL("/with-headers.html"), DEFAULT_PRIORITY, &d,
6274 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196275 req->Start();
[email protected]255620da2013-08-19 13:14:296276 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446277
[email protected]f7022f32014-08-21 16:32:196278 const HttpResponseHeaders* headers = req->response_headers();
[email protected]316c1e5e2012-09-12 15:17:446279
6280 // Simple sanity check that response_info() accesses the same data.
[email protected]f7022f32014-08-21 16:32:196281 EXPECT_EQ(headers, req->response_info().headers.get());
[email protected]316c1e5e2012-09-12 15:17:446282
6283 std::string header;
6284 EXPECT_TRUE(headers->GetNormalizedHeader("cache-control", &header));
6285 EXPECT_EQ("private", header);
6286
6287 header.clear();
6288 EXPECT_TRUE(headers->GetNormalizedHeader("content-type", &header));
6289 EXPECT_EQ("text/html; charset=ISO-8859-1", header);
6290
6291 // The response has two "X-Multiple-Entries" headers.
6292 // This verfies our output has them concatenated together.
6293 header.clear();
6294 EXPECT_TRUE(headers->GetNormalizedHeader("x-multiple-entries", &header));
6295 EXPECT_EQ("a, b", header);
6296}
6297
tommycli59a63432015-11-06 00:10:556298// TODO(svaldez): iOS tests are flaky with EmbeddedTestServer and transport
6299// security state. (see http://crbug.com/550977).
6300#if !defined(OS_IOS)
[email protected]242d8562012-10-30 21:20:466301TEST_F(URLRequestTestHTTP, ProcessSTS) {
tommycli59a63432015-11-06 00:10:556302 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6303 https_test_server.SetSSLConfig(
6304 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6305 https_test_server.ServeFilesFromSourceDirectory(
6306 base::FilePath(kTestFilePath));
[email protected]242d8562012-10-30 21:20:466307 ASSERT_TRUE(https_test_server.Start());
6308
tommycli59a63432015-11-06 00:10:556309 std::string test_server_hostname = https_test_server.GetURL("/").host();
[email protected]242d8562012-10-30 21:20:466310 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366311 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166312 https_test_server.GetURL("/hsts-headers.html"), DEFAULT_PRIORITY, &d,
6313 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196314 request->Start();
[email protected]255620da2013-08-19 13:14:296315 base::RunLoop().Run();
[email protected]242d8562012-10-30 21:20:466316
6317 TransportSecurityState* security_state =
6318 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406319 TransportSecurityState::STSState sts_state;
6320 TransportSecurityState::PKPState pkp_state;
6321 EXPECT_TRUE(
6322 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
6323 EXPECT_FALSE(
6324 security_state->GetDynamicPKPState(test_server_hostname, &pkp_state));
6325 EXPECT_EQ(TransportSecurityState::STSState::MODE_FORCE_HTTPS,
6326 sts_state.upgrade_mode);
6327 EXPECT_TRUE(sts_state.include_subdomains);
6328 EXPECT_FALSE(pkp_state.include_subdomains);
mathpc992e602015-10-21 20:34:036329#if defined(OS_ANDROID)
6330 // Android's CertVerifyProc does not (yet) handle pins.
6331#else
martijnc0d6b622015-06-30 19:14:406332 EXPECT_FALSE(pkp_state.HasPublicKeyPins());
mathpc992e602015-10-21 20:34:036333#endif
[email protected]37fd55fb2013-06-29 13:13:276334}
6335
estarka5da76702015-04-09 04:00:166336TEST_F(URLRequestTestHTTP, STSNotProcessedOnIP) {
tommycli59a63432015-11-06 00:10:556337 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6338 https_test_server.ServeFilesFromSourceDirectory(
6339 base::FilePath(kTestFilePath));
estarka5da76702015-04-09 04:00:166340 ASSERT_TRUE(https_test_server.Start());
6341 // Make sure this test fails if the test server is changed to not
6342 // listen on an IP by default.
tommycli59a63432015-11-06 00:10:556343 ASSERT_TRUE(https_test_server.GetURL("/").HostIsIPAddress());
6344 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166345
6346 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366347 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166348 https_test_server.GetURL("/hsts-headers.html"), DEFAULT_PRIORITY, &d,
6349 TRAFFIC_ANNOTATION_FOR_TESTS));
estarka5da76702015-04-09 04:00:166350 request->Start();
6351 base::RunLoop().Run();
estarka5da76702015-04-09 04:00:166352 TransportSecurityState* security_state =
6353 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406354 TransportSecurityState::STSState sts_state;
6355 EXPECT_FALSE(
6356 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
estarka5da76702015-04-09 04:00:166357}
6358
estark06e0dac2015-08-07 21:56:016359namespace {
Martijn Croonenb1383da2017-10-11 11:56:356360const char kExpectCTStaticHostname[] = "expect-ct.preloaded.test";
6361const char kExpectStapleStaticHostname[] = "expect-staple.preloaded.test";
6362const char kExpectStapleReportURI[] =
6363 "http://report-uri.preloaded.test/expect-staple";
estark06e0dac2015-08-07 21:56:016364const char kHPKPReportUri[] = "https://hpkp-report.test";
6365} // namespace
6366
[email protected]37fd55fb2013-06-29 13:13:276367// Tests that enabling HPKP on a domain does not affect the HSTS
6368// validity/expiration.
dadrian2faf2062016-07-16 00:03:176369TEST_F(URLRequestTestHTTP, ProcessPKP) {
estark06e0dac2015-08-07 21:56:016370 GURL report_uri(kHPKPReportUri);
tommycli59a63432015-11-06 00:10:556371 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6372 https_test_server.SetSSLConfig(
6373 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6374 https_test_server.ServeFilesFromSourceDirectory(
6375 base::FilePath(kTestFilePath));
[email protected]37fd55fb2013-06-29 13:13:276376 ASSERT_TRUE(https_test_server.Start());
6377
tommycli59a63432015-11-06 00:10:556378 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166379
[email protected]37fd55fb2013-06-29 13:13:276380 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366381 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166382 https_test_server.GetURL("/hpkp-headers.html"), DEFAULT_PRIORITY, &d,
6383 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196384 request->Start();
[email protected]255620da2013-08-19 13:14:296385 base::RunLoop().Run();
[email protected]37fd55fb2013-06-29 13:13:276386 TransportSecurityState* security_state =
6387 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406388 TransportSecurityState::STSState sts_state;
6389 TransportSecurityState::PKPState pkp_state;
6390 EXPECT_FALSE(
6391 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
6392 EXPECT_TRUE(
6393 security_state->GetDynamicPKPState(test_server_hostname, &pkp_state));
6394 EXPECT_EQ(TransportSecurityState::STSState::MODE_DEFAULT,
6395 sts_state.upgrade_mode);
6396 EXPECT_FALSE(sts_state.include_subdomains);
6397 EXPECT_FALSE(pkp_state.include_subdomains);
6398 EXPECT_TRUE(pkp_state.HasPublicKeyPins());
estark06e0dac2015-08-07 21:56:016399 EXPECT_EQ(report_uri, pkp_state.report_uri);
martijnc0d6b622015-06-30 19:14:406400 EXPECT_NE(sts_state.expiry, pkp_state.expiry);
[email protected]242d8562012-10-30 21:20:466401}
6402
estark06e0dac2015-08-07 21:56:016403// Tests that reports get sent on HPKP violations when a report-uri is set.
dadrian2faf2062016-07-16 00:03:176404TEST_F(URLRequestTestHTTP, ProcessPKPAndSendReport) {
estark06e0dac2015-08-07 21:56:016405 GURL report_uri(kHPKPReportUri);
tommycli59a63432015-11-06 00:10:556406 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6407 https_test_server.SetSSLConfig(
6408 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6409 https_test_server.ServeFilesFromSourceDirectory(
6410 base::FilePath(kTestFilePath));
estark06e0dac2015-08-07 21:56:016411 ASSERT_TRUE(https_test_server.Start());
6412
tommycli59a63432015-11-06 00:10:556413 std::string test_server_hostname = https_test_server.GetURL("/").host();
estark06e0dac2015-08-07 21:56:016414
6415 // Set up a pin for |test_server_hostname|.
6416 TransportSecurityState security_state;
6417 const base::Time current_time(base::Time::Now());
6418 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000);
6419 HashValueVector hashes;
6420 HashValue hash1;
6421 HashValue hash2;
6422 // The values here don't matter, as long as they are different from
6423 // the mocked CertVerifyResult below.
svaldez35d0dca2015-08-24 16:12:446424 ASSERT_TRUE(
6425 hash1.FromString("sha256/1111111111111111111111111111111111111111111="));
6426 ASSERT_TRUE(
6427 hash2.FromString("sha256/2222222222222222222222222222222222222222222="));
estark06e0dac2015-08-07 21:56:016428 hashes.push_back(hash1);
6429 hashes.push_back(hash2);
6430 security_state.AddHPKP(test_server_hostname, expiry,
6431 false, /* include subdomains */
6432 hashes, report_uri);
6433
6434 MockCertificateReportSender mock_report_sender;
6435 security_state.SetReportSender(&mock_report_sender);
6436
6437 // Set up a MockCertVerifier to trigger a violation of the previously
6438 // set pin.
6439 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6440 ASSERT_TRUE(cert);
6441
6442 MockCertVerifier cert_verifier;
6443 CertVerifyResult verify_result;
6444 verify_result.verified_cert = cert;
6445 verify_result.is_issued_by_known_root = true;
6446 HashValue hash3;
svaldez35d0dca2015-08-24 16:12:446447 ASSERT_TRUE(
6448 hash3.FromString("sha256/3333333333333333333333333333333333333333333="));
estark06e0dac2015-08-07 21:56:016449 verify_result.public_key_hashes.push_back(hash3);
6450 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6451
6452 TestNetworkDelegate network_delegate;
6453 TestURLRequestContext context(true);
6454 context.set_transport_security_state(&security_state);
6455 context.set_network_delegate(&network_delegate);
6456 context.set_cert_verifier(&cert_verifier);
6457 context.Init();
6458
6459 // Now send a request to trigger the violation.
6460 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366461 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166462 https_test_server.GetURL("/simple.html"), DEFAULT_PRIORITY, &d,
6463 TRAFFIC_ANNOTATION_FOR_TESTS));
estark06e0dac2015-08-07 21:56:016464 violating_request->Start();
6465 base::RunLoop().Run();
6466
6467 // Check that a report was sent.
6468 EXPECT_EQ(report_uri, mock_report_sender.latest_report_uri());
6469 ASSERT_FALSE(mock_report_sender.latest_report().empty());
estarkb1716e22016-09-28 06:03:446470 EXPECT_EQ("application/json; charset=utf-8",
6471 mock_report_sender.latest_content_type());
danakj8522a25b2016-04-16 00:17:366472 std::unique_ptr<base::Value> value(
estark06e0dac2015-08-07 21:56:016473 base::JSONReader::Read(mock_report_sender.latest_report()));
6474 ASSERT_TRUE(value);
jdoerriedc72ee942016-12-07 15:43:286475 ASSERT_TRUE(value->IsType(base::Value::Type::DICTIONARY));
estark06e0dac2015-08-07 21:56:016476 base::DictionaryValue* report_dict;
6477 ASSERT_TRUE(value->GetAsDictionary(&report_dict));
6478 std::string report_hostname;
6479 EXPECT_TRUE(report_dict->GetString("hostname", &report_hostname));
6480 EXPECT_EQ(test_server_hostname, report_hostname);
6481}
6482
6483// Tests that reports get sent on requests with
6484// Public-Key-Pins-Report-Only headers.
dadrian2faf2062016-07-16 00:03:176485TEST_F(URLRequestTestHTTP, ProcessPKPReportOnly) {
estark06e0dac2015-08-07 21:56:016486 GURL report_uri(kHPKPReportUri);
tommycli59a63432015-11-06 00:10:556487 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6488 https_test_server.SetSSLConfig(
6489 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6490 https_test_server.ServeFilesFromSourceDirectory(
6491 base::FilePath(kTestFilePath));
estark06e0dac2015-08-07 21:56:016492 ASSERT_TRUE(https_test_server.Start());
6493
tommycli59a63432015-11-06 00:10:556494 std::string test_server_hostname = https_test_server.GetURL("/").host();
estark06e0dac2015-08-07 21:56:016495
6496 TransportSecurityState security_state;
6497 MockCertificateReportSender mock_report_sender;
6498 security_state.SetReportSender(&mock_report_sender);
6499
6500 // Set up a MockCertVerifier to violate the pin in the Report-Only
6501 // header.
6502 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6503 ASSERT_TRUE(cert);
6504
6505 MockCertVerifier cert_verifier;
6506 CertVerifyResult verify_result;
6507 verify_result.verified_cert = cert;
6508 verify_result.is_issued_by_known_root = true;
6509 HashValue hash;
6510 // This value doesn't matter, as long as it is different from the pins
6511 // for the request to hpkp-headers-report-only.html.
svaldez35d0dca2015-08-24 16:12:446512 ASSERT_TRUE(
6513 hash.FromString("sha256/1111111111111111111111111111111111111111111="));
estark06e0dac2015-08-07 21:56:016514 verify_result.public_key_hashes.push_back(hash);
6515 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6516
6517 TestNetworkDelegate network_delegate;
6518 TestURLRequestContext context(true);
6519 context.set_transport_security_state(&security_state);
6520 context.set_network_delegate(&network_delegate);
6521 context.set_cert_verifier(&cert_verifier);
6522 context.Init();
6523
6524 // Now send a request to trigger the violation.
6525 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366526 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
tommycli59a63432015-11-06 00:10:556527 https_test_server.GetURL("/hpkp-headers-report-only.html"),
rhalavatib7bd7c792017-04-27 05:25:166528 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark06e0dac2015-08-07 21:56:016529 violating_request->Start();
6530 base::RunLoop().Run();
6531
6532 // Check that a report was sent.
6533 EXPECT_EQ(report_uri, mock_report_sender.latest_report_uri());
6534 ASSERT_FALSE(mock_report_sender.latest_report().empty());
estarkb1716e22016-09-28 06:03:446535 EXPECT_EQ("application/json; charset=utf-8",
6536 mock_report_sender.latest_content_type());
danakj8522a25b2016-04-16 00:17:366537 std::unique_ptr<base::Value> value(
estark06e0dac2015-08-07 21:56:016538 base::JSONReader::Read(mock_report_sender.latest_report()));
6539 ASSERT_TRUE(value);
jdoerriedc72ee942016-12-07 15:43:286540 ASSERT_TRUE(value->IsType(base::Value::Type::DICTIONARY));
estark06e0dac2015-08-07 21:56:016541 base::DictionaryValue* report_dict;
6542 ASSERT_TRUE(value->GetAsDictionary(&report_dict));
6543 std::string report_hostname;
6544 EXPECT_TRUE(report_dict->GetString("hostname", &report_hostname));
6545 EXPECT_EQ(test_server_hostname, report_hostname);
6546}
6547
6548// Tests that reports do not get sent on requests with
6549// Public-Key-Pins-Report-Only headers that don't have pin violations.
dadrian2faf2062016-07-16 00:03:176550TEST_F(URLRequestTestHTTP, ProcessPKPReportOnlyWithNoViolation) {
estark06e0dac2015-08-07 21:56:016551 GURL report_uri(kHPKPReportUri);
tommycli59a63432015-11-06 00:10:556552 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6553 https_test_server.SetSSLConfig(
6554 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6555 https_test_server.ServeFilesFromSourceDirectory(
6556 base::FilePath(kTestFilePath));
estark06e0dac2015-08-07 21:56:016557 ASSERT_TRUE(https_test_server.Start());
6558
tommycli59a63432015-11-06 00:10:556559 std::string test_server_hostname = https_test_server.GetURL("/").host();
estark06e0dac2015-08-07 21:56:016560
6561 TransportSecurityState security_state;
6562 MockCertificateReportSender mock_report_sender;
6563 security_state.SetReportSender(&mock_report_sender);
6564
6565 TestNetworkDelegate network_delegate;
6566 MockCertVerifier mock_cert_verifier;
6567 TestURLRequestContext context(true);
6568 context.set_transport_security_state(&security_state);
6569 context.set_network_delegate(&network_delegate);
6570 context.set_cert_verifier(&mock_cert_verifier);
6571 mock_cert_verifier.set_default_result(OK);
6572 context.Init();
6573
6574 // Now send a request that does not trigger the violation.
6575 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366576 std::unique_ptr<URLRequest> request(context.CreateRequest(
tommycli59a63432015-11-06 00:10:556577 https_test_server.GetURL("/hpkp-headers-report-only.html"),
rhalavatib7bd7c792017-04-27 05:25:166578 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark06e0dac2015-08-07 21:56:016579 request->Start();
6580 base::RunLoop().Run();
6581
6582 // Check that a report was not sent.
6583 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
6584 EXPECT_EQ(std::string(), mock_report_sender.latest_report());
6585}
6586
estarka5da76702015-04-09 04:00:166587TEST_F(URLRequestTestHTTP, PKPNotProcessedOnIP) {
tommycli59a63432015-11-06 00:10:556588 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6589 https_test_server.ServeFilesFromSourceDirectory(
6590 base::FilePath(kTestFilePath));
estarka5da76702015-04-09 04:00:166591 ASSERT_TRUE(https_test_server.Start());
6592 // Make sure this test fails if the test server is changed to not
6593 // listen on an IP by default.
tommycli59a63432015-11-06 00:10:556594 ASSERT_TRUE(https_test_server.GetURL("/").HostIsIPAddress());
6595 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166596
6597 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366598 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166599 https_test_server.GetURL("/hpkp-headers.html"), DEFAULT_PRIORITY, &d,
6600 TRAFFIC_ANNOTATION_FOR_TESTS));
estarka5da76702015-04-09 04:00:166601 request->Start();
6602 base::RunLoop().Run();
6603
6604 TransportSecurityState* security_state =
6605 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406606 TransportSecurityState::PKPState pkp_state;
6607 EXPECT_FALSE(
6608 security_state->GetDynamicPKPState(test_server_hostname, &pkp_state));
estarka5da76702015-04-09 04:00:166609}
6610
dadriandf302c42016-06-10 18:48:596611TEST_F(URLRequestTestHTTP, PKPBypassRecorded) {
6612 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6613 https_test_server.SetSSLConfig(
6614 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6615 https_test_server.ServeFilesFromSourceDirectory(
6616 base::FilePath(kTestFilePath));
6617 ASSERT_TRUE(https_test_server.Start());
6618
6619 // Set up a MockCertVerifier to be a local root that violates the pin
6620 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6621 ASSERT_TRUE(cert);
6622
6623 MockCertVerifier cert_verifier;
6624 CertVerifyResult verify_result;
6625 verify_result.verified_cert = cert;
6626 verify_result.is_issued_by_known_root = false;
6627 HashValue hash;
6628 ASSERT_TRUE(
6629 hash.FromString("sha256/1111111111111111111111111111111111111111111="));
6630 verify_result.public_key_hashes.push_back(hash);
6631 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6632 cert_verifier.set_default_result(OK);
6633
6634 std::string test_server_hostname = https_test_server.GetURL("/").host();
6635
6636 // Set up HPKP
6637 base::Time current_time = base::Time::Now();
6638 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(10000);
6639 HashValue pin;
6640 ASSERT_TRUE(
6641 pin.FromString("sha256/2222222222222222222222222222222222222222222="));
6642 HashValueVector hashes;
6643 hashes.push_back(pin);
6644 GURL report_uri(kHPKPReportUri);
6645 TransportSecurityState security_state;
6646 security_state.AddHPKP(test_server_hostname, expiry,
6647 false, /* include subdomains */
6648 hashes, report_uri);
6649
6650 TestNetworkDelegate network_delegate;
6651 TestURLRequestContext context(true);
6652 context.set_transport_security_state(&security_state);
6653 context.set_network_delegate(&network_delegate);
6654 context.set_cert_verifier(&cert_verifier);
6655 context.Init();
6656
6657 TestDelegate d;
6658 std::unique_ptr<URLRequest> request(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166659 https_test_server.GetURL("/hpkp-headers.html"), DEFAULT_PRIORITY, &d,
6660 TRAFFIC_ANNOTATION_FOR_TESTS));
dadriandf302c42016-06-10 18:48:596661 request->Start();
6662 base::RunLoop().Run();
6663
6664 TransportSecurityState::PKPState pkp_state;
6665 EXPECT_TRUE(
6666 security_state.GetDynamicPKPState(test_server_hostname, &pkp_state));
6667 EXPECT_TRUE(request->ssl_info().pkp_bypassed);
6668}
6669
[email protected]242d8562012-10-30 21:20:466670TEST_F(URLRequestTestHTTP, ProcessSTSOnce) {
tommycli59a63432015-11-06 00:10:556671 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6672 https_test_server.SetSSLConfig(
6673 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6674 https_test_server.ServeFilesFromSourceDirectory(
6675 base::FilePath(kTestFilePath));
[email protected]242d8562012-10-30 21:20:466676 ASSERT_TRUE(https_test_server.Start());
6677
tommycli59a63432015-11-06 00:10:556678 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166679
[email protected]242d8562012-10-30 21:20:466680 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366681 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:556682 https_test_server.GetURL("/hsts-multiple-headers.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:166683 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196684 request->Start();
[email protected]255620da2013-08-19 13:14:296685 base::RunLoop().Run();
[email protected]242d8562012-10-30 21:20:466686
6687 // We should have set parameters from the first header, not the second.
6688 TransportSecurityState* security_state =
6689 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406690 TransportSecurityState::STSState sts_state;
6691 EXPECT_TRUE(
6692 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
6693 EXPECT_EQ(TransportSecurityState::STSState::MODE_FORCE_HTTPS,
6694 sts_state.upgrade_mode);
6695 EXPECT_FALSE(sts_state.include_subdomains);
6696 EXPECT_FALSE(sts_state.include_subdomains);
[email protected]242d8562012-10-30 21:20:466697}
6698
[email protected]9f972ec2013-04-10 20:24:366699TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) {
tommycli59a63432015-11-06 00:10:556700 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6701 https_test_server.SetSSLConfig(
6702 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6703 https_test_server.ServeFilesFromSourceDirectory(
6704 base::FilePath(kTestFilePath));
[email protected]9f972ec2013-04-10 20:24:366705 ASSERT_TRUE(https_test_server.Start());
6706
tommycli59a63432015-11-06 00:10:556707 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166708
[email protected]9f972ec2013-04-10 20:24:366709 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366710 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:556711 https_test_server.GetURL("/hsts-and-hpkp-headers.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:166712 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196713 request->Start();
[email protected]255620da2013-08-19 13:14:296714 base::RunLoop().Run();
[email protected]9f972ec2013-04-10 20:24:366715
6716 // We should have set parameters from the first header, not the second.
6717 TransportSecurityState* security_state =
6718 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406719 TransportSecurityState::STSState sts_state;
6720 TransportSecurityState::PKPState pkp_state;
6721 EXPECT_TRUE(
6722 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
6723 EXPECT_TRUE(
6724 security_state->GetDynamicPKPState(test_server_hostname, &pkp_state));
6725 EXPECT_EQ(TransportSecurityState::STSState::MODE_FORCE_HTTPS,
6726 sts_state.upgrade_mode);
mathpc992e602015-10-21 20:34:036727#if defined(OS_ANDROID)
6728 // Android's CertVerifyProc does not (yet) handle pins.
6729#else
martijnc0d6b622015-06-30 19:14:406730 EXPECT_TRUE(pkp_state.HasPublicKeyPins());
mathpc992e602015-10-21 20:34:036731#endif
martijnc0d6b622015-06-30 19:14:406732 EXPECT_NE(sts_state.expiry, pkp_state.expiry);
[email protected]9f972ec2013-04-10 20:24:366733
[email protected]a165f092013-06-12 16:10:056734 // Even though there is an HSTS header asserting includeSubdomains, it is
6735 // the *second* such header, and we MUST process only the first.
martijnc0d6b622015-06-30 19:14:406736 EXPECT_FALSE(sts_state.include_subdomains);
[email protected]a165f092013-06-12 16:10:056737 // includeSubdomains does not occur in the test HPKP header.
martijnc0d6b622015-06-30 19:14:406738 EXPECT_FALSE(pkp_state.include_subdomains);
[email protected]9f972ec2013-04-10 20:24:366739}
6740
[email protected]37fd55fb2013-06-29 13:13:276741// Tests that when multiple HPKP headers are present, asserting different
6742// policies, that only the first such policy is processed.
6743TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP2) {
tommycli59a63432015-11-06 00:10:556744 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6745 https_test_server.SetSSLConfig(
6746 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6747 https_test_server.ServeFilesFromSourceDirectory(
6748 base::FilePath(kTestFilePath));
[email protected]37fd55fb2013-06-29 13:13:276749 ASSERT_TRUE(https_test_server.Start());
6750
tommycli59a63432015-11-06 00:10:556751 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166752
[email protected]37fd55fb2013-06-29 13:13:276753 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366754 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:556755 https_test_server.GetURL("/hsts-and-hpkp-headers2.html"),
rhalavatib7bd7c792017-04-27 05:25:166756 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196757 request->Start();
[email protected]255620da2013-08-19 13:14:296758 base::RunLoop().Run();
[email protected]37fd55fb2013-06-29 13:13:276759
6760 TransportSecurityState* security_state =
6761 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406762 TransportSecurityState::STSState sts_state;
6763 TransportSecurityState::PKPState pkp_state;
6764 EXPECT_TRUE(
6765 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
6766 EXPECT_TRUE(
6767 security_state->GetDynamicPKPState(test_server_hostname, &pkp_state));
6768 EXPECT_EQ(TransportSecurityState::STSState::MODE_FORCE_HTTPS,
6769 sts_state.upgrade_mode);
mathpc992e602015-10-21 20:34:036770#if defined(OS_ANDROID)
6771 // Android's CertVerifyProc does not (yet) handle pins.
6772#else
martijnc0d6b622015-06-30 19:14:406773 EXPECT_TRUE(pkp_state.HasPublicKeyPins());
mathpc992e602015-10-21 20:34:036774#endif
martijnc0d6b622015-06-30 19:14:406775 EXPECT_NE(sts_state.expiry, pkp_state.expiry);
[email protected]37fd55fb2013-06-29 13:13:276776
martijnc0d6b622015-06-30 19:14:406777 EXPECT_TRUE(sts_state.include_subdomains);
6778 EXPECT_FALSE(pkp_state.include_subdomains);
[email protected]37fd55fb2013-06-29 13:13:276779}
6780
estark1614475f2016-03-10 03:46:476781// An ExpectCTReporter that records the number of times OnExpectCTFailed() was
6782// called.
6783class MockExpectCTReporter : public TransportSecurityState::ExpectCTReporter {
6784 public:
6785 MockExpectCTReporter() : num_failures_(0) {}
6786 ~MockExpectCTReporter() override {}
6787
6788 void OnExpectCTFailed(const HostPortPair& host_port_pair,
6789 const GURL& report_uri,
estarkae028b462017-06-20 23:25:016790 base::Time expiration,
estarkbf1b52962017-05-05 17:05:256791 const X509Certificate* validated_certificate_chain,
6792 const X509Certificate* served_certificate_chain,
6793 const SignedCertificateTimestampAndStatusList&
6794 signed_certificate_timestamps) override {
estark1614475f2016-03-10 03:46:476795 num_failures_++;
6796 }
6797
6798 uint32_t num_failures() { return num_failures_; }
6799
6800 private:
6801 uint32_t num_failures_;
6802};
6803
estark1614475f2016-03-10 03:46:476804// A CTPolicyEnforcer that returns a default CertPolicyCompliance value
6805// for every certificate.
6806class MockCTPolicyEnforcer : public CTPolicyEnforcer {
6807 public:
6808 MockCTPolicyEnforcer()
6809 : default_result_(
6810 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS) {}
6811 ~MockCTPolicyEnforcer() override {}
6812
6813 ct::CertPolicyCompliance DoesConformToCertPolicy(
6814 X509Certificate* cert,
6815 const SCTList& verified_scts,
tfarina42834112016-09-22 13:38:206816 const NetLogWithSource& net_log) override {
estark1614475f2016-03-10 03:46:476817 return default_result_;
6818 }
6819
6820 void set_default_result(ct::CertPolicyCompliance default_result) {
6821 default_result_ = default_result;
6822 }
6823
6824 private:
6825 ct::CertPolicyCompliance default_result_;
6826};
6827
Emily Stark4cfecf072017-08-08 01:05:516828// Tests that Expect CT headers for the preload list are processed correctly.
6829TEST_F(URLRequestTestHTTP, PreloadExpectCTHeader) {
Martijn Croonenb1383da2017-10-11 11:56:356830 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
6831
estark1614475f2016-03-10 03:46:476832 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6833 https_test_server.SetSSLConfig(
6834 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6835 https_test_server.ServeFilesFromSourceDirectory(
6836 base::FilePath(kTestFilePath));
6837 ASSERT_TRUE(https_test_server.Start());
6838
6839 MockExpectCTReporter reporter;
6840 TransportSecurityState transport_security_state;
6841 transport_security_state.enable_static_expect_ct_ = true;
6842 transport_security_state.SetExpectCTReporter(&reporter);
6843
6844 // Set up a MockCertVerifier to accept the certificate that the server sends.
6845 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6846 ASSERT_TRUE(cert);
6847 MockCertVerifier cert_verifier;
6848 CertVerifyResult verify_result;
6849 verify_result.verified_cert = cert;
6850 verify_result.is_issued_by_known_root = true;
6851 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6852
rsleevi22cae1672016-12-28 01:53:366853 // Set up a DoNothingCTVerifier and MockCTPolicyEnforcer to trigger an Expect
6854 // CT violation.
6855 DoNothingCTVerifier ct_verifier;
estark1614475f2016-03-10 03:46:476856 MockCTPolicyEnforcer ct_policy_enforcer;
6857 ct_policy_enforcer.set_default_result(
6858 ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS);
6859
6860 TestNetworkDelegate network_delegate;
6861 // Use a MockHostResolver (which by default maps all hosts to
6862 // 127.0.0.1) so that the request can be sent to a site on the Expect
6863 // CT preload list.
6864 MockHostResolver host_resolver;
6865 TestURLRequestContext context(true);
6866 context.set_host_resolver(&host_resolver);
6867 context.set_transport_security_state(&transport_security_state);
6868 context.set_network_delegate(&network_delegate);
6869 context.set_cert_verifier(&cert_verifier);
6870 context.set_cert_transparency_verifier(&ct_verifier);
vabr13d00742017-06-05 10:31:466871 context.set_ct_policy_enforcer(&ct_policy_enforcer);
estark1614475f2016-03-10 03:46:476872 context.Init();
6873
6874 // Now send a request to trigger the violation.
6875 TestDelegate d;
Emily Stark4cfecf072017-08-08 01:05:516876 GURL url = https_test_server.GetURL("/expect-ct-header-preload.html");
estark1614475f2016-03-10 03:46:476877 GURL::Replacements replace_host;
6878 replace_host.SetHostStr(kExpectCTStaticHostname);
6879 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:166880 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
6881 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark1614475f2016-03-10 03:46:476882 violating_request->Start();
6883 base::RunLoop().Run();
6884
6885 EXPECT_EQ(1u, reporter.num_failures());
6886}
Emily Stark4cfecf072017-08-08 01:05:516887
6888// Tests that Expect CT HTTP headers are processed correctly.
6889TEST_F(URLRequestTestHTTP, ExpectCTHeader) {
6890 base::test::ScopedFeatureList feature_list;
6891 feature_list.InitAndEnableFeature(
6892 TransportSecurityState::kDynamicExpectCTFeature);
6893
6894 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6895 https_test_server.SetSSLConfig(
6896 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6897 https_test_server.ServeFilesFromSourceDirectory(
6898 base::FilePath(kTestFilePath));
6899 ASSERT_TRUE(https_test_server.Start());
6900
6901 MockExpectCTReporter reporter;
6902 TransportSecurityState transport_security_state;
6903 transport_security_state.SetExpectCTReporter(&reporter);
6904
6905 // Set up a MockCertVerifier to accept the certificate that the server sends.
6906 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6907 ASSERT_TRUE(cert);
6908 MockCertVerifier cert_verifier;
6909 CertVerifyResult verify_result;
6910 verify_result.verified_cert = cert;
6911 verify_result.is_issued_by_known_root = true;
6912 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6913
6914 // Set up a DoNothingCTVerifier and MockCTPolicyEnforcer to simulate CT
6915 // compliance.
6916 DoNothingCTVerifier ct_verifier;
6917 MockCTPolicyEnforcer ct_policy_enforcer;
6918 ct_policy_enforcer.set_default_result(
6919 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS);
6920
6921 TestNetworkDelegate network_delegate;
6922 // Use a MockHostResolver (which by default maps all hosts to
6923 // 127.0.0.1).
6924 MockHostResolver host_resolver;
6925 TestURLRequestContext context(true);
6926 context.set_host_resolver(&host_resolver);
6927 context.set_transport_security_state(&transport_security_state);
6928 context.set_network_delegate(&network_delegate);
6929 context.set_cert_verifier(&cert_verifier);
6930 context.set_cert_transparency_verifier(&ct_verifier);
6931 context.set_ct_policy_enforcer(&ct_policy_enforcer);
6932 context.Init();
6933
6934 // Now send a request to trigger the header processing.
6935 TestDelegate d;
6936 GURL url = https_test_server.GetURL("/expect-ct-header.html");
6937 std::unique_ptr<URLRequest> request(context.CreateRequest(
6938 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
6939 request->Start();
6940 base::RunLoop().Run();
6941
6942 TransportSecurityState::ExpectCTState state;
6943 ASSERT_TRUE(
6944 transport_security_state.GetDynamicExpectCTState(url.host(), &state));
6945 EXPECT_TRUE(state.enforce);
6946 EXPECT_EQ(GURL("https://example.test"), state.report_uri);
6947}
6948
6949// Tests that if multiple Expect CT HTTP headers are sent, they are all
6950// processed.
6951TEST_F(URLRequestTestHTTP, MultipleExpectCTHeaders) {
6952 base::test::ScopedFeatureList feature_list;
6953 feature_list.InitAndEnableFeature(
6954 TransportSecurityState::kDynamicExpectCTFeature);
6955
6956 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6957 https_test_server.SetSSLConfig(
6958 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6959 https_test_server.ServeFilesFromSourceDirectory(
6960 base::FilePath(kTestFilePath));
6961 ASSERT_TRUE(https_test_server.Start());
6962
6963 MockExpectCTReporter reporter;
6964 TransportSecurityState transport_security_state;
6965 transport_security_state.SetExpectCTReporter(&reporter);
6966
6967 // Set up a MockCertVerifier to accept the certificate that the server sends.
6968 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6969 ASSERT_TRUE(cert);
6970 MockCertVerifier cert_verifier;
6971 CertVerifyResult verify_result;
6972 verify_result.verified_cert = cert;
6973 verify_result.is_issued_by_known_root = true;
6974 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6975
6976 // Set up a DoNothingCTVerifier and MockCTPolicyEnforcer to simulate CT
6977 // compliance.
6978 DoNothingCTVerifier ct_verifier;
6979 MockCTPolicyEnforcer ct_policy_enforcer;
6980 ct_policy_enforcer.set_default_result(
6981 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS);
6982
6983 TestNetworkDelegate network_delegate;
6984 // Use a MockHostResolver (which by default maps all hosts to
6985 // 127.0.0.1).
6986 MockHostResolver host_resolver;
6987 TestURLRequestContext context(true);
6988 context.set_host_resolver(&host_resolver);
6989 context.set_transport_security_state(&transport_security_state);
6990 context.set_network_delegate(&network_delegate);
6991 context.set_cert_verifier(&cert_verifier);
6992 context.set_cert_transparency_verifier(&ct_verifier);
6993 context.set_ct_policy_enforcer(&ct_policy_enforcer);
6994 context.Init();
6995
6996 // Now send a request to trigger the header processing.
6997 TestDelegate d;
6998 GURL url = https_test_server.GetURL("/expect-ct-header-multiple.html");
6999 std::unique_ptr<URLRequest> request(context.CreateRequest(
7000 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7001 request->Start();
7002 base::RunLoop().Run();
7003
7004 TransportSecurityState::ExpectCTState state;
7005 ASSERT_TRUE(
7006 transport_security_state.GetDynamicExpectCTState(url.host(), &state));
7007 EXPECT_TRUE(state.enforce);
7008 EXPECT_EQ(GURL("https://example.test"), state.report_uri);
7009}
7010
mmenkefd9d15c2017-06-29 13:45:547011#endif // !defined(OS_IOS)
estark1614475f2016-03-10 03:46:477012
mmenkefd9d15c2017-06-29 13:45:547013#if BUILDFLAG(ENABLE_REPORTING)
juliatuttle2b8dd2d12017-04-12 21:27:417014namespace {
7015
7016class TestReportingService : public ReportingService {
7017 public:
7018 struct Header {
7019 GURL url;
7020 std::string header_value;
7021 };
7022
juliatuttle2b8dd2d12017-04-12 21:27:417023 const std::vector<Header>& headers() { return headers_; }
7024
juliatuttle1d92f0152017-04-28 17:19:217025 // ReportingService implementation:
7026
7027 ~TestReportingService() override {}
7028
juliatuttle2b8dd2d12017-04-12 21:27:417029 void QueueReport(const GURL& url,
7030 const std::string& group,
7031 const std::string& type,
7032 std::unique_ptr<const base::Value> body) override {
7033 NOTIMPLEMENTED();
7034 }
7035
7036 void ProcessHeader(const GURL& url,
7037 const std::string& header_value) override {
7038 headers_.push_back({url, header_value});
7039 }
7040
juliatuttleaeb1abc2017-05-04 21:14:387041 void RemoveBrowsingData(
7042 int data_type_mask,
7043 base::Callback<bool(const GURL&)> origin_filter) override {
7044 NOTIMPLEMENTED();
7045 }
7046
juliatuttle2b8dd2d12017-04-12 21:27:417047 private:
7048 std::vector<Header> headers_;
7049};
7050
7051std::unique_ptr<test_server::HttpResponse> SendReportToHeader(
7052 const test_server::HttpRequest& request) {
7053 std::unique_ptr<test_server::BasicHttpResponse> http_response(
7054 new test_server::BasicHttpResponse);
7055 http_response->set_code(HTTP_OK);
7056 http_response->AddCustomHeader("Report-To", "foo");
7057 http_response->AddCustomHeader("Report-To", "bar");
7058 return std::move(http_response);
7059}
7060
7061} // namespace
7062
7063TEST_F(URLRequestTestHTTP, DontProcessReportToHeaderNoService) {
7064 http_test_server()->RegisterRequestHandler(base::Bind(&SendReportToHeader));
7065 ASSERT_TRUE(http_test_server()->Start());
7066 GURL request_url = http_test_server()->GetURL("/");
7067
7068 TestNetworkDelegate network_delegate;
7069 TestURLRequestContext context(true);
7070 context.set_network_delegate(&network_delegate);
7071 context.Init();
7072
7073 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167074 std::unique_ptr<URLRequest> request(context.CreateRequest(
7075 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417076 request->Start();
7077 base::RunLoop().Run();
7078}
7079
7080TEST_F(URLRequestTestHTTP, DontProcessReportToHeaderHTTP) {
7081 http_test_server()->RegisterRequestHandler(base::Bind(&SendReportToHeader));
7082 ASSERT_TRUE(http_test_server()->Start());
7083 GURL request_url = http_test_server()->GetURL("/");
7084
7085 TestNetworkDelegate network_delegate;
7086 TestReportingService reporting_service;
7087 TestURLRequestContext context(true);
7088 context.set_network_delegate(&network_delegate);
7089 context.set_reporting_service(&reporting_service);
7090 context.Init();
7091
7092 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167093 std::unique_ptr<URLRequest> request(context.CreateRequest(
7094 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417095 request->Start();
7096 base::RunLoop().Run();
7097
7098 EXPECT_TRUE(reporting_service.headers().empty());
7099}
7100
7101TEST_F(URLRequestTestHTTP, ProcessReportToHeaderHTTPS) {
7102 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7103 https_test_server.RegisterRequestHandler(base::Bind(&SendReportToHeader));
7104 ASSERT_TRUE(https_test_server.Start());
7105 GURL request_url = https_test_server.GetURL("/");
7106
7107 TestNetworkDelegate network_delegate;
7108 TestReportingService reporting_service;
7109 TestURLRequestContext context(true);
7110 context.set_network_delegate(&network_delegate);
7111 context.set_reporting_service(&reporting_service);
7112 context.Init();
7113
7114 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167115 std::unique_ptr<URLRequest> request(context.CreateRequest(
7116 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417117 request->Start();
7118 base::RunLoop().Run();
7119
7120 ASSERT_EQ(1u, reporting_service.headers().size());
7121 EXPECT_EQ(request_url, reporting_service.headers()[0].url);
7122 EXPECT_EQ("foo, bar", reporting_service.headers()[0].header_value);
7123}
7124
Julia Tuttlef9b74062017-07-27 14:44:057125TEST_F(URLRequestTestHTTP, DontProcessReportToHeaderInvalidHttps) {
juliatuttle2b8dd2d12017-04-12 21:27:417126 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7127 https_test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
7128 https_test_server.RegisterRequestHandler(base::Bind(&SendReportToHeader));
7129 ASSERT_TRUE(https_test_server.Start());
7130 GURL request_url = https_test_server.GetURL("/");
7131
7132 TestNetworkDelegate network_delegate;
7133 TestReportingService reporting_service;
7134 TestURLRequestContext context(true);
7135 context.set_network_delegate(&network_delegate);
7136 context.set_reporting_service(&reporting_service);
7137 context.Init();
7138
7139 TestDelegate d;
7140 d.set_allow_certificate_errors(true);
rhalavatib7bd7c792017-04-27 05:25:167141 std::unique_ptr<URLRequest> request(context.CreateRequest(
7142 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417143 request->Start();
7144 base::RunLoop().Run();
7145
7146 EXPECT_TRUE(d.have_certificate_errors());
7147 EXPECT_TRUE(IsCertStatusError(request->ssl_info().cert_status));
7148 EXPECT_TRUE(reporting_service.headers().empty());
7149}
Julia Tuttlefadc26d2017-10-13 18:12:297150
7151// Network Error Logging is dependent on the Reporting API, so only run NEL
7152// tests if Reporting is enabled in the build.
tommycli59a63432015-11-06 00:10:557153
Julia Tuttlef9b74062017-07-27 14:44:057154namespace {
7155
7156class TestNetworkErrorLoggingDelegate : public NetworkErrorLoggingDelegate {
7157 public:
7158 struct Header {
7159 Header() {}
7160 ~Header() {}
7161
7162 url::Origin origin;
7163 std::string value;
7164 };
7165
Julia Tuttlef9b74062017-07-27 14:44:057166 const std::vector<Header>& headers() { return headers_; }
Julia Tuttleb0d45472017-09-25 20:14:437167 const std::vector<ErrorDetails>& errors() { return errors_; }
Julia Tuttlef9b74062017-07-27 14:44:057168
7169 // NetworkErrorLoggingDelegate implementation:
7170
7171 ~TestNetworkErrorLoggingDelegate() override {}
7172
7173 void SetReportingService(ReportingService* reporting_service) override {
7174 NOTREACHED();
7175 }
7176
7177 void OnHeader(const url::Origin& origin, const std::string& value) override {
7178 Header header;
7179 header.origin = origin;
7180 header.value = value;
7181 headers_.push_back(header);
7182 }
7183
Julia Tuttleb0d45472017-09-25 20:14:437184 void OnNetworkError(const ErrorDetails& details) override {
7185 errors_.push_back(details);
Julia Tuttlef9b74062017-07-27 14:44:057186 }
7187
7188 private:
7189 std::vector<Header> headers_;
Julia Tuttleb0d45472017-09-25 20:14:437190 std::vector<ErrorDetails> errors_;
Julia Tuttlef9b74062017-07-27 14:44:057191};
7192
7193std::unique_ptr<test_server::HttpResponse> SendNelHeader(
7194 const test_server::HttpRequest& request) {
7195 std::unique_ptr<test_server::BasicHttpResponse> http_response(
7196 new test_server::BasicHttpResponse);
7197 http_response->set_code(HTTP_OK);
7198 http_response->AddCustomHeader(NetworkErrorLoggingDelegate::kHeaderName,
7199 "foo");
7200 return std::move(http_response);
7201}
7202
7203} // namespace
7204
7205TEST_F(URLRequestTestHTTP, DontProcessNelHeaderNoDelegate) {
7206 http_test_server()->RegisterRequestHandler(base::Bind(&SendNelHeader));
7207 ASSERT_TRUE(http_test_server()->Start());
7208 GURL request_url = http_test_server()->GetURL("/");
7209
7210 TestNetworkDelegate network_delegate;
7211 TestURLRequestContext context(true);
7212 context.set_network_delegate(&network_delegate);
7213 context.Init();
7214
7215 TestDelegate d;
7216 std::unique_ptr<URLRequest> request(context.CreateRequest(
7217 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7218 request->Start();
7219 base::RunLoop().Run();
7220}
7221
7222TEST_F(URLRequestTestHTTP, DontProcessNelHeaderHttp) {
7223 http_test_server()->RegisterRequestHandler(base::Bind(&SendNelHeader));
7224 ASSERT_TRUE(http_test_server()->Start());
7225 GURL request_url = http_test_server()->GetURL("/");
7226
7227 TestNetworkDelegate network_delegate;
7228 TestNetworkErrorLoggingDelegate nel_delegate;
7229 TestURLRequestContext context(true);
7230 context.set_network_delegate(&network_delegate);
7231 context.set_network_error_logging_delegate(&nel_delegate);
7232 context.Init();
7233
7234 TestDelegate d;
7235 std::unique_ptr<URLRequest> request(context.CreateRequest(
7236 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7237 request->Start();
7238 base::RunLoop().Run();
7239
7240 EXPECT_TRUE(nel_delegate.headers().empty());
7241}
7242
7243TEST_F(URLRequestTestHTTP, ProcessNelHeaderHttps) {
7244 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7245 https_test_server.RegisterRequestHandler(base::Bind(&SendNelHeader));
7246 ASSERT_TRUE(https_test_server.Start());
7247 GURL request_url = https_test_server.GetURL("/");
7248
7249 TestNetworkDelegate network_delegate;
7250 TestNetworkErrorLoggingDelegate nel_delegate;
7251 TestURLRequestContext context(true);
7252 context.set_network_delegate(&network_delegate);
7253 context.set_network_error_logging_delegate(&nel_delegate);
7254 context.Init();
7255
7256 TestDelegate d;
7257 std::unique_ptr<URLRequest> request(context.CreateRequest(
7258 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7259 request->Start();
7260 base::RunLoop().Run();
7261
7262 ASSERT_EQ(1u, nel_delegate.headers().size());
Daniel Cheng88186bd52017-10-20 08:14:467263 EXPECT_EQ(url::Origin::Create(request_url), nel_delegate.headers()[0].origin);
Julia Tuttlef9b74062017-07-27 14:44:057264 EXPECT_EQ("foo", nel_delegate.headers()[0].value);
7265}
7266
7267TEST_F(URLRequestTestHTTP, DontProcessNelHeaderInvalidHttps) {
7268 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7269 https_test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
7270 https_test_server.RegisterRequestHandler(base::Bind(&SendNelHeader));
7271 ASSERT_TRUE(https_test_server.Start());
7272 GURL request_url = https_test_server.GetURL("/");
7273
7274 TestNetworkDelegate network_delegate;
7275 TestNetworkErrorLoggingDelegate nel_delegate;
7276 TestURLRequestContext context(true);
7277 context.set_network_delegate(&network_delegate);
7278 context.set_network_error_logging_delegate(&nel_delegate);
7279 context.Init();
7280
7281 TestDelegate d;
7282 d.set_allow_certificate_errors(true);
7283 std::unique_ptr<URLRequest> request(context.CreateRequest(
7284 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7285 request->Start();
7286 base::RunLoop().Run();
7287
7288 EXPECT_TRUE(d.have_certificate_errors());
7289 EXPECT_TRUE(IsCertStatusError(request->ssl_info().cert_status));
7290 EXPECT_TRUE(nel_delegate.headers().empty());
7291}
7292
Julia Tuttlefadc26d2017-10-13 18:12:297293TEST_F(URLRequestTestHTTP, DontForwardErrorToNelNoDelegate) {
7294 URLRequestFailedJob::AddUrlHandler();
7295
7296 GURL request_url =
7297 URLRequestFailedJob::GetMockHttpsUrl(ERR_CONNECTION_REFUSED);
7298
7299 TestNetworkDelegate network_delegate;
7300 TestURLRequestContext context(true);
7301 context.set_network_delegate(&network_delegate);
7302 context.Init();
7303
7304 TestDelegate d;
7305 std::unique_ptr<URLRequest> request(context.CreateRequest(
7306 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7307 request->Start();
7308 base::RunLoop().Run();
7309
7310 URLRequestFilter::GetInstance()->ClearHandlers();
7311}
7312
7313// TODO(juliatuttle): Figure out whether this restriction should be in place,
7314// and either implement it or remove this test.
7315TEST_F(URLRequestTestHTTP, DISABLED_DontForwardErrorToNelHttp) {
7316 URLRequestFailedJob::AddUrlHandler();
7317
7318 GURL request_url =
7319 URLRequestFailedJob::GetMockHttpUrl(ERR_CONNECTION_REFUSED);
7320
7321 TestNetworkDelegate network_delegate;
7322 TestNetworkErrorLoggingDelegate nel_delegate;
7323 TestURLRequestContext context(true);
7324 context.set_network_delegate(&network_delegate);
7325 context.set_network_error_logging_delegate(&nel_delegate);
7326 context.Init();
7327
7328 TestDelegate d;
7329 std::unique_ptr<URLRequest> request(context.CreateRequest(
7330 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7331 request->Start();
7332 base::RunLoop().Run();
7333
7334 EXPECT_TRUE(nel_delegate.errors().empty());
7335
7336 URLRequestFilter::GetInstance()->ClearHandlers();
7337}
7338
7339TEST_F(URLRequestTestHTTP, ForwardErrorToNelHttps) {
7340 URLRequestFailedJob::AddUrlHandler();
7341
7342 GURL request_url =
7343 URLRequestFailedJob::GetMockHttpsUrl(ERR_CONNECTION_REFUSED);
7344
7345 TestNetworkDelegate network_delegate;
7346 TestNetworkErrorLoggingDelegate nel_delegate;
7347 TestURLRequestContext context(true);
7348 context.set_network_delegate(&network_delegate);
7349 context.set_network_error_logging_delegate(&nel_delegate);
7350 context.Init();
7351
7352 TestDelegate d;
7353 std::unique_ptr<URLRequest> request(context.CreateRequest(
7354 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7355 request->Start();
7356 base::RunLoop().Run();
7357
7358 ASSERT_EQ(1u, nel_delegate.errors().size());
7359 EXPECT_EQ(request_url, nel_delegate.errors()[0].uri);
7360 EXPECT_EQ(0, nel_delegate.errors()[0].status_code);
7361 EXPECT_EQ(ERR_CONNECTION_REFUSED, nel_delegate.errors()[0].type);
7362
7363 URLRequestFilter::GetInstance()->ClearHandlers();
7364}
7365
7366#endif // BUILDFLAG(ENABLE_REPORTING)
7367
[email protected]316c1e5e2012-09-12 15:17:447368TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) {
tommycli59a63432015-11-06 00:10:557369 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447370
7371 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367372 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557373 http_test_server()->GetURL("/content-type-normalization.html"),
rhalavatib7bd7c792017-04-27 05:25:167374 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197375 req->Start();
[email protected]255620da2013-08-19 13:14:297376 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447377
7378 std::string mime_type;
[email protected]f7022f32014-08-21 16:32:197379 req->GetMimeType(&mime_type);
[email protected]316c1e5e2012-09-12 15:17:447380 EXPECT_EQ("text/html", mime_type);
7381
7382 std::string charset;
[email protected]f7022f32014-08-21 16:32:197383 req->GetCharset(&charset);
[email protected]316c1e5e2012-09-12 15:17:447384 EXPECT_EQ("utf-8", charset);
[email protected]f7022f32014-08-21 16:32:197385 req->Cancel();
[email protected]316c1e5e2012-09-12 15:17:447386}
7387
[email protected]02494ec2014-05-07 15:05:297388TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictDataRedirects) {
[email protected]e0f35c92013-05-08 16:04:347389 // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget().
[email protected]e0f35c92013-05-08 16:04:347390 GURL data_url("data:,foo");
[email protected]e0f35c92013-05-08 16:04:347391 DataProtocolHandler data_protocol_handler;
[email protected]588614c22013-08-16 00:09:027392 EXPECT_FALSE(data_protocol_handler.IsSafeRedirectTarget(data_url));
[email protected]e0f35c92013-05-08 16:04:347393
7394 // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget().
bengr1bf8e942014-11-07 01:36:507395 EXPECT_FALSE(job_factory_->IsSafeRedirectTarget(data_url));
[email protected]e0f35c92013-05-08 16:04:347396}
7397
brettwa1228ebb2016-10-28 03:51:347398#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]02494ec2014-05-07 15:05:297399TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictFileRedirects) {
7400 // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget().
7401 GURL file_url("file:///foo.txt");
skyostil4891b25b2015-06-11 11:43:457402 FileProtocolHandler file_protocol_handler(
7403 base::ThreadTaskRunnerHandle::Get());
[email protected]02494ec2014-05-07 15:05:297404 EXPECT_FALSE(file_protocol_handler.IsSafeRedirectTarget(file_url));
7405
7406 // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget().
bengr1bf8e942014-11-07 01:36:507407 EXPECT_FALSE(job_factory_->IsSafeRedirectTarget(file_url));
[email protected]02494ec2014-05-07 15:05:297408}
7409
[email protected]588614c22013-08-16 00:09:027410TEST_F(URLRequestTestHTTP, RestrictFileRedirects) {
tommycli59a63432015-11-06 00:10:557411 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447412
7413 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367414 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557415 http_test_server()->GetURL("/redirect-to-file.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167416 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197417 req->Start();
[email protected]255620da2013-08-19 13:14:297418 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447419
maksim.sisovb53724b52016-09-16 05:30:507420 EXPECT_EQ(ERR_UNSAFE_REDIRECT, d.request_status());
davidbend894710b2017-06-06 19:28:307421
7422 // The redirect should have been rejected before reporting it to the caller.
7423 EXPECT_EQ(0, d.received_redirect_count());
[email protected]316c1e5e2012-09-12 15:17:447424}
brettwa1228ebb2016-10-28 03:51:347425#endif // !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]316c1e5e2012-09-12 15:17:447426
[email protected]588614c22013-08-16 00:09:027427TEST_F(URLRequestTestHTTP, RestrictDataRedirects) {
tommycli59a63432015-11-06 00:10:557428 ASSERT_TRUE(http_test_server()->Start());
[email protected]588614c22013-08-16 00:09:027429
7430 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367431 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557432 http_test_server()->GetURL("/redirect-to-data.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167433 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197434 req->Start();
fdoray5eeb7642016-06-22 16:11:287435 base::RunLoop().Run();
[email protected]588614c22013-08-16 00:09:027436
maksim.sisovb53724b52016-09-16 05:30:507437 EXPECT_EQ(ERR_UNSAFE_REDIRECT, d.request_status());
davidbend894710b2017-06-06 19:28:307438
7439 // The redirect should have been rejected before reporting it to the
7440 // caller. See https://crbug.com/723796
7441 EXPECT_EQ(0, d.received_redirect_count());
[email protected]588614c22013-08-16 00:09:027442}
7443
davidbend894710b2017-06-06 19:28:307444// Test that redirects to invalid URLs are rejected. See
7445// https://crbug.com/462272.
[email protected]316c1e5e2012-09-12 15:17:447446TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) {
tommycli59a63432015-11-06 00:10:557447 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447448
7449 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367450 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557451 http_test_server()->GetURL("/redirect-to-invalid-url.html"),
rhalavatib7bd7c792017-04-27 05:25:167452 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197453 req->Start();
[email protected]255620da2013-08-19 13:14:297454 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447455
davidbend894710b2017-06-06 19:28:307456 EXPECT_EQ(1, d.response_started_count());
7457 EXPECT_EQ(ERR_INVALID_REDIRECT, d.request_status());
7458
7459 // The redirect should have been rejected before reporting it to the caller.
7460 EXPECT_EQ(0, d.received_redirect_count());
[email protected]316c1e5e2012-09-12 15:17:447461}
7462
[email protected]e50efea2014-03-24 18:41:007463// Make sure redirects are cached, despite not reading their bodies.
7464TEST_F(URLRequestTestHTTP, CacheRedirect) {
tommycli59a63432015-11-06 00:10:557465 ASSERT_TRUE(http_test_server()->Start());
[email protected]e50efea2014-03-24 18:41:007466 GURL redirect_url =
tommycli59a63432015-11-06 00:10:557467 http_test_server()->GetURL("/redirect302-to-echo-cacheable");
[email protected]e50efea2014-03-24 18:41:007468
7469 {
7470 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167471 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7472 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197473 req->Start();
[email protected]e50efea2014-03-24 18:41:007474 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:507475 EXPECT_EQ(OK, d.request_status());
[email protected]e50efea2014-03-24 18:41:007476 EXPECT_EQ(1, d.received_redirect_count());
tommycli59a63432015-11-06 00:10:557477 EXPECT_EQ(http_test_server()->GetURL("/echo"), req->url());
[email protected]e50efea2014-03-24 18:41:007478 }
7479
7480 {
7481 TestDelegate d;
7482 d.set_quit_on_redirect(true);
rhalavatib7bd7c792017-04-27 05:25:167483 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7484 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197485 req->Start();
[email protected]e50efea2014-03-24 18:41:007486 base::RunLoop().Run();
7487
7488 EXPECT_EQ(1, d.received_redirect_count());
7489 EXPECT_EQ(0, d.response_started_count());
[email protected]f7022f32014-08-21 16:32:197490 EXPECT_TRUE(req->was_cached());
[email protected]e50efea2014-03-24 18:41:007491
[email protected]f7022f32014-08-21 16:32:197492 req->FollowDeferredRedirect();
[email protected]e50efea2014-03-24 18:41:007493 base::RunLoop().Run();
7494 EXPECT_EQ(1, d.received_redirect_count());
7495 EXPECT_EQ(1, d.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:507496 EXPECT_EQ(OK, d.request_status());
tommycli59a63432015-11-06 00:10:557497 EXPECT_EQ(http_test_server()->GetURL("/echo"), req->url());
[email protected]e50efea2014-03-24 18:41:007498 }
7499}
7500
7501// Make sure a request isn't cached when a NetworkDelegate forces a redirect
7502// when the headers are read, since the body won't have been read.
7503TEST_F(URLRequestTestHTTP, NoCacheOnNetworkDelegateRedirect) {
tommycli59a63432015-11-06 00:10:557504 ASSERT_TRUE(http_test_server()->Start());
[email protected]e50efea2014-03-24 18:41:007505 // URL that is normally cached.
tommycli59a63432015-11-06 00:10:557506 GURL initial_url = http_test_server()->GetURL("/cachetime");
[email protected]e50efea2014-03-24 18:41:007507
7508 {
7509 // Set up the TestNetworkDelegate tp force a redirect.
tommycli59a63432015-11-06 00:10:557510 GURL redirect_to_url = http_test_server()->GetURL("/echo");
[email protected]e50efea2014-03-24 18:41:007511 default_network_delegate_.set_redirect_on_headers_received_url(
7512 redirect_to_url);
7513
7514 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167515 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7516 initial_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197517 req->Start();
[email protected]e50efea2014-03-24 18:41:007518 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:507519 EXPECT_EQ(OK, d.request_status());
[email protected]e50efea2014-03-24 18:41:007520 EXPECT_EQ(1, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:197521 EXPECT_EQ(redirect_to_url, req->url());
[email protected]e50efea2014-03-24 18:41:007522 }
7523
7524 {
7525 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167526 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7527 initial_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197528 req->Start();
[email protected]e50efea2014-03-24 18:41:007529 base::RunLoop().Run();
7530
maksim.sisovb53724b52016-09-16 05:30:507531 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197532 EXPECT_FALSE(req->was_cached());
[email protected]e50efea2014-03-24 18:41:007533 EXPECT_EQ(0, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:197534 EXPECT_EQ(initial_url, req->url());
[email protected]e50efea2014-03-24 18:41:007535 }
7536}
7537
[email protected]5f714132014-03-26 10:41:167538// Tests that redirection to an unsafe URL is allowed when it has been marked as
7539// safe.
7540TEST_F(URLRequestTestHTTP, UnsafeRedirectToWhitelistedUnsafeURL) {
tommycli59a63432015-11-06 00:10:557541 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167542
7543 GURL unsafe_url("data:text/html,this-is-considered-an-unsafe-url");
7544 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
7545 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
7546
7547 TestDelegate d;
7548 {
danakj8522a25b2016-04-16 00:17:367549 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167550 http_test_server()->GetURL("/whatever"), DEFAULT_PRIORITY, &d,
7551 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167552
[email protected]f7022f32014-08-21 16:32:197553 r->Start();
[email protected]5f714132014-03-26 10:41:167554 base::RunLoop().Run();
7555
maksim.sisovb53724b52016-09-16 05:30:507556 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197557 EXPECT_EQ(2U, r->url_chain().size());
[email protected]f7022f32014-08-21 16:32:197558 EXPECT_EQ(unsafe_url, r->url());
[email protected]5f714132014-03-26 10:41:167559 EXPECT_EQ("this-is-considered-an-unsafe-url", d.data_received());
7560 }
7561}
7562
7563// Tests that a redirect to a different unsafe URL is blocked, even after adding
7564// some other URL to the whitelist.
7565TEST_F(URLRequestTestHTTP, UnsafeRedirectToDifferentUnsafeURL) {
tommycli59a63432015-11-06 00:10:557566 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167567
7568 GURL unsafe_url("data:text/html,something");
7569 GURL different_unsafe_url("data:text/html,something-else");
7570 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
7571 default_network_delegate_.set_allowed_unsafe_redirect_url(
7572 different_unsafe_url);
7573
7574 TestDelegate d;
7575 {
danakj8522a25b2016-04-16 00:17:367576 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167577 http_test_server()->GetURL("/whatever"), DEFAULT_PRIORITY, &d,
7578 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167579
[email protected]f7022f32014-08-21 16:32:197580 r->Start();
[email protected]5f714132014-03-26 10:41:167581 base::RunLoop().Run();
7582
maksim.sisovb53724b52016-09-16 05:30:507583 EXPECT_EQ(ERR_UNSAFE_REDIRECT, d.request_status());
davidbend894710b2017-06-06 19:28:307584
7585 // The redirect should have been rejected before reporting it to the caller.
7586 EXPECT_EQ(0, d.received_redirect_count());
[email protected]5f714132014-03-26 10:41:167587 }
7588}
7589
[email protected]5f714132014-03-26 10:41:167590// Redirects from an URL with fragment to an unsafe URL with fragment should
7591// be allowed, and the reference fragment of the target URL should be preserved.
7592TEST_F(URLRequestTestHTTP, UnsafeRedirectWithDifferentReferenceFragment) {
tommycli59a63432015-11-06 00:10:557593 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167594
tommycli59a63432015-11-06 00:10:557595 GURL original_url(http_test_server()->GetURL("/original#fragment1"));
[email protected]5f714132014-03-26 10:41:167596 GURL unsafe_url("data:,url-marked-safe-and-used-in-redirect#fragment2");
7597 GURL expected_url("data:,url-marked-safe-and-used-in-redirect#fragment2");
7598
7599 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
7600 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
7601
7602 TestDelegate d;
7603 {
rhalavatib7bd7c792017-04-27 05:25:167604 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7605 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167606
[email protected]f7022f32014-08-21 16:32:197607 r->Start();
[email protected]5f714132014-03-26 10:41:167608 base::RunLoop().Run();
7609
[email protected]f7022f32014-08-21 16:32:197610 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:507611 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197612 EXPECT_EQ(original_url, r->original_url());
7613 EXPECT_EQ(expected_url, r->url());
[email protected]5f714132014-03-26 10:41:167614 }
7615}
7616
7617// When a delegate has specified a safe redirect URL, but it does not match the
7618// redirect target, then do not prevent the reference fragment from being added.
[email protected]f878230e2014-04-03 15:36:147619TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragmentAndUnrelatedUnsafeUrl) {
tommycli59a63432015-11-06 00:10:557620 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167621
tommycli59a63432015-11-06 00:10:557622 GURL original_url(http_test_server()->GetURL("/original#expected-fragment"));
[email protected]5f714132014-03-26 10:41:167623 GURL unsafe_url("data:text/html,this-url-does-not-match-redirect-url");
tommycli59a63432015-11-06 00:10:557624 GURL redirect_url(http_test_server()->GetURL("/target"));
7625 GURL expected_redirect_url(
7626 http_test_server()->GetURL("/target#expected-fragment"));
[email protected]5f714132014-03-26 10:41:167627
7628 default_network_delegate_.set_redirect_on_headers_received_url(redirect_url);
7629 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
7630
7631 TestDelegate d;
7632 {
rhalavatib7bd7c792017-04-27 05:25:167633 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7634 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167635
[email protected]f7022f32014-08-21 16:32:197636 r->Start();
[email protected]5f714132014-03-26 10:41:167637 base::RunLoop().Run();
7638
[email protected]f7022f32014-08-21 16:32:197639 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:507640 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197641 EXPECT_EQ(original_url, r->original_url());
7642 EXPECT_EQ(expected_redirect_url, r->url());
[email protected]5f714132014-03-26 10:41:167643 }
7644}
7645
[email protected]f878230e2014-04-03 15:36:147646// When a delegate has specified a safe redirect URL, assume that the redirect
7647// URL should not be changed. In particular, the reference fragment should not
7648// be modified.
7649TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragment) {
tommycli59a63432015-11-06 00:10:557650 ASSERT_TRUE(http_test_server()->Start());
[email protected]f878230e2014-04-03 15:36:147651
tommycli59a63432015-11-06 00:10:557652 GURL original_url(
7653 http_test_server()->GetURL("/original#should-not-be-appended"));
[email protected]f878230e2014-04-03 15:36:147654 GURL redirect_url("data:text/html,expect-no-reference-fragment");
7655
7656 default_network_delegate_.set_redirect_on_headers_received_url(redirect_url);
7657 default_network_delegate_.set_allowed_unsafe_redirect_url(redirect_url);
7658
7659 TestDelegate d;
7660 {
rhalavatib7bd7c792017-04-27 05:25:167661 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7662 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f878230e2014-04-03 15:36:147663
[email protected]f7022f32014-08-21 16:32:197664 r->Start();
[email protected]f878230e2014-04-03 15:36:147665 base::RunLoop().Run();
7666
[email protected]f7022f32014-08-21 16:32:197667 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:507668 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197669 EXPECT_EQ(original_url, r->original_url());
7670 EXPECT_EQ(redirect_url, r->url());
[email protected]f878230e2014-04-03 15:36:147671 }
7672}
7673
7674// When a URLRequestRedirectJob is created, the redirection must be followed and
7675// the reference fragment of the target URL must not be modified.
7676TEST_F(URLRequestTestHTTP, RedirectJobWithReferenceFragment) {
tommycli59a63432015-11-06 00:10:557677 ASSERT_TRUE(http_test_server()->Start());
[email protected]f878230e2014-04-03 15:36:147678
tommycli59a63432015-11-06 00:10:557679 GURL original_url(
7680 http_test_server()->GetURL("/original#should-not-be-appended"));
7681 GURL redirect_url(http_test_server()->GetURL("/echo"));
[email protected]f878230e2014-04-03 15:36:147682
7683 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167684 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7685 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f878230e2014-04-03 15:36:147686
danakj8522a25b2016-04-16 00:17:367687 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
[email protected]f7022f32014-08-21 16:32:197688 r.get(), &default_network_delegate_, redirect_url,
mmenkeed0498b2015-12-08 23:20:427689 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"));
7690 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]f878230e2014-04-03 15:36:147691
[email protected]f7022f32014-08-21 16:32:197692 r->Start();
[email protected]f878230e2014-04-03 15:36:147693 base::RunLoop().Run();
7694
maksim.sisovb53724b52016-09-16 05:30:507695 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197696 EXPECT_EQ(original_url, r->original_url());
7697 EXPECT_EQ(redirect_url, r->url());
[email protected]f878230e2014-04-03 15:36:147698}
7699
lizeb5120f6dc2016-02-19 09:29:447700TEST_F(URLRequestTestHTTP, UnsupportedReferrerScheme) {
7701 ASSERT_TRUE(http_test_server()->Start());
7702
7703 const std::string referrer("foobar://totally.legit.referrer");
7704 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367705 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167706 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7707 TRAFFIC_ANNOTATION_FOR_TESTS));
lizeb5120f6dc2016-02-19 09:29:447708 req->SetReferrer(referrer);
7709 req->Start();
7710 base::RunLoop().Run();
7711
7712 EXPECT_EQ(std::string("None"), d.data_received());
7713}
7714
[email protected]316c1e5e2012-09-12 15:17:447715TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) {
tommycli59a63432015-11-06 00:10:557716 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447717
7718 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367719 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167720 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7721 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197722 req->SetReferrer("http://user:[email protected]/");
7723 req->Start();
[email protected]255620da2013-08-19 13:14:297724 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447725
7726 EXPECT_EQ(std::string("http://foo.com/"), d.data_received());
7727}
7728
[email protected]99ecf6e2013-04-10 22:46:137729TEST_F(URLRequestTestHTTP, NoFragmentInReferrer) {
tommycli59a63432015-11-06 00:10:557730 ASSERT_TRUE(http_test_server()->Start());
[email protected]99ecf6e2013-04-10 22:46:137731
7732 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367733 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167734 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7735 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197736 req->SetReferrer("http://foo.com/test#fragment");
7737 req->Start();
[email protected]255620da2013-08-19 13:14:297738 base::RunLoop().Run();
[email protected]99ecf6e2013-04-10 22:46:137739
7740 EXPECT_EQ(std::string("http://foo.com/test"), d.data_received());
7741}
7742
7743TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) {
tommycli59a63432015-11-06 00:10:557744 ASSERT_TRUE(http_test_server()->Start());
[email protected]99ecf6e2013-04-10 22:46:137745
7746 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367747 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167748 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7749 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197750 req->SetReferrer("http://foo.com/test#fragment");
7751 req->SetReferrer("");
7752 req->Start();
[email protected]255620da2013-08-19 13:14:297753 base::RunLoop().Run();
[email protected]99ecf6e2013-04-10 22:46:137754
7755 EXPECT_EQ(std::string("None"), d.data_received());
7756}
7757
[email protected]316c1e5e2012-09-12 15:17:447758TEST_F(URLRequestTestHTTP, CancelRedirect) {
tommycli59a63432015-11-06 00:10:557759 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447760
7761 TestDelegate d;
7762 {
7763 d.set_cancel_in_received_redirect(true);
danakj8522a25b2016-04-16 00:17:367764 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167765 http_test_server()->GetURL("/redirect-test.html"), DEFAULT_PRIORITY, &d,
7766 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197767 req->Start();
[email protected]255620da2013-08-19 13:14:297768 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447769
7770 EXPECT_EQ(1, d.response_started_count());
7771 EXPECT_EQ(0, d.bytes_received());
7772 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507773 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:447774 }
7775}
7776
7777TEST_F(URLRequestTestHTTP, DeferredRedirect) {
tommycli59a63432015-11-06 00:10:557778 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447779
7780 TestDelegate d;
7781 {
7782 d.set_quit_on_redirect(true);
tommycli59a63432015-11-06 00:10:557783 GURL test_url(http_test_server()->GetURL("/redirect-test.html"));
rhalavatib7bd7c792017-04-27 05:25:167784 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7785 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]79e1fd62013-06-20 06:50:047786
[email protected]f7022f32014-08-21 16:32:197787 req->Start();
[email protected]255620da2013-08-19 13:14:297788 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447789
7790 EXPECT_EQ(1, d.received_redirect_count());
Shivani Sharmac18f9762017-10-23 16:43:237791 EXPECT_TRUE(d.have_full_request_headers());
7792 CheckFullRequestHeaders(d.full_request_headers(), test_url);
7793 d.ClearFullRequestHeaders();
[email protected]316c1e5e2012-09-12 15:17:447794
[email protected]f7022f32014-08-21 16:32:197795 req->FollowDeferredRedirect();
[email protected]255620da2013-08-19 13:14:297796 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447797
7798 EXPECT_EQ(1, d.response_started_count());
7799 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507800 EXPECT_EQ(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:447801
[email protected]6cdfd7f2013-02-08 20:40:157802 base::FilePath path;
[email protected]316c1e5e2012-09-12 15:17:447803 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:477804 path = path.Append(kTestFilePath);
[email protected]316c1e5e2012-09-12 15:17:447805 path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
7806
7807 std::string contents;
[email protected]82f84b92013-08-30 18:23:507808 EXPECT_TRUE(base::ReadFileToString(path, &contents));
[email protected]316c1e5e2012-09-12 15:17:447809 EXPECT_EQ(contents, d.data_received());
7810 }
7811}
7812
[email protected]79e1fd62013-06-20 06:50:047813TEST_F(URLRequestTestHTTP, DeferredRedirect_GetFullRequestHeaders) {
tommycli59a63432015-11-06 00:10:557814 ASSERT_TRUE(http_test_server()->Start());
[email protected]79e1fd62013-06-20 06:50:047815
7816 TestDelegate d;
7817 {
7818 d.set_quit_on_redirect(true);
tommycli59a63432015-11-06 00:10:557819 GURL test_url(http_test_server()->GetURL("/redirect-test.html"));
rhalavatib7bd7c792017-04-27 05:25:167820 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7821 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]79e1fd62013-06-20 06:50:047822
7823 EXPECT_FALSE(d.have_full_request_headers());
7824
[email protected]f7022f32014-08-21 16:32:197825 req->Start();
[email protected]255620da2013-08-19 13:14:297826 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:047827
7828 EXPECT_EQ(1, d.received_redirect_count());
[email protected]79e1fd62013-06-20 06:50:047829
[email protected]f7022f32014-08-21 16:32:197830 req->FollowDeferredRedirect();
[email protected]255620da2013-08-19 13:14:297831 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:047832
tommycli59a63432015-11-06 00:10:557833 GURL target_url(http_test_server()->GetURL("/with-headers.html"));
[email protected]79e1fd62013-06-20 06:50:047834 EXPECT_EQ(1, d.response_started_count());
7835 EXPECT_TRUE(d.have_full_request_headers());
7836 CheckFullRequestHeaders(d.full_request_headers(), target_url);
7837 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507838 EXPECT_EQ(OK, d.request_status());
[email protected]79e1fd62013-06-20 06:50:047839
7840 base::FilePath path;
7841 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:477842 path = path.Append(kTestFilePath);
[email protected]79e1fd62013-06-20 06:50:047843 path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
7844
7845 std::string contents;
[email protected]82f84b92013-08-30 18:23:507846 EXPECT_TRUE(base::ReadFileToString(path, &contents));
[email protected]79e1fd62013-06-20 06:50:047847 EXPECT_EQ(contents, d.data_received());
7848 }
7849}
7850
[email protected]316c1e5e2012-09-12 15:17:447851TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) {
tommycli59a63432015-11-06 00:10:557852 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447853
7854 TestDelegate d;
7855 {
7856 d.set_quit_on_redirect(true);
danakj8522a25b2016-04-16 00:17:367857 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167858 http_test_server()->GetURL("/redirect-test.html"), DEFAULT_PRIORITY, &d,
7859 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197860 req->Start();
[email protected]255620da2013-08-19 13:14:297861 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447862
7863 EXPECT_EQ(1, d.received_redirect_count());
7864
[email protected]f7022f32014-08-21 16:32:197865 req->Cancel();
[email protected]255620da2013-08-19 13:14:297866 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447867
7868 EXPECT_EQ(1, d.response_started_count());
7869 EXPECT_EQ(0, d.bytes_received());
7870 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507871 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:447872 }
7873}
7874
7875TEST_F(URLRequestTestHTTP, VaryHeader) {
tommycli59a63432015-11-06 00:10:557876 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447877
[email protected]3b23a222013-05-15 21:33:257878 // Populate the cache.
[email protected]316c1e5e2012-09-12 15:17:447879 {
7880 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367881 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557882 http_test_server()->GetURL("/echoheadercache?foo"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167883 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:447884 HttpRequestHeaders headers;
7885 headers.SetHeader("foo", "1");
[email protected]f7022f32014-08-21 16:32:197886 req->SetExtraRequestHeaders(headers);
7887 req->Start();
[email protected]255620da2013-08-19 13:14:297888 base::RunLoop().Run();
[email protected]3b23a222013-05-15 21:33:257889
7890 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:197891 req->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:257892 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
[email protected]316c1e5e2012-09-12 15:17:447893 }
7894
[email protected]3b23a222013-05-15 21:33:257895 // Expect a cache hit.
[email protected]316c1e5e2012-09-12 15:17:447896 {
7897 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367898 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557899 http_test_server()->GetURL("/echoheadercache?foo"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167900 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:447901 HttpRequestHeaders headers;
7902 headers.SetHeader("foo", "1");
[email protected]f7022f32014-08-21 16:32:197903 req->SetExtraRequestHeaders(headers);
7904 req->Start();
[email protected]255620da2013-08-19 13:14:297905 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447906
[email protected]f7022f32014-08-21 16:32:197907 EXPECT_TRUE(req->was_cached());
[email protected]3b23a222013-05-15 21:33:257908
7909 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:197910 req->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:257911 TestLoadTimingCacheHitNoNetwork(load_timing_info);
[email protected]316c1e5e2012-09-12 15:17:447912 }
7913
[email protected]3b23a222013-05-15 21:33:257914 // Expect a cache miss.
[email protected]316c1e5e2012-09-12 15:17:447915 {
7916 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367917 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557918 http_test_server()->GetURL("/echoheadercache?foo"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167919 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:447920 HttpRequestHeaders headers;
7921 headers.SetHeader("foo", "2");
[email protected]f7022f32014-08-21 16:32:197922 req->SetExtraRequestHeaders(headers);
7923 req->Start();
[email protected]255620da2013-08-19 13:14:297924 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447925
[email protected]f7022f32014-08-21 16:32:197926 EXPECT_FALSE(req->was_cached());
[email protected]3b23a222013-05-15 21:33:257927
7928 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:197929 req->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:257930 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
[email protected]316c1e5e2012-09-12 15:17:447931 }
7932}
7933
7934TEST_F(URLRequestTestHTTP, BasicAuth) {
tommycli59a63432015-11-06 00:10:557935 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447936
7937 // populate the cache
7938 {
7939 TestDelegate d;
7940 d.set_credentials(AuthCredentials(kUser, kSecret));
7941
danakj8522a25b2016-04-16 00:17:367942 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167943 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
7944 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197945 r->Start();
[email protected]316c1e5e2012-09-12 15:17:447946
[email protected]255620da2013-08-19 13:14:297947 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447948
7949 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
7950 }
7951
7952 // repeat request with end-to-end validation. since auth-basic results in a
7953 // cachable page, we expect this test to result in a 304. in which case, the
7954 // response should be fetched from the cache.
7955 {
7956 TestDelegate d;
7957 d.set_credentials(AuthCredentials(kUser, kSecret));
7958
danakj8522a25b2016-04-16 00:17:367959 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167960 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
7961 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197962 r->SetLoadFlags(LOAD_VALIDATE_CACHE);
7963 r->Start();
[email protected]316c1e5e2012-09-12 15:17:447964
[email protected]255620da2013-08-19 13:14:297965 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447966
7967 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
7968
7969 // Should be the same cached document.
[email protected]f7022f32014-08-21 16:32:197970 EXPECT_TRUE(r->was_cached());
[email protected]316c1e5e2012-09-12 15:17:447971 }
7972}
7973
7974// Check that Set-Cookie headers in 401 responses are respected.
7975// http://crbug.com/6450
7976TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) {
tommycli59a63432015-11-06 00:10:557977 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447978
7979 GURL url_requiring_auth =
tommycli59a63432015-11-06 00:10:557980 http_test_server()->GetURL("/auth-basic?set-cookie-if-challenged");
[email protected]316c1e5e2012-09-12 15:17:447981
7982 // Request a page that will give a 401 containing a Set-Cookie header.
7983 // Verify that when the transaction is restarted, it includes the new cookie.
7984 {
[email protected]ceefd7fd2012-11-29 00:36:247985 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:447986 TestURLRequestContext context(true);
7987 context.set_network_delegate(&network_delegate);
7988 context.Init();
7989
7990 TestDelegate d;
7991 d.set_credentials(AuthCredentials(kUser, kSecret));
7992
danakj8522a25b2016-04-16 00:17:367993 std::unique_ptr<URLRequest> r(
rhalavatib7bd7c792017-04-27 05:25:167994 context.CreateRequest(url_requiring_auth, DEFAULT_PRIORITY, &d,
7995 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197996 r->Start();
[email protected]316c1e5e2012-09-12 15:17:447997
[email protected]255620da2013-08-19 13:14:297998 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447999
8000 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8001
8002 // Make sure we sent the cookie in the restarted transaction.
8003 EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
8004 != std::string::npos);
8005 }
8006
8007 // Same test as above, except this time the restart is initiated earlier
8008 // (without user intervention since identity is embedded in the URL).
8009 {
[email protected]ceefd7fd2012-11-29 00:36:248010 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:448011 TestURLRequestContext context(true);
8012 context.set_network_delegate(&network_delegate);
8013 context.Init();
8014
8015 TestDelegate d;
8016
8017 GURL::Replacements replacements;
mgiuca77752c32015-02-05 07:31:188018 replacements.SetUsernameStr("user2");
8019 replacements.SetPasswordStr("secret");
[email protected]316c1e5e2012-09-12 15:17:448020 GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements);
8021
rhalavatib7bd7c792017-04-27 05:25:168022 std::unique_ptr<URLRequest> r(context.CreateRequest(
8023 url_with_identity, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198024 r->Start();
[email protected]316c1e5e2012-09-12 15:17:448025
[email protected]255620da2013-08-19 13:14:298026 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448027
8028 EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos);
8029
8030 // Make sure we sent the cookie in the restarted transaction.
8031 EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
8032 != std::string::npos);
8033 }
8034}
8035
[email protected]58e32bb2013-01-21 18:23:258036// Tests that load timing works as expected with auth and the cache.
8037TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) {
tommycli59a63432015-11-06 00:10:558038 ASSERT_TRUE(http_test_server()->Start());
[email protected]58e32bb2013-01-21 18:23:258039
8040 // populate the cache
8041 {
8042 TestDelegate d;
8043 d.set_credentials(AuthCredentials(kUser, kSecret));
8044
danakj8522a25b2016-04-16 00:17:368045 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168046 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
8047 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198048 r->Start();
[email protected]58e32bb2013-01-21 18:23:258049
[email protected]255620da2013-08-19 13:14:298050 base::RunLoop().Run();
[email protected]58e32bb2013-01-21 18:23:258051
8052 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8053
8054 LoadTimingInfo load_timing_info_before_auth;
8055 EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeAuth(
8056 &load_timing_info_before_auth));
8057 TestLoadTimingNotReused(load_timing_info_before_auth,
8058 CONNECT_TIMING_HAS_DNS_TIMES);
8059
8060 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:198061 r->GetLoadTimingInfo(&load_timing_info);
[email protected]58e32bb2013-01-21 18:23:258062 // The test server does not support keep alive sockets, so the second
8063 // request with auth should use a new socket.
8064 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
8065 EXPECT_NE(load_timing_info_before_auth.socket_log_id,
8066 load_timing_info.socket_log_id);
8067 EXPECT_LE(load_timing_info_before_auth.receive_headers_end,
8068 load_timing_info.connect_timing.connect_start);
8069 }
8070
[email protected]3b23a222013-05-15 21:33:258071 // Repeat request with end-to-end validation. Since auth-basic results in a
8072 // cachable page, we expect this test to result in a 304. In which case, the
[email protected]58e32bb2013-01-21 18:23:258073 // response should be fetched from the cache.
8074 {
8075 TestDelegate d;
8076 d.set_credentials(AuthCredentials(kUser, kSecret));
8077
danakj8522a25b2016-04-16 00:17:368078 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168079 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
8080 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198081 r->SetLoadFlags(LOAD_VALIDATE_CACHE);
8082 r->Start();
[email protected]58e32bb2013-01-21 18:23:258083
[email protected]255620da2013-08-19 13:14:298084 base::RunLoop().Run();
[email protected]58e32bb2013-01-21 18:23:258085
8086 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8087
8088 // Should be the same cached document.
[email protected]f7022f32014-08-21 16:32:198089 EXPECT_TRUE(r->was_cached());
[email protected]58e32bb2013-01-21 18:23:258090
[email protected]3b23a222013-05-15 21:33:258091 // Since there was a request that went over the wire, the load timing
8092 // information should include connection times.
[email protected]58e32bb2013-01-21 18:23:258093 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:198094 r->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:258095 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
[email protected]58e32bb2013-01-21 18:23:258096 }
8097}
8098
[email protected]316c1e5e2012-09-12 15:17:448099// In this test, we do a POST which the server will 302 redirect.
8100// The subsequent transaction should use GET, and should not send the
8101// Content-Type header.
8102// http://code.google.com/p/chromium/issues/detail?id=843
8103TEST_F(URLRequestTestHTTP, Post302RedirectGet) {
tommycli59a63432015-11-06 00:10:558104 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448105
8106 const char kData[] = "hello world";
8107
8108 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368109 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168110 http_test_server()->GetURL("/redirect-to-echoall"), DEFAULT_PRIORITY, &d,
8111 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198112 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:078113 req->set_upload(CreateSimpleUploadData(kData));
[email protected]316c1e5e2012-09-12 15:17:448114
8115 // Set headers (some of which are specific to the POST).
8116 HttpRequestHeaders headers;
8117 headers.AddHeadersFromString(
8118 "Content-Type: multipart/form-data; "
8119 "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n"
8120 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,"
8121 "text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
8122 "Accept-Language: en-US,en\r\n"
8123 "Accept-Charset: ISO-8859-1,*,utf-8\r\n"
8124 "Content-Length: 11\r\n"
8125 "Origin: http://localhost:1337/");
[email protected]f7022f32014-08-21 16:32:198126 req->SetExtraRequestHeaders(headers);
8127 req->Start();
[email protected]255620da2013-08-19 13:14:298128 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448129
8130 std::string mime_type;
[email protected]f7022f32014-08-21 16:32:198131 req->GetMimeType(&mime_type);
[email protected]316c1e5e2012-09-12 15:17:448132 EXPECT_EQ("text/html", mime_type);
8133
8134 const std::string& data = d.data_received();
8135
8136 // Check that the post-specific headers were stripped:
8137 EXPECT_FALSE(ContainsString(data, "Content-Length:"));
8138 EXPECT_FALSE(ContainsString(data, "Content-Type:"));
Yutaka Hirano957d722f2017-08-31 08:40:498139 EXPECT_FALSE(ContainsString(data, "Origin:"));
[email protected]316c1e5e2012-09-12 15:17:448140
8141 // These extra request headers should not have been stripped.
8142 EXPECT_TRUE(ContainsString(data, "Accept:"));
8143 EXPECT_TRUE(ContainsString(data, "Accept-Language:"));
8144 EXPECT_TRUE(ContainsString(data, "Accept-Charset:"));
8145}
8146
jww5fe460ff2015-03-28 00:22:518147// The following tests check that we handle mutating the request for HTTP
8148// redirects as expected.
8149// See https://crbug.com/56373, https://crbug.com/102130, and
8150// https://crbug.com/465517.
[email protected]316c1e5e2012-09-12 15:17:448151
8152TEST_F(URLRequestTestHTTP, Redirect301Tests) {
tommycli59a63432015-11-06 00:10:558153 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448154
tommycli59a63432015-11-06 00:10:558155 const GURL url = http_test_server()->GetURL("/redirect301-to-echo");
jww5fe460ff2015-03-28 00:22:518156 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558157 http_test_server()->GetURL("/redirect301-to-https");
[email protected]316c1e5e2012-09-12 15:17:448158
8159 HTTPRedirectMethodTest(url, "POST", "GET", true);
8160 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8161 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518162
8163 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8164 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
Yutaka Hirano957d722f2017-08-31 08:40:498165 HTTPRedirectOriginHeaderTest(url, "POST", "GET", std::string());
8166 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "GET",
8167 std::string());
Alex Clarke1e08882b32017-10-06 14:22:408168 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8169 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]316c1e5e2012-09-12 15:17:448170}
8171
8172TEST_F(URLRequestTestHTTP, Redirect302Tests) {
tommycli59a63432015-11-06 00:10:558173 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448174
tommycli59a63432015-11-06 00:10:558175 const GURL url = http_test_server()->GetURL("/redirect302-to-echo");
jww5fe460ff2015-03-28 00:22:518176 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558177 http_test_server()->GetURL("/redirect302-to-https");
[email protected]316c1e5e2012-09-12 15:17:448178
8179 HTTPRedirectMethodTest(url, "POST", "GET", true);
8180 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8181 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518182
8183 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8184 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
Yutaka Hirano957d722f2017-08-31 08:40:498185 HTTPRedirectOriginHeaderTest(url, "POST", "GET", std::string());
8186 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "GET",
8187 std::string());
Alex Clarke1e08882b32017-10-06 14:22:408188 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8189 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]316c1e5e2012-09-12 15:17:448190}
8191
8192TEST_F(URLRequestTestHTTP, Redirect303Tests) {
tommycli59a63432015-11-06 00:10:558193 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448194
tommycli59a63432015-11-06 00:10:558195 const GURL url = http_test_server()->GetURL("/redirect303-to-echo");
jww5fe460ff2015-03-28 00:22:518196 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558197 http_test_server()->GetURL("/redirect303-to-https");
[email protected]316c1e5e2012-09-12 15:17:448198
8199 HTTPRedirectMethodTest(url, "POST", "GET", true);
8200 HTTPRedirectMethodTest(url, "PUT", "GET", true);
8201 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518202
Alex Clarke1e08882b32017-10-06 14:22:408203 HTTPRedirectOriginHeaderTest(url, "CONNECT", "GET", std::string());
8204 HTTPRedirectOriginHeaderTest(https_redirect_url, "CONNECT", "GET",
8205 std::string());
8206 HTTPRedirectOriginHeaderTest(url, "DELETE", "GET", std::string());
8207 HTTPRedirectOriginHeaderTest(https_redirect_url, "DELETE", "GET",
8208 std::string());
jww5fe460ff2015-03-28 00:22:518209 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8210 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
Alex Clarke1e08882b32017-10-06 14:22:408211 HTTPRedirectOriginHeaderTest(url, "HEAD", "HEAD", url.GetOrigin().spec());
8212 HTTPRedirectOriginHeaderTest(https_redirect_url, "HEAD", "HEAD", "null");
8213 HTTPRedirectOriginHeaderTest(url, "OPTIONS", "GET", std::string());
8214 HTTPRedirectOriginHeaderTest(https_redirect_url, "OPTIONS", "GET",
8215 std::string());
Yutaka Hirano957d722f2017-08-31 08:40:498216 HTTPRedirectOriginHeaderTest(url, "POST", "GET", std::string());
8217 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "GET",
8218 std::string());
Alex Clarke1e08882b32017-10-06 14:22:408219 HTTPRedirectOriginHeaderTest(url, "PUT", "GET", std::string());
8220 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "GET", std::string());
[email protected]316c1e5e2012-09-12 15:17:448221}
8222
8223TEST_F(URLRequestTestHTTP, Redirect307Tests) {
tommycli59a63432015-11-06 00:10:558224 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448225
tommycli59a63432015-11-06 00:10:558226 const GURL url = http_test_server()->GetURL("/redirect307-to-echo");
jww5fe460ff2015-03-28 00:22:518227 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558228 http_test_server()->GetURL("/redirect307-to-https");
[email protected]316c1e5e2012-09-12 15:17:448229
8230 HTTPRedirectMethodTest(url, "POST", "POST", true);
8231 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8232 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518233
8234 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8235 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
8236 HTTPRedirectOriginHeaderTest(url, "POST", "POST", url.GetOrigin().spec());
8237 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "POST", "null");
Alex Clarke1e08882b32017-10-06 14:22:408238 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8239 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]316c1e5e2012-09-12 15:17:448240}
8241
[email protected]0a17aab32014-04-24 03:32:378242TEST_F(URLRequestTestHTTP, Redirect308Tests) {
tommycli59a63432015-11-06 00:10:558243 ASSERT_TRUE(http_test_server()->Start());
[email protected]0a17aab32014-04-24 03:32:378244
tommycli59a63432015-11-06 00:10:558245 const GURL url = http_test_server()->GetURL("/redirect308-to-echo");
jww5fe460ff2015-03-28 00:22:518246 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558247 http_test_server()->GetURL("/redirect308-to-https");
[email protected]0a17aab32014-04-24 03:32:378248
8249 HTTPRedirectMethodTest(url, "POST", "POST", true);
8250 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8251 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518252
8253 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8254 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
8255 HTTPRedirectOriginHeaderTest(url, "POST", "POST", url.GetOrigin().spec());
8256 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "POST", "null");
Alex Clarke1e08882b32017-10-06 14:22:408257 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8258 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]0a17aab32014-04-24 03:32:378259}
8260
8261// Make sure that 308 responses without bodies are not treated as redirects.
8262// Certain legacy apis that pre-date the response code expect this behavior
8263// (Like Google Drive).
8264TEST_F(URLRequestTestHTTP, NoRedirectOn308WithoutLocationHeader) {
tommycli59a63432015-11-06 00:10:558265 ASSERT_TRUE(http_test_server()->Start());
[email protected]0a17aab32014-04-24 03:32:378266
8267 TestDelegate d;
tommycli59a63432015-11-06 00:10:558268 const GURL url = http_test_server()->GetURL("/308-without-location-header");
[email protected]0a17aab32014-04-24 03:32:378269
rhalavatib7bd7c792017-04-27 05:25:168270 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
8271 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]0a17aab32014-04-24 03:32:378272
[email protected]f7022f32014-08-21 16:32:198273 request->Start();
[email protected]0a17aab32014-04-24 03:32:378274 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:508275 EXPECT_EQ(OK, d.request_status());
[email protected]0a17aab32014-04-24 03:32:378276 EXPECT_EQ(0, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:198277 EXPECT_EQ(308, request->response_headers()->response_code());
[email protected]0a17aab32014-04-24 03:32:378278 EXPECT_EQ("This is not a redirect.", d.data_received());
8279}
8280
[email protected]f878230e2014-04-03 15:36:148281TEST_F(URLRequestTestHTTP, Redirect302PreserveReferenceFragment) {
tommycli59a63432015-11-06 00:10:558282 ASSERT_TRUE(http_test_server()->Start());
[email protected]f878230e2014-04-03 15:36:148283
tommycli59a63432015-11-06 00:10:558284 GURL original_url(
8285 http_test_server()->GetURL("/redirect302-to-echo#fragment"));
8286 GURL expected_url(http_test_server()->GetURL("/echo#fragment"));
[email protected]f878230e2014-04-03 15:36:148287
8288 TestDelegate d;
8289 {
rhalavatib7bd7c792017-04-27 05:25:168290 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
8291 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f878230e2014-04-03 15:36:148292
[email protected]f7022f32014-08-21 16:32:198293 r->Start();
[email protected]f878230e2014-04-03 15:36:148294 base::RunLoop().Run();
8295
[email protected]f7022f32014-08-21 16:32:198296 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:508297 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:198298 EXPECT_EQ(original_url, r->original_url());
8299 EXPECT_EQ(expected_url, r->url());
[email protected]f878230e2014-04-03 15:36:148300 }
8301}
8302
[email protected]cba24642014-08-15 20:49:598303TEST_F(URLRequestTestHTTP, RedirectPreserveFirstPartyURL) {
tommycli59a63432015-11-06 00:10:558304 ASSERT_TRUE(http_test_server()->Start());
[email protected]cba24642014-08-15 20:49:598305
tommycli59a63432015-11-06 00:10:558306 GURL url(http_test_server()->GetURL("/redirect302-to-echo"));
[email protected]cba24642014-08-15 20:49:598307 GURL first_party_url("http://example.com");
8308
8309 TestDelegate d;
8310 {
rhalavatib7bd7c792017-04-27 05:25:168311 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
8312 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:468313 r->set_site_for_cookies(first_party_url);
[email protected]cba24642014-08-15 20:49:598314
[email protected]f7022f32014-08-21 16:32:198315 r->Start();
[email protected]cba24642014-08-15 20:49:598316 base::RunLoop().Run();
8317
[email protected]f7022f32014-08-21 16:32:198318 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:508319 EXPECT_EQ(OK, d.request_status());
Mike Westb85da8ed2017-08-10 14:16:468320 EXPECT_EQ(first_party_url, r->site_for_cookies());
[email protected]cba24642014-08-15 20:49:598321 }
8322}
8323
8324TEST_F(URLRequestTestHTTP, RedirectUpdateFirstPartyURL) {
tommycli59a63432015-11-06 00:10:558325 ASSERT_TRUE(http_test_server()->Start());
[email protected]cba24642014-08-15 20:49:598326
tommycli59a63432015-11-06 00:10:558327 GURL url(http_test_server()->GetURL("/redirect302-to-echo"));
[email protected]cba24642014-08-15 20:49:598328 GURL original_first_party_url("http://example.com");
tommycli59a63432015-11-06 00:10:558329 GURL expected_first_party_url(http_test_server()->GetURL("/echo"));
[email protected]cba24642014-08-15 20:49:598330
8331 TestDelegate d;
8332 {
rhalavatib7bd7c792017-04-27 05:25:168333 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
8334 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:468335 r->set_site_for_cookies(original_first_party_url);
[email protected]f7022f32014-08-21 16:32:198336 r->set_first_party_url_policy(
[email protected]cba24642014-08-15 20:49:598337 URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT);
8338
[email protected]f7022f32014-08-21 16:32:198339 r->Start();
[email protected]cba24642014-08-15 20:49:598340 base::RunLoop().Run();
8341
[email protected]f7022f32014-08-21 16:32:198342 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:508343 EXPECT_EQ(OK, d.request_status());
Mike Westb85da8ed2017-08-10 14:16:468344 EXPECT_EQ(expected_first_party_url, r->site_for_cookies());
[email protected]cba24642014-08-15 20:49:598345 }
8346}
8347
[email protected]316c1e5e2012-09-12 15:17:448348TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) {
tommycli59a63432015-11-06 00:10:558349 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448350
8351 const char kData[] = "hello world";
8352
8353 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368354 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168355 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
8356 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198357 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:078358 req->set_upload(CreateSimpleUploadData(kData));
[email protected]316c1e5e2012-09-12 15:17:448359 HttpRequestHeaders headers;
8360 headers.SetHeader(HttpRequestHeaders::kContentLength,
riceac912aec2015-07-09 07:26:518361 base::SizeTToString(arraysize(kData) - 1));
[email protected]f7022f32014-08-21 16:32:198362 req->SetExtraRequestHeaders(headers);
[email protected]316c1e5e2012-09-12 15:17:448363
danakj8522a25b2016-04-16 00:17:368364 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
tommycli59a63432015-11-06 00:10:558365 req.get(), &default_network_delegate_,
8366 http_test_server()->GetURL("/echo"),
mmenkeed0498b2015-12-08 23:20:428367 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"));
8368 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]316c1e5e2012-09-12 15:17:448369
[email protected]f7022f32014-08-21 16:32:198370 req->Start();
[email protected]255620da2013-08-19 13:14:298371 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:198372 EXPECT_EQ("GET", req->method());
[email protected]316c1e5e2012-09-12 15:17:448373}
8374
8375TEST_F(URLRequestTestHTTP, InterceptPost307RedirectPost) {
tommycli59a63432015-11-06 00:10:558376 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448377
8378 const char kData[] = "hello world";
8379
8380 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368381 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168382 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
8383 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198384 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:078385 req->set_upload(CreateSimpleUploadData(kData));
[email protected]316c1e5e2012-09-12 15:17:448386 HttpRequestHeaders headers;
8387 headers.SetHeader(HttpRequestHeaders::kContentLength,
riceac912aec2015-07-09 07:26:518388 base::SizeTToString(arraysize(kData) - 1));
[email protected]f7022f32014-08-21 16:32:198389 req->SetExtraRequestHeaders(headers);
[email protected]316c1e5e2012-09-12 15:17:448390
danakj8522a25b2016-04-16 00:17:368391 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
tommycli59a63432015-11-06 00:10:558392 req.get(), &default_network_delegate_,
8393 http_test_server()->GetURL("/echo"),
[email protected]7983c4a2014-03-12 01:47:098394 URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT,
mmenkeed0498b2015-12-08 23:20:428395 "Very Good Reason"));
8396 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]316c1e5e2012-09-12 15:17:448397
[email protected]f7022f32014-08-21 16:32:198398 req->Start();
[email protected]255620da2013-08-19 13:14:298399 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:198400 EXPECT_EQ("POST", req->method());
[email protected]316c1e5e2012-09-12 15:17:448401 EXPECT_EQ(kData, d.data_received());
8402}
8403
8404// Check that default A-L header is sent.
8405TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) {
tommycli59a63432015-11-06 00:10:558406 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448407
[email protected]8790210c2013-12-02 05:29:538408 StaticHttpUserAgentSettings settings("en", std::string());
[email protected]ceefd7fd2012-11-29 00:36:248409 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]316c1e5e2012-09-12 15:17:448410 TestURLRequestContext context(true);
8411 context.set_network_delegate(&network_delegate);
[email protected]ee4c30d2012-11-07 15:08:438412 context.set_http_user_agent_settings(&settings);
[email protected]316c1e5e2012-09-12 15:17:448413 context.Init();
8414
8415 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368416 std::unique_ptr<URLRequest> req(context.CreateRequest(
tommycli59a63432015-11-06 00:10:558417 http_test_server()->GetURL("/echoheader?Accept-Language"),
rhalavatib7bd7c792017-04-27 05:25:168418 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198419 req->Start();
[email protected]255620da2013-08-19 13:14:298420 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448421 EXPECT_EQ("en", d.data_received());
8422}
8423
8424// Check that an empty A-L header is not sent. http://crbug.com/77365.
8425TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) {
tommycli59a63432015-11-06 00:10:558426 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448427
[email protected]8790210c2013-12-02 05:29:538428 std::string empty_string; // Avoid most vexing parse on line below.
8429 StaticHttpUserAgentSettings settings(empty_string, empty_string);
[email protected]ceefd7fd2012-11-29 00:36:248430 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]316c1e5e2012-09-12 15:17:448431 TestURLRequestContext context(true);
8432 context.set_network_delegate(&network_delegate);
8433 context.Init();
8434 // We override the language after initialization because empty entries
8435 // get overridden by Init().
[email protected]ee4c30d2012-11-07 15:08:438436 context.set_http_user_agent_settings(&settings);
[email protected]316c1e5e2012-09-12 15:17:448437
8438 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368439 std::unique_ptr<URLRequest> req(context.CreateRequest(
tommycli59a63432015-11-06 00:10:558440 http_test_server()->GetURL("/echoheader?Accept-Language"),
rhalavatib7bd7c792017-04-27 05:25:168441 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198442 req->Start();
[email protected]255620da2013-08-19 13:14:298443 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448444 EXPECT_EQ("None", d.data_received());
8445}
8446
8447// Check that if request overrides the A-L header, the default is not appended.
8448// See http://crbug.com/20894
8449TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) {
tommycli59a63432015-11-06 00:10:558450 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448451
8452 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368453 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558454 http_test_server()->GetURL("/echoheader?Accept-Language"),
rhalavatib7bd7c792017-04-27 05:25:168455 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448456 HttpRequestHeaders headers;
8457 headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru");
[email protected]f7022f32014-08-21 16:32:198458 req->SetExtraRequestHeaders(headers);
8459 req->Start();
[email protected]255620da2013-08-19 13:14:298460 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448461 EXPECT_EQ(std::string("ru"), d.data_received());
8462}
8463
8464// Check that default A-E header is sent.
8465TEST_F(URLRequestTestHTTP, DefaultAcceptEncoding) {
tommycli59a63432015-11-06 00:10:558466 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448467
8468 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368469 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558470 http_test_server()->GetURL("/echoheader?Accept-Encoding"),
rhalavatib7bd7c792017-04-27 05:25:168471 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448472 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:198473 req->SetExtraRequestHeaders(headers);
8474 req->Start();
[email protected]255620da2013-08-19 13:14:298475 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448476 EXPECT_TRUE(ContainsString(d.data_received(), "gzip"));
8477}
8478
8479// Check that if request overrides the A-E header, the default is not appended.
8480// See http://crbug.com/47381
8481TEST_F(URLRequestTestHTTP, OverrideAcceptEncoding) {
tommycli59a63432015-11-06 00:10:558482 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448483
8484 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368485 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558486 http_test_server()->GetURL("/echoheader?Accept-Encoding"),
rhalavatib7bd7c792017-04-27 05:25:168487 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448488 HttpRequestHeaders headers;
8489 headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, "identity");
[email protected]f7022f32014-08-21 16:32:198490 req->SetExtraRequestHeaders(headers);
8491 req->Start();
[email protected]255620da2013-08-19 13:14:298492 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448493 EXPECT_FALSE(ContainsString(d.data_received(), "gzip"));
8494 EXPECT_TRUE(ContainsString(d.data_received(), "identity"));
8495}
8496
[email protected]84f05432013-03-15 01:00:128497// Check that setting the A-C header sends the proper header.
8498TEST_F(URLRequestTestHTTP, SetAcceptCharset) {
tommycli59a63432015-11-06 00:10:558499 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448500
8501 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368502 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558503 http_test_server()->GetURL("/echoheader?Accept-Charset"),
rhalavatib7bd7c792017-04-27 05:25:168504 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448505 HttpRequestHeaders headers;
8506 headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r");
[email protected]f7022f32014-08-21 16:32:198507 req->SetExtraRequestHeaders(headers);
8508 req->Start();
[email protected]255620da2013-08-19 13:14:298509 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448510 EXPECT_EQ(std::string("koi-8r"), d.data_received());
8511}
8512
8513// Check that default User-Agent header is sent.
8514TEST_F(URLRequestTestHTTP, DefaultUserAgent) {
tommycli59a63432015-11-06 00:10:558515 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448516
8517 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368518 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558519 http_test_server()->GetURL("/echoheader?User-Agent"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:168520 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198521 req->Start();
[email protected]255620da2013-08-19 13:14:298522 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:198523 EXPECT_EQ(default_context_.http_user_agent_settings()->GetUserAgent(),
[email protected]051a4b32014-01-09 04:02:378524 d.data_received());
[email protected]316c1e5e2012-09-12 15:17:448525}
8526
8527// Check that if request overrides the User-Agent header,
8528// the default is not appended.
marqf14fff8d2015-12-02 15:52:298529// TODO(crbug.com/564656) This test is flaky on iOS.
8530#if defined(OS_IOS)
8531#define MAYBE_OverrideUserAgent FLAKY_OverrideUserAgent
8532#else
8533#define MAYBE_OverrideUserAgent OverrideUserAgent
8534#endif
8535TEST_F(URLRequestTestHTTP, MAYBE_OverrideUserAgent) {
tommycli59a63432015-11-06 00:10:558536 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448537
8538 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368539 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558540 http_test_server()->GetURL("/echoheader?User-Agent"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:168541 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448542 HttpRequestHeaders headers;
8543 headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)");
[email protected]f7022f32014-08-21 16:32:198544 req->SetExtraRequestHeaders(headers);
8545 req->Start();
[email protected]255620da2013-08-19 13:14:298546 base::RunLoop().Run();
[email protected]cd6f2522014-01-16 18:27:358547 EXPECT_EQ(std::string("Lynx (textmode)"), d.data_received());
[email protected]316c1e5e2012-09-12 15:17:448548}
8549
[email protected]ee4c30d2012-11-07 15:08:438550// Check that a NULL HttpUserAgentSettings causes the corresponding empty
8551// User-Agent header to be sent but does not send the Accept-Language and
8552// Accept-Charset headers.
8553TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) {
tommycli59a63432015-11-06 00:10:558554 ASSERT_TRUE(http_test_server()->Start());
[email protected]ee4c30d2012-11-07 15:08:438555
[email protected]ceefd7fd2012-11-29 00:36:248556 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]ee4c30d2012-11-07 15:08:438557 TestURLRequestContext context(true);
8558 context.set_network_delegate(&network_delegate);
8559 context.Init();
8560 // We override the HttpUserAgentSettings after initialization because empty
8561 // entries get overridden by Init().
8562 context.set_http_user_agent_settings(NULL);
8563
8564 struct {
8565 const char* request;
8566 const char* expected_response;
tommycli59a63432015-11-06 00:10:558567 } tests[] = {{"/echoheader?Accept-Language", "None"},
8568 {"/echoheader?Accept-Charset", "None"},
8569 {"/echoheader?User-Agent", ""}};
[email protected]ee4c30d2012-11-07 15:08:438570
viettrungluue4a8b882014-10-16 06:17:388571 for (size_t i = 0; i < arraysize(tests); i++) {
[email protected]ee4c30d2012-11-07 15:08:438572 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368573 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168574 http_test_server()->GetURL(tests[i].request), DEFAULT_PRIORITY, &d,
8575 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198576 req->Start();
[email protected]255620da2013-08-19 13:14:298577 base::RunLoop().Run();
[email protected]ee4c30d2012-11-07 15:08:438578 EXPECT_EQ(tests[i].expected_response, d.data_received())
8579 << " Request = \"" << tests[i].request << "\"";
8580 }
8581}
8582
[email protected]5033ab82013-03-22 20:17:468583// Make sure that URLRequest passes on its priority updates to
8584// newly-created jobs after the first one.
8585TEST_F(URLRequestTestHTTP, SetSubsequentJobPriority) {
tommycli59a63432015-11-06 00:10:558586 ASSERT_TRUE(http_test_server()->Start());
[email protected]5033ab82013-03-22 20:17:468587
8588 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368589 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168590 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
8591 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198592 EXPECT_EQ(DEFAULT_PRIORITY, req->priority());
[email protected]5033ab82013-03-22 20:17:468593
danakj8522a25b2016-04-16 00:17:368594 std::unique_ptr<URLRequestRedirectJob> redirect_job(new URLRequestRedirectJob(
tommycli59a63432015-11-06 00:10:558595 req.get(), &default_network_delegate_,
8596 http_test_server()->GetURL("/echo"),
mmenkeed0498b2015-12-08 23:20:428597 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"));
8598 AddTestInterceptor()->set_main_intercept_job(std::move(redirect_job));
[email protected]5033ab82013-03-22 20:17:468599
[email protected]f7022f32014-08-21 16:32:198600 req->SetPriority(LOW);
8601 req->Start();
8602 EXPECT_TRUE(req->is_pending());
[email protected]5033ab82013-03-22 20:17:468603
mmenkeed0498b2015-12-08 23:20:428604 RequestPriority job_priority;
danakj8522a25b2016-04-16 00:17:368605 std::unique_ptr<URLRequestJob> job(new PriorityMonitoringURLRequestJob(
mmenkeed0498b2015-12-08 23:20:428606 req.get(), &default_network_delegate_, &job_priority));
8607 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]5033ab82013-03-22 20:17:468608
8609 // Should trigger |job| to be started.
[email protected]255620da2013-08-19 13:14:298610 base::RunLoop().Run();
mmenkeed0498b2015-12-08 23:20:428611 EXPECT_EQ(LOW, job_priority);
[email protected]5033ab82013-03-22 20:17:468612}
8613
[email protected]80abdad2014-03-15 00:20:548614// Check that creating a network request while entering/exiting suspend mode
8615// fails as it should. This is the only case where an HttpTransactionFactory
8616// does not return an HttpTransaction.
8617TEST_F(URLRequestTestHTTP, NetworkSuspendTest) {
8618 // Create a new HttpNetworkLayer that thinks it's suspended.
danakj8522a25b2016-04-16 00:17:368619 std::unique_ptr<HttpNetworkLayer> network_layer(new HttpNetworkLayer(
mmenke2281f3762015-11-02 20:38:178620 default_context_.http_transaction_factory()->GetSession()));
[email protected]80abdad2014-03-15 00:20:548621 network_layer->OnSuspend();
8622
dchengc7eeda422015-12-26 03:56:488623 HttpCache http_cache(std::move(network_layer),
zhongyi3ceab9f2017-02-04 02:06:038624 HttpCache::DefaultBackend::InMemory(0),
zhongyi4928bd52017-02-08 02:16:278625 false /* is_main_cache */);
[email protected]80abdad2014-03-15 00:20:548626
8627 TestURLRequestContext context(true);
8628 context.set_http_transaction_factory(&http_cache);
8629 context.Init();
8630
8631 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368632 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:168633 context.CreateRequest(GURL("http://127.0.0.1/"), DEFAULT_PRIORITY, &d,
8634 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198635 req->Start();
[email protected]80abdad2014-03-15 00:20:548636 base::RunLoop().Run();
8637
8638 EXPECT_TRUE(d.request_failed());
maksim.sisovb53724b52016-09-16 05:30:508639 EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, d.request_status());
[email protected]80abdad2014-03-15 00:20:548640}
8641
mmenke2281f3762015-11-02 20:38:178642namespace {
[email protected]80abdad2014-03-15 00:20:548643
mmenke2281f3762015-11-02 20:38:178644// HttpTransactionFactory that synchronously fails to create transactions.
8645class FailingHttpTransactionFactory : public HttpTransactionFactory {
8646 public:
8647 explicit FailingHttpTransactionFactory(HttpNetworkSession* network_session)
8648 : network_session_(network_session) {}
8649
8650 ~FailingHttpTransactionFactory() override {}
8651
8652 // HttpTransactionFactory methods:
8653 int CreateTransaction(RequestPriority priority,
danakj8522a25b2016-04-16 00:17:368654 std::unique_ptr<HttpTransaction>* trans) override {
mmenke2281f3762015-11-02 20:38:178655 return ERR_FAILED;
8656 }
8657
8658 HttpCache* GetCache() override { return nullptr; }
8659
8660 HttpNetworkSession* GetSession() override { return network_session_; }
8661
8662 private:
8663 HttpNetworkSession* network_session_;
8664
8665 DISALLOW_COPY_AND_ASSIGN(FailingHttpTransactionFactory);
8666};
8667
8668} // namespace
8669
8670// Check that when a request that fails to create an HttpTransaction can be
8671// cancelled while the failure notification is pending, and doesn't send two
8672// failure notifications.
8673//
8674// This currently only happens when in suspend mode and there's no cache, but
8675// just use a special HttpTransactionFactory, to avoid depending on those
8676// behaviors.
8677TEST_F(URLRequestTestHTTP, NetworkCancelAfterCreateTransactionFailsTest) {
8678 FailingHttpTransactionFactory http_transaction_factory(
8679 default_context_.http_transaction_factory()->GetSession());
[email protected]80abdad2014-03-15 00:20:548680 TestURLRequestContext context(true);
mmenke2281f3762015-11-02 20:38:178681 context.set_http_transaction_factory(&http_transaction_factory);
8682 context.set_network_delegate(default_network_delegate());
[email protected]80abdad2014-03-15 00:20:548683 context.Init();
8684
8685 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368686 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:168687 context.CreateRequest(GURL("http://127.0.0.1/"), DEFAULT_PRIORITY, &d,
8688 TRAFFIC_ANNOTATION_FOR_TESTS));
mmenke2281f3762015-11-02 20:38:178689 // Don't send cookies (Collecting cookies is asynchronous, and need request to
8690 // try to create an HttpNetworkTransaction synchronously on start).
8691 req->SetLoadFlags(LOAD_DO_NOT_SEND_COOKIES);
[email protected]f7022f32014-08-21 16:32:198692 req->Start();
mmenke2281f3762015-11-02 20:38:178693 req->Cancel();
[email protected]80abdad2014-03-15 00:20:548694 base::RunLoop().Run();
mmenke2281f3762015-11-02 20:38:178695 // Run pending error task, if there is one.
8696 base::RunLoop().RunUntilIdle();
[email protected]80abdad2014-03-15 00:20:548697
8698 EXPECT_TRUE(d.request_failed());
mmenke2281f3762015-11-02 20:38:178699 EXPECT_EQ(1, d.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:508700 EXPECT_EQ(ERR_ABORTED, d.request_status());
mmenke2281f3762015-11-02 20:38:178701
8702 // NetworkDelegate should see the cancellation, but not the error.
8703 EXPECT_EQ(1, default_network_delegate()->canceled_requests());
8704 EXPECT_EQ(0, default_network_delegate()->error_count());
[email protected]80abdad2014-03-15 00:20:548705}
8706
ttuttlec0c828492015-05-15 01:25:558707TEST_F(URLRequestTestHTTP, NetworkAccessedSetOnNetworkRequest) {
tommycli59a63432015-11-06 00:10:558708 ASSERT_TRUE(http_test_server()->Start());
ttuttlec0c828492015-05-15 01:25:558709
8710 TestDelegate d;
tommycli59a63432015-11-06 00:10:558711 GURL test_url(http_test_server()->GetURL("/"));
rhalavatib7bd7c792017-04-27 05:25:168712 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
8713 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:558714
8715 req->Start();
8716 base::RunLoop().Run();
8717
8718 EXPECT_TRUE(req->response_info().network_accessed);
8719}
8720
8721TEST_F(URLRequestTestHTTP, NetworkAccessedClearOnCachedResponse) {
tommycli59a63432015-11-06 00:10:558722 ASSERT_TRUE(http_test_server()->Start());
ttuttlec0c828492015-05-15 01:25:558723
8724 // Populate the cache.
8725 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368726 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168727 http_test_server()->GetURL("/cachetime"), DEFAULT_PRIORITY, &d,
8728 TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:558729 req->Start();
8730 base::RunLoop().Run();
8731
maksim.sisovb53724b52016-09-16 05:30:508732 EXPECT_EQ(OK, d.request_status());
ttuttlec0c828492015-05-15 01:25:558733 EXPECT_TRUE(req->response_info().network_accessed);
8734 EXPECT_FALSE(req->response_info().was_cached);
8735
tommycli59a63432015-11-06 00:10:558736 req = default_context_.CreateRequest(http_test_server()->GetURL("/cachetime"),
rhalavatib7bd7c792017-04-27 05:25:168737 DEFAULT_PRIORITY, &d,
8738 TRAFFIC_ANNOTATION_FOR_TESTS);
ttuttlec0c828492015-05-15 01:25:558739 req->Start();
8740 base::RunLoop().Run();
8741
maksim.sisovb53724b52016-09-16 05:30:508742 EXPECT_EQ(OK, d.request_status());
ttuttlec0c828492015-05-15 01:25:558743 EXPECT_FALSE(req->response_info().network_accessed);
8744 EXPECT_TRUE(req->response_info().was_cached);
8745}
8746
8747TEST_F(URLRequestTestHTTP, NetworkAccessedClearOnLoadOnlyFromCache) {
tommycli59a63432015-11-06 00:10:558748 ASSERT_TRUE(http_test_server()->Start());
ttuttlec0c828492015-05-15 01:25:558749
8750 TestDelegate d;
tommycli59a63432015-11-06 00:10:558751 GURL test_url(http_test_server()->GetURL("/"));
rhalavatib7bd7c792017-04-27 05:25:168752 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
8753 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
jkarlina067deed2016-10-27 14:48:338754 req->SetLoadFlags(LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION);
ttuttlec0c828492015-05-15 01:25:558755
8756 req->Start();
8757 base::RunLoop().Run();
8758
8759 EXPECT_FALSE(req->response_info().network_accessed);
8760}
8761
rdsmithbf8c3c12016-11-18 18:16:248762// Test that a single job with a THROTTLED priority completes
rdsmith5eb6fbc2016-10-21 17:36:088763// correctly in the absence of contention.
8764TEST_F(URLRequestTestHTTP, ThrottledPriority) {
8765 ASSERT_TRUE(http_test_server()->Start());
8766
8767 TestDelegate d;
8768 GURL test_url(http_test_server()->GetURL("/"));
rhalavatib7bd7c792017-04-27 05:25:168769 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
8770 test_url, THROTTLED, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmith5eb6fbc2016-10-21 17:36:088771 req->Start();
8772 base::RunLoop().Run();
8773
8774 EXPECT_TRUE(req->status().is_success());
8775}
8776
rdsmithbf8c3c12016-11-18 18:16:248777// A class to hold state for responding to USER_NOTIFY callbacks from
8778// BlockingNetworkDelegate. It also accepts a RunLoop that will be
8779// signaled via QuitWhenIdle() when any request is blocked.
8780//
8781class NotificationCallbackHandler {
8782 public:
8783 // Default constructed object doesn't block anything.
8784 NotificationCallbackHandler() : run_loop_(nullptr) {}
8785
8786 void AddURLRequestToBlockList(const URLRequest* request) {
8787 requests_to_block_.insert(request);
8788 }
8789
8790 Error ShouldBlockRequest(const CompletionCallback& callback,
8791 const URLRequest* request) {
8792 if (requests_to_block_.find(request) == requests_to_block_.end()) {
8793 return OK;
8794 }
8795
8796 DCHECK(blocked_callbacks_.find(request) == blocked_callbacks_.end());
8797 blocked_callbacks_[request] = callback;
8798 if (run_loop_ && blocked_callbacks_.size() == requests_to_block_.size())
8799 run_loop_->QuitWhenIdle();
8800 return ERR_IO_PENDING;
8801 }
8802
8803 // Erases object's memory of blocked callbacks as a side effect.
8804 void GetBlockedCallbacks(
8805 std::map<const URLRequest*, CompletionCallback>* blocked_callbacks) {
8806 blocked_callbacks_.swap(*blocked_callbacks);
8807 }
8808
8809 // Set a RunLoop that, if non-null, will be signaled if any request
8810 // is blocked. It is the callers responsibility to make sure the
8811 // passed object lives past the destruction of this class or
8812 // next call to SetRunLoop().
8813 void SetRunLoop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
8814
8815 private:
8816 std::set<const URLRequest*> requests_to_block_;
8817 std::map<const URLRequest*, CompletionCallback> blocked_callbacks_;
8818
8819 base::RunLoop* run_loop_;
8820
8821 DISALLOW_COPY_AND_ASSIGN(NotificationCallbackHandler);
8822};
8823
8824TEST_F(URLRequestTestHTTP, MultiThrottledPriority) {
8825 ASSERT_TRUE(http_test_server()->Start());
8826
8827 base::RunLoop run_until_request_blocked;
8828
8829 NotificationCallbackHandler notification_handler;
8830 notification_handler.SetRunLoop(&run_until_request_blocked);
8831 BlockingNetworkDelegate network_delegate(
8832 BlockingNetworkDelegate::USER_NOTIFY);
8833 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
8834 network_delegate.set_notification_callback(
8835 base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
8836 // Both objects are owned by this function, and
8837 // |*network_delegate| will be destroyed first, so
8838 // it's safe to pass it an unretained pointer.
8839 base::Unretained(&notification_handler)));
8840
8841 TestURLRequestContext context(true);
8842 context.set_network_delegate(&network_delegate);
8843 context.Init();
8844
8845 // Use different test URLs to make sure all three requests turn into
8846 // HttpNetworkTransacations. Use different URLRequest::Delegates so that
8847 // the requests may be waited on separately.
8848 TestDelegate d1;
rhalavatib7bd7c792017-04-27 05:25:168849 std::unique_ptr<URLRequest> req1(
8850 context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
8851 &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248852 notification_handler.AddURLRequestToBlockList(req1.get());
8853
8854 TestDelegate d2;
rhalavatib7bd7c792017-04-27 05:25:168855 std::unique_ptr<URLRequest> req2(
8856 context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
8857 &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248858 notification_handler.AddURLRequestToBlockList(req2.get());
8859
8860 TestDelegate d3;
rhalavatib7bd7c792017-04-27 05:25:168861 std::unique_ptr<URLRequest> req3(
8862 context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
8863 &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248864 req1->Start();
8865 req2->Start();
8866 req3->Start();
8867 run_until_request_blocked.Run();
8868 notification_handler.SetRunLoop(nullptr);
8869
8870 // The first two requests should be blocked based on the notification
8871 // callback, and their status should have blocked the third request
8872 // through throttling.
8873 EXPECT_TRUE(req1->status().is_io_pending());
8874 EXPECT_TRUE(req2->status().is_io_pending());
8875 EXPECT_TRUE(req3->status().is_io_pending());
8876
8877 std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
8878 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
8879 ASSERT_EQ(2u, blocked_callbacks.size());
8880 ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
8881 ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
8882
8883 // Unblocking one of the requests blocked on the notification callback
8884 // should let it complete, which should then let the third request
8885 // complete. Unblock the second request, then wait for the third
8886 // request to complete.
8887 // TODO(rdsmith): Find something to wait on other than the third
8888 // requests completion; if there's a bug in throttling, that will
8889 // result in this test hanging rather than failing quickly.
8890 d1.set_quit_on_complete(false);
8891 d2.set_quit_on_complete(false);
8892 d3.set_quit_on_complete(true);
8893 blocked_callbacks[req2.get()].Run(OK);
8894 base::RunLoop().Run();
8895
8896 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
8897 EXPECT_EQ(0u, blocked_callbacks.size());
8898 EXPECT_TRUE(req1->status().is_io_pending());
8899 // req3 is only unblocked after req2 completes, so req2's
8900 // success is guaranteed at this point in the function.
8901 EXPECT_EQ(URLRequestStatus::SUCCESS, req2->status().status());
8902 EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
8903}
8904
8905// Confirm that failing a request unblocks following requests.
8906TEST_F(URLRequestTestHTTP, ThrottledFailure) {
8907 ASSERT_TRUE(http_test_server()->Start());
8908
8909 base::RunLoop run_until_request_blocked;
8910
8911 NotificationCallbackHandler notification_handler;
8912 notification_handler.SetRunLoop(&run_until_request_blocked);
8913 BlockingNetworkDelegate network_delegate(
8914 BlockingNetworkDelegate::USER_NOTIFY);
8915 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
8916 network_delegate.set_notification_callback(
8917 base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
8918 // Both objects are owned by this function, and
8919 // |*network_delegate| will be destroyed first, so
8920 // it's safe to pass it an unretained pointer.
8921 base::Unretained(&notification_handler)));
8922
8923 TestURLRequestContext context(true);
8924 context.set_network_delegate(&network_delegate);
8925 context.Init();
8926
8927 // Use different test URLs to make sure all three requests turn into
8928 // HttpNetworkTransacations. Use different URLRequest::Delegates so that
8929 // the requests may be waited on separately.
8930 TestDelegate d1;
rhalavatib7bd7c792017-04-27 05:25:168931 std::unique_ptr<URLRequest> req1(
8932 context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
8933 &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248934 notification_handler.AddURLRequestToBlockList(req1.get());
8935
8936 TestDelegate d2;
rhalavatib7bd7c792017-04-27 05:25:168937 std::unique_ptr<URLRequest> req2(
8938 context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
8939 &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248940 notification_handler.AddURLRequestToBlockList(req2.get());
8941
8942 TestDelegate d3;
rhalavatib7bd7c792017-04-27 05:25:168943 std::unique_ptr<URLRequest> req3(
8944 context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
8945 &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248946 req1->Start();
8947 req2->Start();
8948 req3->Start();
8949 run_until_request_blocked.Run();
8950 notification_handler.SetRunLoop(nullptr);
8951
8952 // The first two requests should be blocked based on the notification
8953 // callback, and their status should have blocked the third request
8954 // through throttling.
8955 EXPECT_TRUE(req1->status().is_io_pending());
8956 EXPECT_TRUE(req2->status().is_io_pending());
8957 EXPECT_TRUE(req3->status().is_io_pending());
8958
8959 std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
8960 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
8961 ASSERT_EQ(2u, blocked_callbacks.size());
8962 ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
8963 ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
8964
8965 // Confirm canceling one of the outstanding requests allows the
8966 // blocked request to complete.
8967
8968 // TODO(rdsmith): Find something to wait on other than the third
8969 // requests completion; if there's a bug in throttling, that will
8970 // result in this test hanging rather than failing quickly.
8971 d1.set_quit_on_complete(false);
8972 d2.set_quit_on_complete(false);
8973 d3.set_quit_on_complete(true);
8974 req2->Cancel();
8975 base::RunLoop().Run();
8976
8977 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
8978 EXPECT_EQ(0u, blocked_callbacks.size());
8979 EXPECT_TRUE(req1->status().is_io_pending());
8980 EXPECT_EQ(URLRequestStatus::CANCELED, req2->status().status());
8981 EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
8982}
8983
8984TEST_F(URLRequestTestHTTP, ThrottledRepriUnblock) {
8985 ASSERT_TRUE(http_test_server()->Start());
8986
8987 base::RunLoop run_until_request_blocked;
8988
8989 NotificationCallbackHandler notification_handler;
8990 notification_handler.SetRunLoop(&run_until_request_blocked);
8991 BlockingNetworkDelegate network_delegate(
8992 BlockingNetworkDelegate::USER_NOTIFY);
8993 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
8994 network_delegate.set_notification_callback(
8995 base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
8996 // Both objects are owned by this function, and
8997 // |*network_delegate| will be destroyed first, so
8998 // it's safe to pass it an unretained pointer.
8999 base::Unretained(&notification_handler)));
9000
9001 TestURLRequestContext context(true);
9002 context.set_network_delegate(&network_delegate);
9003 context.Init();
9004
9005 // Use different test URLs to make sure all three requests turn into
9006 // HttpNetworkTransacations. Use different URLRequest::Delegates so that
9007 // the requests may be waited on separately.
9008 TestDelegate d1;
rhalavatib7bd7c792017-04-27 05:25:169009 std::unique_ptr<URLRequest> req1(
9010 context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
9011 &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249012 notification_handler.AddURLRequestToBlockList(req1.get());
9013
9014 TestDelegate d2;
rhalavatib7bd7c792017-04-27 05:25:169015 std::unique_ptr<URLRequest> req2(
9016 context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
9017 &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249018 notification_handler.AddURLRequestToBlockList(req2.get());
9019
9020 TestDelegate d3;
rhalavatib7bd7c792017-04-27 05:25:169021 std::unique_ptr<URLRequest> req3(
9022 context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
9023 &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249024 req1->Start();
9025 req2->Start();
9026 req3->Start();
9027 run_until_request_blocked.Run();
9028 notification_handler.SetRunLoop(nullptr);
9029
9030 // The first two requests should be blocked based on the notification
9031 // callback, and their status should have blocked the third request
9032 // through throttling.
9033 EXPECT_TRUE(req1->status().is_io_pending());
9034 EXPECT_TRUE(req2->status().is_io_pending());
9035 EXPECT_TRUE(req3->status().is_io_pending());
9036
9037 std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
9038 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
9039 ASSERT_EQ(2u, blocked_callbacks.size());
9040 ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
9041 ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
9042
9043 // Confirm raising the priority of the third request allows it to complete.
9044
9045 // TODO(rdsmith): Find something to wait on other than the third
9046 // requests completion; if there's a bug in throttling, that will
9047 // result in this test hanging rather than failing quickly.
9048 d1.set_quit_on_complete(false);
9049 d2.set_quit_on_complete(false);
9050 d3.set_quit_on_complete(true);
9051 req3->SetPriority(IDLE);
9052 base::RunLoop().Run();
9053
9054 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
9055 EXPECT_EQ(0u, blocked_callbacks.size());
9056 EXPECT_TRUE(req1->status().is_io_pending());
9057 EXPECT_TRUE(req2->status().is_io_pending());
9058 EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
9059}
9060
ricea3a1c71f2016-06-17 10:05:269061TEST_F(URLRequestTestHTTP, RawBodyBytesNoContentEncoding) {
9062 ASSERT_TRUE(http_test_server()->Start());
9063
9064 TestDelegate d;
9065 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169066 http_test_server()->GetURL("/simple.html"), DEFAULT_PRIORITY, &d,
9067 TRAFFIC_ANNOTATION_FOR_TESTS));
ricea3a1c71f2016-06-17 10:05:269068 req->Start();
9069 base::RunLoop().Run();
9070
9071 EXPECT_EQ(5, req->GetRawBodyBytes());
9072}
9073
9074TEST_F(URLRequestTestHTTP, RawBodyBytesGzipEncoding) {
9075 ASSERT_TRUE(http_test_server()->Start());
9076
9077 TestDelegate d;
9078 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169079 http_test_server()->GetURL("/gzip-encoded"), DEFAULT_PRIORITY, &d,
9080 TRAFFIC_ANNOTATION_FOR_TESTS));
ricea3a1c71f2016-06-17 10:05:269081 req->Start();
9082 base::RunLoop().Run();
9083
9084 EXPECT_EQ(30, req->GetRawBodyBytes());
9085}
9086
jamd3f5a3c2016-10-27 18:52:029087// Check that if NetworkDelegate::OnBeforeStartTransaction returns an error,
9088// the delegate isn't called back synchronously.
9089TEST_F(URLRequestTestHTTP, TesBeforeStartTransactionFails) {
9090 ASSERT_TRUE(http_test_server()->Start());
9091 default_network_delegate_.set_before_start_transaction_fails();
9092
9093 TestDelegate d;
9094 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169095 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d,
9096 TRAFFIC_ANNOTATION_FOR_TESTS));
jamd3f5a3c2016-10-27 18:52:029097 req->Start();
9098 DCHECK(!d.response_completed());
9099 base::RunLoop().Run();
9100 DCHECK(d.response_completed());
9101 EXPECT_EQ(ERR_FAILED, d.request_status());
9102}
9103
bengr1bf8e942014-11-07 01:36:509104class URLRequestInterceptorTestHTTP : public URLRequestTestHTTP {
9105 public:
9106 // TODO(bengr): Merge this with the URLRequestInterceptorHTTPTest fixture,
9107 // ideally remove the dependency on URLRequestTestJob, and maybe move these
9108 // tests into the factory tests.
9109 URLRequestInterceptorTestHTTP() : URLRequestTestHTTP(), interceptor_(NULL) {
9110 }
9111
9112 void SetUpFactory() override {
9113 interceptor_ = new MockURLRequestInterceptor();
9114 job_factory_.reset(new URLRequestInterceptingJobFactory(
danakj8522a25b2016-04-16 00:17:369115 std::move(job_factory_), base::WrapUnique(interceptor_)));
bengr1bf8e942014-11-07 01:36:509116 }
9117
9118 MockURLRequestInterceptor* interceptor() const {
9119 return interceptor_;
9120 }
9121
9122 private:
9123 MockURLRequestInterceptor* interceptor_;
9124};
9125
9126TEST_F(URLRequestInterceptorTestHTTP,
9127 NetworkDelegateNotificationOnRedirectIntercept) {
9128 interceptor()->set_intercept_redirect(true);
9129 interceptor()->set_redirect_headers(MockURLRequestInterceptor::ok_headers());
9130 interceptor()->set_redirect_data(MockURLRequestInterceptor::ok_data());
9131
tommycli59a63432015-11-06 00:10:559132 ASSERT_TRUE(http_test_server()->Start());
bengr1bf8e942014-11-07 01:36:509133
9134 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369135 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169136 http_test_server()->GetURL("/redirect-test.html"), DEFAULT_PRIORITY, &d,
9137 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:509138 req->Start();
9139 base::RunLoop().Run();
9140
9141 EXPECT_TRUE(interceptor()->did_intercept_redirect());
9142 // Check we got one good response
maksim.sisovb53724b52016-09-16 05:30:509143 int status = d.request_status();
9144 EXPECT_EQ(OK, status);
9145 if (status == OK)
bengr1bf8e942014-11-07 01:36:509146 EXPECT_EQ(200, req->response_headers()->response_code());
9147
9148 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
9149 EXPECT_EQ(1, d.response_started_count());
9150 EXPECT_EQ(0, d.received_redirect_count());
9151
9152 EXPECT_EQ(1, default_network_delegate()->created_requests());
ryansturm2343cb62016-06-15 01:09:009153 EXPECT_EQ(1, default_network_delegate()->before_start_transaction_count());
bengr1bf8e942014-11-07 01:36:509154 EXPECT_EQ(1, default_network_delegate()->headers_received_count());
9155}
9156
9157TEST_F(URLRequestInterceptorTestHTTP,
9158 NetworkDelegateNotificationOnErrorIntercept) {
9159 // Intercept that error and respond with an OK response.
9160 interceptor()->set_intercept_final_response(true);
9161 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
9162 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
9163 default_network_delegate()->set_can_be_intercepted_on_error(true);
9164
tommycli59a63432015-11-06 00:10:559165 ASSERT_TRUE(http_test_server()->Start());
bengr1bf8e942014-11-07 01:36:509166
9167 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369168 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
tommycli59a63432015-11-06 00:10:559169 http_test_server()->GetURL("/two-content-lengths.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:169170 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:509171 req->set_method("GET");
9172 req->Start();
9173 base::RunLoop().Run();
9174
9175 EXPECT_TRUE(interceptor()->did_intercept_final());
9176
9177 // Check we received one good response.
maksim.sisovb53724b52016-09-16 05:30:509178 int status = d.request_status();
9179 EXPECT_EQ(OK, status);
9180 if (status == OK)
bengr1bf8e942014-11-07 01:36:509181 EXPECT_EQ(200, req->response_headers()->response_code());
9182 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
9183 EXPECT_EQ(1, d.response_started_count());
9184 EXPECT_EQ(0, d.received_redirect_count());
9185
9186 EXPECT_EQ(1, default_network_delegate()->created_requests());
ryansturm2343cb62016-06-15 01:09:009187 EXPECT_EQ(1, default_network_delegate()->before_start_transaction_count());
bengr1bf8e942014-11-07 01:36:509188 EXPECT_EQ(0, default_network_delegate()->headers_received_count());
9189}
9190
9191TEST_F(URLRequestInterceptorTestHTTP,
9192 NetworkDelegateNotificationOnResponseIntercept) {
9193 // Intercept that error and respond with an OK response.
9194 interceptor()->set_intercept_final_response(true);
9195
9196 // Intercept with a real URLRequestHttpJob.
9197 interceptor()->set_use_url_request_http_job(true);
9198
tommycli59a63432015-11-06 00:10:559199 ASSERT_TRUE(http_test_server()->Start());
bengr1bf8e942014-11-07 01:36:509200
9201 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369202 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169203 http_test_server()->GetURL("/simple.html"), DEFAULT_PRIORITY, &d,
9204 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:509205 req->set_method("GET");
9206 req->Start();
9207 base::RunLoop().Run();
9208
9209 EXPECT_TRUE(interceptor()->did_intercept_final());
9210
9211 // Check we received one good response.
maksim.sisovb53724b52016-09-16 05:30:509212 int status = d.request_status();
9213 EXPECT_EQ(OK, status);
9214 if (status == OK)
bengr1bf8e942014-11-07 01:36:509215 EXPECT_EQ(200, req->response_headers()->response_code());
9216 EXPECT_EQ("hello", d.data_received());
9217 EXPECT_EQ(1, d.response_started_count());
9218 EXPECT_EQ(0, d.received_redirect_count());
9219
9220 EXPECT_EQ(1, default_network_delegate()->created_requests());
ryansturm2343cb62016-06-15 01:09:009221 EXPECT_EQ(2, default_network_delegate()->before_start_transaction_count());
bengr1bf8e942014-11-07 01:36:509222 EXPECT_EQ(2, default_network_delegate()->headers_received_count());
9223}
9224
mkwst0c5eab872014-11-21 14:18:549225class URLRequestTestReferrerPolicy : public URLRequestTest {
9226 public:
9227 URLRequestTestReferrerPolicy() {}
9228
tommycli59a63432015-11-06 00:10:559229 void InstantiateSameOriginServers(net::EmbeddedTestServer::Type type) {
9230 origin_server_.reset(new EmbeddedTestServer(type));
9231 if (type == net::EmbeddedTestServer::TYPE_HTTPS) {
9232 origin_server_->AddDefaultHandlers(
9233 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
9234 } else {
9235 origin_server_->AddDefaultHandlers(base::FilePath(kTestFilePath));
9236 }
mkwst0c5eab872014-11-21 14:18:549237 ASSERT_TRUE(origin_server_->Start());
9238 }
9239
tommycli59a63432015-11-06 00:10:559240 void InstantiateCrossOriginServers(net::EmbeddedTestServer::Type origin_type,
9241 net::EmbeddedTestServer::Type dest_type) {
9242 origin_server_.reset(new EmbeddedTestServer(origin_type));
9243 if (origin_type == net::EmbeddedTestServer::TYPE_HTTPS) {
9244 origin_server_->AddDefaultHandlers(
9245 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
9246 } else {
9247 origin_server_->AddDefaultHandlers(base::FilePath(kTestFilePath));
9248 }
mkwst0c5eab872014-11-21 14:18:549249 ASSERT_TRUE(origin_server_->Start());
9250
tommycli59a63432015-11-06 00:10:559251 destination_server_.reset(new EmbeddedTestServer(dest_type));
9252 if (dest_type == net::EmbeddedTestServer::TYPE_HTTPS) {
9253 destination_server_->AddDefaultHandlers(
9254 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
9255 } else {
9256 destination_server_->AddDefaultHandlers(base::FilePath(kTestFilePath));
9257 }
mkwst0c5eab872014-11-21 14:18:549258 ASSERT_TRUE(destination_server_->Start());
9259 }
9260
9261 void VerifyReferrerAfterRedirect(URLRequest::ReferrerPolicy policy,
9262 const GURL& referrer,
9263 const GURL& expected) {
9264 // Create and execute the request: we'll only have a |destination_server_|
9265 // if the origins are meant to be distinct. Otherwise, we'll use the
9266 // |origin_server_| for both endpoints.
9267 GURL destination_url =
tommycli59a63432015-11-06 00:10:559268 destination_server_ ? destination_server_->GetURL("/echoheader?Referer")
9269 : origin_server_->GetURL("/echoheader?Referer");
mkwst0c5eab872014-11-21 14:18:549270 GURL origin_url =
tommycli59a63432015-11-06 00:10:559271 origin_server_->GetURL("/server-redirect?" + destination_url.spec());
mkwst0c5eab872014-11-21 14:18:549272
9273 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:169274 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
9275 origin_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
mkwst0c5eab872014-11-21 14:18:549276 req->set_referrer_policy(policy);
9277 req->SetReferrer(referrer.spec());
9278 req->Start();
9279 base::RunLoop().Run();
9280
9281 EXPECT_EQ(1, d.response_started_count());
9282 EXPECT_EQ(1, d.received_redirect_count());
9283 EXPECT_EQ(destination_url, req->url());
maksim.sisovb53724b52016-09-16 05:30:509284 EXPECT_EQ(OK, d.request_status());
mkwst0c5eab872014-11-21 14:18:549285 EXPECT_EQ(200, req->response_headers()->response_code());
9286
9287 EXPECT_EQ(expected.spec(), req->referrer());
9288 if (expected.is_empty())
9289 EXPECT_EQ("None", d.data_received());
9290 else
9291 EXPECT_EQ(expected.spec(), d.data_received());
9292 }
9293
tommycli59a63432015-11-06 00:10:559294 EmbeddedTestServer* origin_server() const { return origin_server_.get(); }
mkwst0c5eab872014-11-21 14:18:549295
9296 private:
danakj8522a25b2016-04-16 00:17:369297 std::unique_ptr<EmbeddedTestServer> origin_server_;
9298 std::unique_ptr<EmbeddedTestServer> destination_server_;
mkwst0c5eab872014-11-21 14:18:549299};
9300
9301TEST_F(URLRequestTestReferrerPolicy, HTTPToSameOriginHTTP) {
tommycli59a63432015-11-06 00:10:559302 InstantiateSameOriginServers(net::EmbeddedTestServer::TYPE_HTTP);
mkwst0c5eab872014-11-21 14:18:549303
estarkc8ccba82017-06-13 22:37:409304 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549305 VerifyReferrerAfterRedirect(
9306 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409307 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549308
9309 VerifyReferrerAfterRedirect(
9310 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409311 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549312
9313 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409314 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549315
estarkc8ccba82017-06-13 22:37:409316 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9317 referrer);
9318
9319 // The original referrer set on the request is expected to obey the referrer
9320 // policy and already be stripped to the origin; thus this test case just
9321 // checks that this policy doesn't cause the referrer to change when following
9322 // a redirect.
9323 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9324 referrer.GetOrigin());
9325
9326 VerifyReferrerAfterRedirect(
9327 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer,
9328 referrer);
9329
9330 // The original referrer set on the request is expected to obey the referrer
9331 // policy and already be stripped to the origin; thus this test case just
9332 // checks that this policy doesn't cause the referrer to change when following
9333 // a redirect.
9334 VerifyReferrerAfterRedirect(
9335 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9336 referrer.GetOrigin(), referrer.GetOrigin());
9337
9338 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549339}
9340
tommycli59a63432015-11-06 00:10:559341TEST_F(URLRequestTestReferrerPolicy, HTTPToCrossOriginHTTP) {
9342 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTP,
9343 net::EmbeddedTestServer::TYPE_HTTP);
estarkc8ccba82017-06-13 22:37:409344 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549345
9346 VerifyReferrerAfterRedirect(
9347 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409348 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549349
9350 VerifyReferrerAfterRedirect(
9351 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409352 referrer, referrer.GetOrigin());
mkwst0c5eab872014-11-21 14:18:549353
9354 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409355 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
9356 referrer.GetOrigin());
mkwst0c5eab872014-11-21 14:18:549357
estarkc8ccba82017-06-13 22:37:409358 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9359 referrer);
9360
9361 // The original referrer set on the request is expected to obey the referrer
9362 // policy and already be stripped to the origin; thus this test case just
9363 // checks that this policy doesn't cause the referrer to change when following
9364 // a redirect.
9365 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9366 referrer.GetOrigin());
9367
9368 VerifyReferrerAfterRedirect(
9369 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9370
9371 // The original referrer set on the request is expected to obey the referrer
9372 // policy and already be stripped to the origin; thus this test case just
9373 // checks that this policy doesn't cause the referrer to change when following
9374 // a redirect.
9375 VerifyReferrerAfterRedirect(
9376 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9377 referrer.GetOrigin(), referrer.GetOrigin());
9378
9379 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549380}
9381
9382TEST_F(URLRequestTestReferrerPolicy, HTTPSToSameOriginHTTPS) {
tommycli59a63432015-11-06 00:10:559383 InstantiateSameOriginServers(net::EmbeddedTestServer::TYPE_HTTPS);
estarkc8ccba82017-06-13 22:37:409384 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549385
9386 VerifyReferrerAfterRedirect(
9387 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409388 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549389
9390 VerifyReferrerAfterRedirect(
9391 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409392 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549393
9394 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409395 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549396
estarkc8ccba82017-06-13 22:37:409397 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9398 referrer);
9399
9400 // The original referrer set on the request is expected to obey the referrer
9401 // policy and already be stripped to the origin; thus this test case just
9402 // checks that this policy doesn't cause the referrer to change when following
9403 // a redirect.
9404 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9405 referrer.GetOrigin());
9406
9407 VerifyReferrerAfterRedirect(
9408 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer,
9409 referrer);
9410
9411 // The original referrer set on the request is expected to obey the referrer
9412 // policy and already be stripped to the origin; thus this test case just
9413 // checks that this policy doesn't cause the referrer to change when following
9414 // a redirect.
9415 VerifyReferrerAfterRedirect(
9416 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9417 referrer.GetOrigin(), referrer.GetOrigin());
9418
9419 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549420}
9421
tommycli59a63432015-11-06 00:10:559422TEST_F(URLRequestTestReferrerPolicy, HTTPSToCrossOriginHTTPS) {
9423 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTPS,
9424 net::EmbeddedTestServer::TYPE_HTTPS);
estarkc8ccba82017-06-13 22:37:409425 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549426
9427 VerifyReferrerAfterRedirect(
9428 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409429 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549430
9431 VerifyReferrerAfterRedirect(
9432 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409433 referrer, origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549434
9435 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409436 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
tommycli59a63432015-11-06 00:10:559437 origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549438
estarkc8ccba82017-06-13 22:37:409439 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9440 referrer);
9441
9442 // The original referrer set on the request is expected to obey the referrer
9443 // policy and already be stripped to the origin; thus this test case just
9444 // checks that this policy doesn't cause the referrer to change when following
9445 // a redirect.
9446 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9447 referrer.GetOrigin());
9448
9449 VerifyReferrerAfterRedirect(
9450 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9451
9452 // The original referrer set on the request is expected to obey the referrer
9453 // policy and already be stripped to the origin; thus this test case just
9454 // checks that this policy doesn't cause the referrer to change when following
9455 // a redirect.
9456 VerifyReferrerAfterRedirect(
9457 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9458 referrer.GetOrigin(), referrer.GetOrigin());
9459
9460 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549461}
9462
tommycli59a63432015-11-06 00:10:559463TEST_F(URLRequestTestReferrerPolicy, HTTPToHTTPS) {
9464 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTP,
9465 net::EmbeddedTestServer::TYPE_HTTPS);
estarkc8ccba82017-06-13 22:37:409466 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549467
9468 VerifyReferrerAfterRedirect(
9469 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409470 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549471
9472 VerifyReferrerAfterRedirect(
9473 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409474 referrer, origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549475
9476 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409477 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
tommycli59a63432015-11-06 00:10:559478 origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549479
estarkc8ccba82017-06-13 22:37:409480 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9481 referrer);
9482
9483 // The original referrer set on the request is expected to obey the referrer
9484 // policy and already be stripped to the origin; thus this test case just
9485 // checks that this policy doesn't cause the referrer to change when following
9486 // a redirect.
9487 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9488 referrer.GetOrigin());
9489
9490 VerifyReferrerAfterRedirect(
9491 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9492
9493 // The original referrer set on the request is expected to obey the referrer
9494 // policy and already be stripped to the origin; thus this test case just
9495 // checks that this policy doesn't cause the referrer to change when following
9496 // a redirect.
9497 VerifyReferrerAfterRedirect(
9498 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9499 referrer.GetOrigin(), referrer.GetOrigin());
9500
9501 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549502}
9503
tommycli59a63432015-11-06 00:10:559504TEST_F(URLRequestTestReferrerPolicy, HTTPSToHTTP) {
9505 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTPS,
9506 net::EmbeddedTestServer::TYPE_HTTP);
estarkc8ccba82017-06-13 22:37:409507 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549508
9509 VerifyReferrerAfterRedirect(
9510 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409511 referrer, GURL());
mkwst0c5eab872014-11-21 14:18:549512
9513 VerifyReferrerAfterRedirect(
9514 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409515 referrer, GURL());
mkwst0c5eab872014-11-21 14:18:549516
9517 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409518 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
tommycli59a63432015-11-06 00:10:559519 origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549520
estarkc8ccba82017-06-13 22:37:409521 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9522 referrer);
9523
9524 // The original referrer set on the request is expected to obey the referrer
9525 // policy and already be stripped to the origin; thus this test case just
9526 // checks that this policy doesn't cause the referrer to change when following
9527 // a redirect.
9528 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9529 referrer.GetOrigin());
9530
9531 VerifyReferrerAfterRedirect(
9532 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9533
9534 // The original referrer set on the request is expected to obey the referrer
9535 // policy and already be stripped to the origin, though it should be
9536 // subsequently cleared during the downgrading redirect.
9537 VerifyReferrerAfterRedirect(
9538 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9539 referrer.GetOrigin(), GURL());
9540
9541 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549542}
9543
[email protected]73e0bba2009-02-19 22:57:099544class HTTPSRequestTest : public testing::Test {
[email protected]87a09a92011-07-14 15:50:509545 public:
fdorayf33fede2017-05-11 21:18:109546 HTTPSRequestTest() : default_context_(true) {
[email protected]ef2bf422012-05-11 03:27:099547 default_context_.set_network_delegate(&default_network_delegate_);
9548 default_context_.Init();
[email protected]87a09a92011-07-14 15:50:509549 }
Martijn Croonenb1383da2017-10-11 11:56:359550 ~HTTPSRequestTest() override {
9551 SetTransportSecurityStateSourceForTesting(nullptr);
9552 }
[email protected]87a09a92011-07-14 15:50:509553
9554 protected:
[email protected]ceefd7fd2012-11-29 00:36:249555 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest.
[email protected]ef2bf422012-05-11 03:27:099556 TestURLRequestContext default_context_;
[email protected]ea224582008-12-07 20:25:469557};
9558
[email protected]c044616e2013-02-20 02:01:269559TEST_F(HTTPSRequestTest, HTTPSGetTest) {
tommycli59a63432015-11-06 00:10:559560 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9561 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229562 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]95409e12010-08-17 20:07:119563 ASSERT_TRUE(test_server.Start());
[email protected]ea224582008-12-07 20:25:469564
[email protected]ea224582008-12-07 20:25:469565 TestDelegate d;
9566 {
danakj8522a25b2016-04-16 00:17:369567 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169568 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9569 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:199570 r->Start();
9571 EXPECT_TRUE(r->is_pending());
[email protected]ea224582008-12-07 20:25:469572
[email protected]255620da2013-08-19 13:14:299573 base::RunLoop().Run();
[email protected]ea224582008-12-07 20:25:469574
9575 EXPECT_EQ(1, d.response_started_count());
9576 EXPECT_FALSE(d.received_data_before_response());
9577 EXPECT_NE(0, d.bytes_received());
[email protected]f7022f32014-08-21 16:32:199578 CheckSSLInfo(r->ssl_info());
[email protected]6d81b482011-02-22 19:47:199579 EXPECT_EQ(test_server.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:199580 r->GetSocketAddress().host());
[email protected]6d81b482011-02-22 19:47:199581 EXPECT_EQ(test_server.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:199582 r->GetSocketAddress().port());
[email protected]ea224582008-12-07 20:25:469583 }
[email protected]ea224582008-12-07 20:25:469584}
9585
[email protected]5774ada2010-07-15 06:30:549586TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) {
tommycli59a63432015-11-06 00:10:559587 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9588 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
9589 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229590 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]95409e12010-08-17 20:07:119591 ASSERT_TRUE(test_server.Start());
[email protected]bacff652009-03-31 17:50:339592
9593 bool err_allowed = true;
9594 for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
9595 TestDelegate d;
9596 {
9597 d.set_allow_certificate_errors(err_allowed);
danakj8522a25b2016-04-16 00:17:369598 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169599 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9600 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]bacff652009-03-31 17:50:339601
[email protected]f7022f32014-08-21 16:32:199602 r->Start();
9603 EXPECT_TRUE(r->is_pending());
[email protected]bacff652009-03-31 17:50:339604
[email protected]255620da2013-08-19 13:14:299605 base::RunLoop().Run();
[email protected]bacff652009-03-31 17:50:339606
9607 EXPECT_EQ(1, d.response_started_count());
9608 EXPECT_FALSE(d.received_data_before_response());
9609 EXPECT_TRUE(d.have_certificate_errors());
[email protected]96adadb2010-08-28 01:16:179610 if (err_allowed) {
[email protected]bacff652009-03-31 17:50:339611 EXPECT_NE(0, d.bytes_received());
[email protected]f7022f32014-08-21 16:32:199612 CheckSSLInfo(r->ssl_info());
[email protected]96adadb2010-08-28 01:16:179613 } else {
[email protected]bacff652009-03-31 17:50:339614 EXPECT_EQ(0, d.bytes_received());
[email protected]96adadb2010-08-28 01:16:179615 }
[email protected]bacff652009-03-31 17:50:339616 }
9617 }
9618}
9619
[email protected]5774ada2010-07-15 06:30:549620TEST_F(HTTPSRequestTest, HTTPSExpiredTest) {
tommycli59a63432015-11-06 00:10:559621 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9622 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
9623 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229624 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]95409e12010-08-17 20:07:119625 ASSERT_TRUE(test_server.Start());
[email protected]bacff652009-03-31 17:50:339626
9627 // Iterate from false to true, just so that we do the opposite of the
9628 // previous test in order to increase test coverage.
9629 bool err_allowed = false;
9630 for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
9631 TestDelegate d;
9632 {
9633 d.set_allow_certificate_errors(err_allowed);
danakj8522a25b2016-04-16 00:17:369634 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169635 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9636 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]bacff652009-03-31 17:50:339637
[email protected]f7022f32014-08-21 16:32:199638 r->Start();
9639 EXPECT_TRUE(r->is_pending());
[email protected]bacff652009-03-31 17:50:339640
[email protected]255620da2013-08-19 13:14:299641 base::RunLoop().Run();
[email protected]bacff652009-03-31 17:50:339642
9643 EXPECT_EQ(1, d.response_started_count());
9644 EXPECT_FALSE(d.received_data_before_response());
9645 EXPECT_TRUE(d.have_certificate_errors());
[email protected]96adadb2010-08-28 01:16:179646 if (err_allowed) {
[email protected]bacff652009-03-31 17:50:339647 EXPECT_NE(0, d.bytes_received());
[email protected]f7022f32014-08-21 16:32:199648 CheckSSLInfo(r->ssl_info());
[email protected]96adadb2010-08-28 01:16:179649 } else {
[email protected]bacff652009-03-31 17:50:339650 EXPECT_EQ(0, d.bytes_received());
[email protected]96adadb2010-08-28 01:16:179651 }
[email protected]bacff652009-03-31 17:50:339652 }
9653 }
9654}
[email protected]73e0bba2009-02-19 22:57:099655
tommycli59a63432015-11-06 00:10:559656// TODO(svaldez): iOS tests are flaky with EmbeddedTestServer and transport
9657// security state. (see http://crbug.com/550977).
9658#if !defined(OS_IOS)
Martijn Croonenb1383da2017-10-11 11:56:359659// This tests that a load of a domain with preloaded HSTS and HPKP with a
9660// certificate error sets the |certificate_errors_are_fatal| flag correctly.
9661// This flag will cause the interstitial to be fatal.
[email protected]316c1e5e2012-09-12 15:17:449662TEST_F(HTTPSRequestTest, HTTPSPreloadedHSTSTest) {
Martijn Croonenb1383da2017-10-11 11:56:359663 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
9664
tommycli59a63432015-11-06 00:10:559665 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9666 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
9667 test_server.ServeFilesFromSourceDirectory("net/data/ssl");
[email protected]316c1e5e2012-09-12 15:17:449668 ASSERT_TRUE(test_server.Start());
9669
Martijn Croonenb1383da2017-10-11 11:56:359670 // We require that the URL be hsts-hpkp-preloaded.test. This is a test domain
9671 // that has a preloaded HSTS+HPKP entry in the TransportSecurityState. This
9672 // means that we have to use a MockHostResolver in order to direct
9673 // hsts-hpkp-preloaded.test to the testserver. By default, MockHostResolver
9674 // maps all hosts to 127.0.0.1.
[email protected]316c1e5e2012-09-12 15:17:449675
9676 MockHostResolver host_resolver;
[email protected]ceefd7fd2012-11-29 00:36:249677 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:449678 TestURLRequestContext context(true);
9679 context.set_network_delegate(&network_delegate);
9680 context.set_host_resolver(&host_resolver);
9681 TransportSecurityState transport_security_state;
9682 context.set_transport_security_state(&transport_security_state);
9683 context.Init();
9684
9685 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369686 std::unique_ptr<URLRequest> r(context.CreateRequest(
Martijn Croonenb1383da2017-10-11 11:56:359687 GURL(base::StringPrintf("https://hsts-hpkp-preloaded.test:%d",
davidben151423e2015-03-23 18:48:369688 test_server.host_port_pair().port())),
rhalavatib7bd7c792017-04-27 05:25:169689 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449690
[email protected]f7022f32014-08-21 16:32:199691 r->Start();
9692 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:449693
[email protected]255620da2013-08-19 13:14:299694 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449695
9696 EXPECT_EQ(1, d.response_started_count());
9697 EXPECT_FALSE(d.received_data_before_response());
9698 EXPECT_TRUE(d.have_certificate_errors());
9699 EXPECT_TRUE(d.certificate_errors_are_fatal());
9700}
9701
9702// This tests that cached HTTPS page loads do not cause any updates to the
9703// TransportSecurityState.
9704TEST_F(HTTPSRequestTest, HTTPSErrorsNoClobberTSSTest) {
Martijn Croonenb1383da2017-10-11 11:56:359705 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
9706
[email protected]316c1e5e2012-09-12 15:17:449707 // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't
9708 // matter. It just has to be any error.
tommycli59a63432015-11-06 00:10:559709 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9710 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
9711 test_server.ServeFilesFromSourceDirectory("net/data/ssl");
[email protected]316c1e5e2012-09-12 15:17:449712 ASSERT_TRUE(test_server.Start());
9713
Martijn Croonenb1383da2017-10-11 11:56:359714 // We require that the URL be hsts-hpkp-preloaded.test. This is a test domain
9715 // that has a preloaded HSTS+HPKP entry in the TransportSecurityState. This
9716 // means that we have to use a MockHostResolver in order to direct
9717 // hsts-hpkp-preloaded.test to the testserver. By default, MockHostResolver
9718 // maps all hosts to 127.0.0.1.
[email protected]316c1e5e2012-09-12 15:17:449719
9720 MockHostResolver host_resolver;
[email protected]ceefd7fd2012-11-29 00:36:249721 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:449722 TestURLRequestContext context(true);
9723 context.set_network_delegate(&network_delegate);
9724 context.set_host_resolver(&host_resolver);
9725 TransportSecurityState transport_security_state;
[email protected]9e6968d2014-05-07 21:46:269726
martijnc0d6b622015-06-30 19:14:409727 TransportSecurityState::STSState static_sts_state;
9728 TransportSecurityState::PKPState static_pkp_state;
[email protected]9e6968d2014-05-07 21:46:269729 EXPECT_TRUE(transport_security_state.GetStaticDomainState(
Martijn Croonenb1383da2017-10-11 11:56:359730 "hsts-hpkp-preloaded.test", &static_sts_state, &static_pkp_state));
[email protected]316c1e5e2012-09-12 15:17:449731 context.set_transport_security_state(&transport_security_state);
9732 context.Init();
9733
martijnc0d6b622015-06-30 19:14:409734 TransportSecurityState::STSState dynamic_sts_state;
9735 TransportSecurityState::PKPState dynamic_pkp_state;
Martijn Croonenb1383da2017-10-11 11:56:359736 EXPECT_FALSE(transport_security_state.GetDynamicSTSState(
9737 "hsts-hpkp-preloaded.test", &dynamic_sts_state));
9738 EXPECT_FALSE(transport_security_state.GetDynamicPKPState(
9739 "hsts-hpkp-preloaded.test", &dynamic_pkp_state));
[email protected]9e6968d2014-05-07 21:46:269740
[email protected]316c1e5e2012-09-12 15:17:449741 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369742 std::unique_ptr<URLRequest> r(context.CreateRequest(
Martijn Croonenb1383da2017-10-11 11:56:359743 GURL(base::StringPrintf("https://hsts-hpkp-preloaded.test:%d",
davidben151423e2015-03-23 18:48:369744 test_server.host_port_pair().port())),
rhalavatib7bd7c792017-04-27 05:25:169745 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449746
[email protected]f7022f32014-08-21 16:32:199747 r->Start();
9748 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:449749
[email protected]255620da2013-08-19 13:14:299750 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449751
9752 EXPECT_EQ(1, d.response_started_count());
9753 EXPECT_FALSE(d.received_data_before_response());
9754 EXPECT_TRUE(d.have_certificate_errors());
9755 EXPECT_TRUE(d.certificate_errors_are_fatal());
9756
[email protected]9e6968d2014-05-07 21:46:269757 // Get a fresh copy of the states, and check that they haven't changed.
martijnc0d6b622015-06-30 19:14:409758 TransportSecurityState::STSState new_static_sts_state;
9759 TransportSecurityState::PKPState new_static_pkp_state;
[email protected]9e6968d2014-05-07 21:46:269760 EXPECT_TRUE(transport_security_state.GetStaticDomainState(
Martijn Croonenb1383da2017-10-11 11:56:359761 "hsts-hpkp-preloaded.test", &new_static_sts_state,
9762 &new_static_pkp_state));
martijnc0d6b622015-06-30 19:14:409763 TransportSecurityState::STSState new_dynamic_sts_state;
9764 TransportSecurityState::PKPState new_dynamic_pkp_state;
9765 EXPECT_FALSE(transport_security_state.GetDynamicSTSState(
Martijn Croonenb1383da2017-10-11 11:56:359766 "hsts-hpkp-preloaded.test", &new_dynamic_sts_state));
martijnc0d6b622015-06-30 19:14:409767 EXPECT_FALSE(transport_security_state.GetDynamicPKPState(
Martijn Croonenb1383da2017-10-11 11:56:359768 "hsts-hpkp-preloaded.test", &new_dynamic_pkp_state));
[email protected]9e6968d2014-05-07 21:46:269769
martijnc0d6b622015-06-30 19:14:409770 EXPECT_EQ(new_static_sts_state.upgrade_mode, static_sts_state.upgrade_mode);
9771 EXPECT_EQ(new_static_sts_state.include_subdomains,
9772 static_sts_state.include_subdomains);
9773 EXPECT_EQ(new_static_pkp_state.include_subdomains,
9774 static_pkp_state.include_subdomains);
rsleevi91d4c9c2016-05-14 20:28:489775 EXPECT_EQ(new_static_pkp_state.spki_hashes, static_pkp_state.spki_hashes);
9776 EXPECT_EQ(new_static_pkp_state.bad_spki_hashes,
9777 static_pkp_state.bad_spki_hashes);
[email protected]316c1e5e2012-09-12 15:17:449778}
9779
[email protected]8ccc69f2012-11-28 19:52:149780// Make sure HSTS preserves a POST request's method and body.
9781TEST_F(HTTPSRequestTest, HSTSPreservesPosts) {
9782 static const char kData[] = "hello world";
9783
tommycli59a63432015-11-06 00:10:559784 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9785 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229786 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]8ccc69f2012-11-28 19:52:149787 ASSERT_TRUE(test_server.Start());
9788
9789
9790 // Per spec, TransportSecurityState expects a domain name, rather than an IP
9791 // address, so a MockHostResolver is needed to redirect www.somewhere.com to
tommycli59a63432015-11-06 00:10:559792 // the EmbeddedTestServer. By default, MockHostResolver maps all hosts
[email protected]ce7d0cbc2013-05-03 18:57:229793 // to 127.0.0.1.
[email protected]8ccc69f2012-11-28 19:52:149794 MockHostResolver host_resolver;
[email protected]8ccc69f2012-11-28 19:52:149795
9796 // Force https for www.somewhere.com.
9797 TransportSecurityState transport_security_state;
[email protected]474f079e2013-03-02 19:11:209798 base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000);
9799 bool include_subdomains = false;
9800 transport_security_state.AddHSTS("www.somewhere.com", expiry,
9801 include_subdomains);
[email protected]8ccc69f2012-11-28 19:52:149802
9803 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
9804
9805 TestURLRequestContext context(true);
9806 context.set_host_resolver(&host_resolver);
9807 context.set_transport_security_state(&transport_security_state);
9808 context.set_network_delegate(&network_delegate);
9809 context.Init();
9810
9811 TestDelegate d;
9812 // Navigating to https://www.somewhere.com instead of https://127.0.0.1 will
9813 // cause a certificate error. Ignore the error.
9814 d.set_allow_certificate_errors(true);
9815
danakj8522a25b2016-04-16 00:17:369816 std::unique_ptr<URLRequest> req(context.CreateRequest(
[email protected]f7022f32014-08-21 16:32:199817 GURL(base::StringPrintf("http://www.somewhere.com:%d/echo",
davidben151423e2015-03-23 18:48:369818 test_server.host_port_pair().port())),
rhalavatib7bd7c792017-04-27 05:25:169819 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:199820 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:079821 req->set_upload(CreateSimpleUploadData(kData));
[email protected]8ccc69f2012-11-28 19:52:149822
[email protected]f7022f32014-08-21 16:32:199823 req->Start();
[email protected]255620da2013-08-19 13:14:299824 base::RunLoop().Run();
[email protected]8ccc69f2012-11-28 19:52:149825
[email protected]f7022f32014-08-21 16:32:199826 EXPECT_EQ("https", req->url().scheme());
9827 EXPECT_EQ("POST", req->method());
[email protected]8ccc69f2012-11-28 19:52:149828 EXPECT_EQ(kData, d.data_received());
[email protected]07d9bfd2013-06-27 14:16:409829
9830 LoadTimingInfo load_timing_info;
9831 network_delegate.GetLoadTimingInfoBeforeRedirect(&load_timing_info);
9832 // LoadTimingInfo of HSTS redirects is similar to that of network cache hits
9833 TestLoadTimingCacheHitNoNetwork(load_timing_info);
[email protected]8ccc69f2012-11-28 19:52:149834}
9835
rob4e0be1f2014-09-11 23:40:229836// Make sure that the CORS headers are added to cross-origin HSTS redirects.
9837TEST_F(HTTPSRequestTest, HSTSCrossOriginAddHeaders) {
9838 static const char kOriginHeaderValue[] = "http://www.example.com";
9839
tommycli59a63432015-11-06 00:10:559840 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9841 test_server.ServeFilesFromSourceDirectory("net/data/ssl");
rob4e0be1f2014-09-11 23:40:229842 ASSERT_TRUE(test_server.Start());
9843
9844 // Per spec, TransportSecurityState expects a domain name, rather than an IP
9845 // address, so a MockHostResolver is needed to redirect example.net to the
tommycli59a63432015-11-06 00:10:559846 // EmbeddedTestServer. MockHostResolver maps all hosts to 127.0.0.1 by
9847 // default.
rob4e0be1f2014-09-11 23:40:229848 MockHostResolver host_resolver;
9849
9850 TransportSecurityState transport_security_state;
9851 base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1);
9852 bool include_subdomains = false;
9853 transport_security_state.AddHSTS("example.net", expiry, include_subdomains);
9854
9855 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
9856
9857 MockCertVerifier cert_verifier;
9858 cert_verifier.set_default_result(OK);
9859
9860 TestURLRequestContext context(true);
9861 context.set_host_resolver(&host_resolver);
9862 context.set_transport_security_state(&transport_security_state);
9863 context.set_network_delegate(&network_delegate);
9864 context.set_cert_verifier(&cert_verifier);
9865 context.Init();
9866
9867 GURL hsts_http_url(base::StringPrintf("http://example.net:%d/somehstssite",
9868 test_server.host_port_pair().port()));
9869 url::Replacements<char> replacements;
9870 const char kNewScheme[] = "https";
9871 replacements.SetScheme(kNewScheme, url::Component(0, strlen(kNewScheme)));
9872 GURL hsts_https_url = hsts_http_url.ReplaceComponents(replacements);
9873
9874 TestDelegate d;
9875 // Quit on redirect to allow response header inspection upon redirect.
9876 d.set_quit_on_redirect(true);
9877
rhalavatib7bd7c792017-04-27 05:25:169878 std::unique_ptr<URLRequest> req(context.CreateRequest(
9879 hsts_http_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
rob4e0be1f2014-09-11 23:40:229880 // Set Origin header to simulate a cross-origin request.
9881 HttpRequestHeaders request_headers;
9882 request_headers.SetHeader("Origin", kOriginHeaderValue);
9883 req->SetExtraRequestHeaders(request_headers);
9884
9885 req->Start();
9886 base::RunLoop().Run();
9887
9888 EXPECT_EQ(1, d.received_redirect_count());
9889
9890 const HttpResponseHeaders* headers = req->response_headers();
9891 std::string redirect_location;
9892 EXPECT_TRUE(headers->EnumerateHeader(NULL, "Location", &redirect_location));
9893 EXPECT_EQ(hsts_https_url.spec(), redirect_location);
9894
9895 std::string received_cors_header;
9896 EXPECT_TRUE(headers->EnumerateHeader(NULL, "Access-Control-Allow-Origin",
9897 &received_cors_header));
9898 EXPECT_EQ(kOriginHeaderValue, received_cors_header);
9899}
9900
[email protected]316c1e5e2012-09-12 15:17:449901namespace {
9902
9903class SSLClientAuthTestDelegate : public TestDelegate {
9904 public:
9905 SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) {
9906 }
dchengb03027d2014-10-21 12:00:209907 void OnCertificateRequested(URLRequest* request,
9908 SSLCertRequestInfo* cert_request_info) override {
[email protected]316c1e5e2012-09-12 15:17:449909 on_certificate_requested_count_++;
Gabriel Charette53a9ef812017-07-26 12:36:239910 base::RunLoop::QuitCurrentWhenIdleDeprecated();
[email protected]316c1e5e2012-09-12 15:17:449911 }
9912 int on_certificate_requested_count() {
9913 return on_certificate_requested_count_;
9914 }
9915 private:
9916 int on_certificate_requested_count_;
9917};
9918
9919} // namespace
9920
9921// TODO(davidben): Test the rest of the code. Specifically,
9922// - Filtering which certificates to select.
9923// - Sending a certificate back.
9924// - Getting a certificate request in an SSL renegotiation sending the
9925// HTTP request.
9926TEST_F(HTTPSRequestTest, ClientAuthTest) {
tommycli59a63432015-11-06 00:10:559927 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9928 net::SSLServerConfig ssl_config;
ryanchung987b2ff2016-02-19 00:17:129929 ssl_config.client_cert_type =
9930 SSLServerConfig::ClientCertType::OPTIONAL_CLIENT_CERT;
tommycli59a63432015-11-06 00:10:559931 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config);
9932 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229933 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]316c1e5e2012-09-12 15:17:449934 ASSERT_TRUE(test_server.Start());
9935
9936 SSLClientAuthTestDelegate d;
9937 {
danakj8522a25b2016-04-16 00:17:369938 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169939 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9940 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449941
[email protected]f7022f32014-08-21 16:32:199942 r->Start();
9943 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:449944
[email protected]255620da2013-08-19 13:14:299945 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449946
9947 EXPECT_EQ(1, d.on_certificate_requested_count());
9948 EXPECT_FALSE(d.received_data_before_response());
9949 EXPECT_EQ(0, d.bytes_received());
9950
9951 // Send no certificate.
9952 // TODO(davidben): Get temporary client cert import (with keys) working on
9953 // all platforms so we can test sending a cert as well.
svaldez7872fd02015-11-19 21:10:549954 r->ContinueWithCertificate(nullptr, nullptr);
[email protected]316c1e5e2012-09-12 15:17:449955
[email protected]255620da2013-08-19 13:14:299956 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449957
9958 EXPECT_EQ(1, d.response_started_count());
9959 EXPECT_FALSE(d.received_data_before_response());
9960 EXPECT_NE(0, d.bytes_received());
9961 }
9962}
9963
9964TEST_F(HTTPSRequestTest, ResumeTest) {
9965 // Test that we attempt a session resume when making two connections to the
9966 // same host.
[email protected]ce7d0cbc2013-05-03 18:57:229967 SpawnedTestServer::SSLOptions ssl_options;
[email protected]316c1e5e2012-09-12 15:17:449968 ssl_options.record_resume = true;
[email protected]ce7d0cbc2013-05-03 18:57:229969 SpawnedTestServer test_server(
9970 SpawnedTestServer::TYPE_HTTPS,
9971 ssl_options,
9972 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]316c1e5e2012-09-12 15:17:449973 ASSERT_TRUE(test_server.Start());
9974
9975 SSLClientSocket::ClearSessionCache();
9976
9977 {
9978 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369979 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169980 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
9981 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449982
[email protected]f7022f32014-08-21 16:32:199983 r->Start();
9984 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:449985
[email protected]255620da2013-08-19 13:14:299986 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449987
9988 EXPECT_EQ(1, d.response_started_count());
9989 }
9990
9991 reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())->
9992 CloseAllConnections();
9993
9994 {
9995 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369996 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169997 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
9998 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449999
[email protected]f7022f32014-08-21 16:32:1910000 r->Start();
10001 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410002
[email protected]255620da2013-08-19 13:14:2910003 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410004
10005 // The response will look like;
10006 // insert abc
10007 // lookup abc
10008 // insert xyz
10009 //
10010 // With a newline at the end which makes the split think that there are
10011 // four lines.
10012
10013 EXPECT_EQ(1, d.response_started_count());
brettw3a2c6902015-07-06 19:43:2910014 std::vector<std::string> lines = base::SplitString(
10015 d.data_received(), "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]316c1e5e2012-09-12 15:17:4410016 ASSERT_EQ(4u, lines.size()) << d.data_received();
10017
10018 std::string session_id;
10019
10020 for (size_t i = 0; i < 2; i++) {
brettw3a2c6902015-07-06 19:43:2910021 std::vector<std::string> parts = base::SplitString(
10022 lines[i], "\t", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]316c1e5e2012-09-12 15:17:4410023 ASSERT_EQ(2u, parts.size());
10024 if (i == 0) {
10025 EXPECT_EQ("insert", parts[0]);
10026 session_id = parts[1];
10027 } else {
10028 EXPECT_EQ("lookup", parts[0]);
10029 EXPECT_EQ(session_id, parts[1]);
10030 }
10031 }
10032 }
10033}
10034
Adam Langley32352ad2014-10-14 22:31:0010035// AssertTwoDistinctSessionsInserted checks that |session_info|, which must be
10036// the result of fetching "ssl-session-cache" from the test server, indicates
10037// that exactly two different sessions were inserted, with no lookups etc.
10038static void AssertTwoDistinctSessionsInserted(const string& session_info) {
brettw3a2c6902015-07-06 19:43:2910039 std::vector<std::string> lines = base::SplitString(
10040 session_info, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
Adam Langley32352ad2014-10-14 22:31:0010041 ASSERT_EQ(3u, lines.size()) << session_info;
10042
10043 std::string session_id;
10044 for (size_t i = 0; i < 2; i++) {
brettw3a2c6902015-07-06 19:43:2910045 std::vector<std::string> parts = base::SplitString(
10046 lines[i], "\t", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
Adam Langley32352ad2014-10-14 22:31:0010047 ASSERT_EQ(2u, parts.size());
10048 EXPECT_EQ("insert", parts[0]);
10049 if (i == 0) {
10050 session_id = parts[1];
10051 } else {
10052 EXPECT_NE(session_id, parts[1]);
10053 }
10054 }
10055}
10056
[email protected]316c1e5e2012-09-12 15:17:4410057TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) {
10058 // Test that sessions aren't resumed when the value of ssl_session_cache_shard
10059 // differs.
[email protected]ce7d0cbc2013-05-03 18:57:2210060 SpawnedTestServer::SSLOptions ssl_options;
[email protected]316c1e5e2012-09-12 15:17:4410061 ssl_options.record_resume = true;
[email protected]ce7d0cbc2013-05-03 18:57:2210062 SpawnedTestServer test_server(
10063 SpawnedTestServer::TYPE_HTTPS,
10064 ssl_options,
10065 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]316c1e5e2012-09-12 15:17:4410066 ASSERT_TRUE(test_server.Start());
10067
10068 SSLClientSocket::ClearSessionCache();
10069
10070 {
10071 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610072 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610073 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10074 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:4410075
[email protected]f7022f32014-08-21 16:32:1910076 r->Start();
10077 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410078
[email protected]255620da2013-08-19 13:14:2910079 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410080
10081 EXPECT_EQ(1, d.response_started_count());
10082 }
10083
10084 // Now create a new HttpCache with a different ssl_session_cache_shard value.
mmenke6ddfbea2017-05-31 21:48:4110085 HttpNetworkSession::Context session_context;
10086 session_context.host_resolver = default_context_.host_resolver();
10087 session_context.cert_verifier = default_context_.cert_verifier();
10088 session_context.transport_security_state =
10089 default_context_.transport_security_state();
10090 session_context.cert_transparency_verifier =
rsleevid6de8302016-06-21 01:33:2010091 default_context_.cert_transparency_verifier();
mmenke6ddfbea2017-05-31 21:48:4110092 session_context.ct_policy_enforcer = default_context_.ct_policy_enforcer();
10093 session_context.proxy_service = default_context_.proxy_service();
10094 session_context.ssl_config_service = default_context_.ssl_config_service();
10095 session_context.http_auth_handler_factory =
[email protected]316c1e5e2012-09-12 15:17:4410096 default_context_.http_auth_handler_factory();
mmenke6ddfbea2017-05-31 21:48:4110097 session_context.http_server_properties =
10098 default_context_.http_server_properties();
[email protected]316c1e5e2012-09-12 15:17:4410099
mmenke6ddfbea2017-05-31 21:48:4110100 HttpNetworkSession network_session(HttpNetworkSession::Params(),
10101 session_context);
zhongyi4928bd52017-02-08 02:16:2710102 std::unique_ptr<HttpCache> cache(
10103 new HttpCache(&network_session, HttpCache::DefaultBackend::InMemory(0),
10104 false /* is_main_cache */));
[email protected]316c1e5e2012-09-12 15:17:4410105
10106 default_context_.set_http_transaction_factory(cache.get());
10107
10108 {
10109 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610110 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610111 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10112 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:4410113
[email protected]f7022f32014-08-21 16:32:1910114 r->Start();
10115 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410116
[email protected]255620da2013-08-19 13:14:2910117 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410118
10119 // The response will look like;
10120 // insert abc
10121 // insert xyz
10122 //
10123 // With a newline at the end which makes the split think that there are
10124 // three lines.
10125
10126 EXPECT_EQ(1, d.response_started_count());
Adam Langley32352ad2014-10-14 22:31:0010127 AssertTwoDistinctSessionsInserted(d.data_received());
[email protected]316c1e5e2012-09-12 15:17:4410128 }
10129}
10130
[email protected]48d2b7c52014-06-27 01:16:5510131class HTTPSFallbackTest : public testing::Test {
10132 public:
fdorayf33fede2017-05-11 21:18:1010133 HTTPSFallbackTest() : context_(true) {
davidben095ebb52017-04-12 22:23:3410134 ssl_config_service_ = new TestSSLConfigService(
10135 true /* check for EV */, false /* online revocation checking */,
10136 false /* require rev. checking for local anchors */,
10137 false /* token binding enabled */);
10138 context_.set_ssl_config_service(ssl_config_service_.get());
10139 }
dcheng67be2b1f2014-10-27 21:47:2910140 ~HTTPSFallbackTest() override {}
[email protected]48d2b7c52014-06-27 01:16:5510141
10142 protected:
davidben095ebb52017-04-12 22:23:3410143 TestSSLConfigService* ssl_config_service() {
10144 return ssl_config_service_.get();
10145 }
10146
[email protected]48d2b7c52014-06-27 01:16:5510147 void DoFallbackTest(const SpawnedTestServer::SSLOptions& ssl_options) {
10148 DCHECK(!request_);
Adam Langley32352ad2014-10-14 22:31:0010149 context_.Init();
10150 delegate_.set_allow_certificate_errors(true);
10151
[email protected]48d2b7c52014-06-27 01:16:5510152 SpawnedTestServer test_server(
10153 SpawnedTestServer::TYPE_HTTPS,
10154 ssl_options,
10155 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
10156 ASSERT_TRUE(test_server.Start());
10157
tommycli59a63432015-11-06 00:10:5510158 request_ = context_.CreateRequest(test_server.GetURL("/"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:1610159 &delegate_, TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]48d2b7c52014-06-27 01:16:5510160 request_->Start();
10161
10162 base::RunLoop().Run();
10163 }
10164
davidben095ebb52017-04-12 22:23:3410165 void ExpectConnection(int version) {
10166 EXPECT_EQ(1, delegate_.response_started_count());
10167 EXPECT_NE(0, delegate_.bytes_received());
10168 EXPECT_EQ(version, SSLConnectionStatusToVersion(
10169 request_->ssl_info().connection_status));
10170 }
10171
[email protected]48d2b7c52014-06-27 01:16:5510172 void ExpectFailure(int error) {
10173 EXPECT_EQ(1, delegate_.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:5010174 EXPECT_EQ(error, delegate_.request_status());
[email protected]48d2b7c52014-06-27 01:16:5510175 }
10176
10177 private:
10178 TestDelegate delegate_;
davidben5a312152016-06-27 22:11:4710179 TestURLRequestContext context_;
danakj8522a25b2016-04-16 00:17:3610180 std::unique_ptr<URLRequest> request_;
davidben095ebb52017-04-12 22:23:3410181 scoped_refptr<TestSSLConfigService> ssl_config_service_;
[email protected]48d2b7c52014-06-27 01:16:5510182};
10183
davidbenb127ca82015-06-15 19:05:4210184// Tests the TLS 1.0 fallback doesn't happen.
10185TEST_F(HTTPSFallbackTest, TLSv1NoFallback) {
[email protected]48d2b7c52014-06-27 01:16:5510186 SpawnedTestServer::SSLOptions ssl_options(
10187 SpawnedTestServer::SSLOptions::CERT_OK);
10188 ssl_options.tls_intolerant =
10189 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1;
10190
10191 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
davidben3b267512016-02-24 19:46:5510192 ExpectFailure(ERR_SSL_VERSION_OR_CIPHER_MISMATCH);
davidbenb127ca82015-06-15 19:05:4210193}
10194
davidben5a312152016-06-27 22:11:4710195// Tests the TLS 1.1 fallback doesn't happen.
davidben3b267512016-02-24 19:46:5510196TEST_F(HTTPSFallbackTest, TLSv1_1NoFallback) {
davidbenb127ca82015-06-15 19:05:4210197 SpawnedTestServer::SSLOptions ssl_options(
10198 SpawnedTestServer::SSLOptions::CERT_OK);
10199 ssl_options.tls_intolerant =
10200 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_2;
10201
10202 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
[email protected]48d2b7c52014-06-27 01:16:5510203 ExpectFailure(ERR_SSL_VERSION_OR_CIPHER_MISMATCH);
10204}
10205
davidben095ebb52017-04-12 22:23:3410206// Tests that TLS 1.3 interference results in a dedicated error code.
10207TEST_F(HTTPSFallbackTest, TLSv1_3Interference) {
10208 SpawnedTestServer::SSLOptions ssl_options(
10209 SpawnedTestServer::SSLOptions::CERT_OK);
10210 ssl_options.tls_intolerant =
10211 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_3;
10212 ssl_config_service()->set_max_version(SSL_PROTOCOL_VERSION_TLS1_3);
10213
10214 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
10215 ExpectFailure(ERR_SSL_VERSION_INTERFERENCE);
10216}
10217
10218// Tests that disabling TLS 1.3 leaves TLS 1.3 interference unnoticed.
10219TEST_F(HTTPSFallbackTest, TLSv1_3InterferenceDisableVersion) {
10220 SpawnedTestServer::SSLOptions ssl_options(
10221 SpawnedTestServer::SSLOptions::CERT_OK);
10222 ssl_options.tls_intolerant =
10223 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_3;
10224 ssl_config_service()->set_max_version(SSL_PROTOCOL_VERSION_TLS1_2);
10225
10226 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
10227 ExpectConnection(SSL_CONNECTION_VERSION_TLS1_2);
10228}
10229
[email protected]a8fed1742013-12-27 02:14:2410230class HTTPSSessionTest : public testing::Test {
10231 public:
fdorayf33fede2017-05-11 21:18:1010232 HTTPSSessionTest() : default_context_(true) {
[email protected]cba24642014-08-15 20:49:5910233 cert_verifier_.set_default_result(OK);
[email protected]a8fed1742013-12-27 02:14:2410234
10235 default_context_.set_network_delegate(&default_network_delegate_);
10236 default_context_.set_cert_verifier(&cert_verifier_);
10237 default_context_.Init();
10238 }
dcheng67be2b1f2014-10-27 21:47:2910239 ~HTTPSSessionTest() override {}
[email protected]a8fed1742013-12-27 02:14:2410240
10241 protected:
10242 MockCertVerifier cert_verifier_;
10243 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest.
10244 TestURLRequestContext default_context_;
10245};
10246
10247// Tests that session resumption is not attempted if an invalid certificate
10248// is presented.
10249TEST_F(HTTPSSessionTest, DontResumeSessionsForInvalidCertificates) {
10250 SpawnedTestServer::SSLOptions ssl_options;
10251 ssl_options.record_resume = true;
10252 SpawnedTestServer test_server(
10253 SpawnedTestServer::TYPE_HTTPS,
10254 ssl_options,
10255 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
10256 ASSERT_TRUE(test_server.Start());
10257
10258 SSLClientSocket::ClearSessionCache();
10259
10260 // Simulate the certificate being expired and attempt a connection.
[email protected]cba24642014-08-15 20:49:5910261 cert_verifier_.set_default_result(ERR_CERT_DATE_INVALID);
[email protected]a8fed1742013-12-27 02:14:2410262 {
10263 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610264 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610265 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10266 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]a8fed1742013-12-27 02:14:2410267
[email protected]f7022f32014-08-21 16:32:1910268 r->Start();
10269 EXPECT_TRUE(r->is_pending());
[email protected]a8fed1742013-12-27 02:14:2410270
10271 base::RunLoop().Run();
10272
10273 EXPECT_EQ(1, d.response_started_count());
10274 }
10275
10276 reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())->
10277 CloseAllConnections();
10278
10279 // Now change the certificate to be acceptable (so that the response is
10280 // loaded), and ensure that no session id is presented to the peer.
[email protected]cba24642014-08-15 20:49:5910281 cert_verifier_.set_default_result(OK);
[email protected]a8fed1742013-12-27 02:14:2410282 {
10283 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610284 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610285 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10286 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]a8fed1742013-12-27 02:14:2410287
[email protected]f7022f32014-08-21 16:32:1910288 r->Start();
10289 EXPECT_TRUE(r->is_pending());
[email protected]a8fed1742013-12-27 02:14:2410290
10291 base::RunLoop().Run();
10292
10293 // The response will look like;
10294 // insert abc
10295 // insert xyz
10296 //
10297 // With a newline at the end which makes the split think that there are
10298 // three lines.
10299 //
10300 // If a session was presented (eg: a bug), then the response would look
10301 // like;
10302 // insert abc
10303 // lookup abc
10304 // insert xyz
10305
10306 EXPECT_EQ(1, d.response_started_count());
Adam Langley32352ad2014-10-14 22:31:0010307 AssertTwoDistinctSessionsInserted(d.data_received());
[email protected]a8fed1742013-12-27 02:14:2410308 }
10309}
10310
[email protected]dffe8242012-03-20 15:14:2710311// This the fingerprint of the "Testing CA" certificate used by the testserver.
10312// See net/data/ssl/certificates/ocsp-test-root.pem.
David Benjamin9cedc3a52017-08-20 21:30:5810313static const SHA256HashValue kOCSPTestCertFingerprint = {{
10314 0x0c, 0xa9, 0x05, 0x11, 0xb0, 0xa2, 0xc0, 0x1d, 0x40, 0x6a, 0x99,
10315 0x04, 0x21, 0x36, 0x45, 0x3f, 0x59, 0x12, 0x5c, 0x80, 0x64, 0x2d,
10316 0x46, 0x6a, 0x3b, 0x78, 0x9e, 0x84, 0xea, 0x54, 0x0f, 0x8b,
mattm3b4376f12016-10-03 21:07:1510317}};
[email protected]dffe8242012-03-20 15:14:2710318
[email protected]51523f52013-07-31 21:57:2810319// This is the SHA256, SPKI hash of the "Testing CA" certificate used by the
10320// testserver.
mattm0b12a6f2016-11-29 19:57:1610321static const SHA256HashValue kOCSPTestCertSPKI = {{
10322 0x05, 0xa8, 0xf6, 0xfd, 0x8e, 0x10, 0xfe, 0x92, 0x2f, 0x22, 0x75,
10323 0x46, 0x40, 0xf4, 0xc4, 0x57, 0x06, 0x0d, 0x95, 0xfd, 0x60, 0x31,
10324 0x3b, 0xf3, 0xfc, 0x12, 0x47, 0xe7, 0x66, 0x1a, 0x82, 0xa3,
10325}};
[email protected]51523f52013-07-31 21:57:2810326
[email protected]dffe8242012-03-20 15:14:2710327// This is the policy OID contained in the certificates that testserver
10328// generates.
10329static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1";
10330
10331class HTTPSOCSPTest : public HTTPSRequestTest {
10332 public:
10333 HTTPSOCSPTest()
[email protected]ef2bf422012-05-11 03:27:0910334 : context_(true),
[email protected]b6f2de32012-08-17 04:35:0810335 ev_test_policy_(
10336 new ScopedTestEVPolicy(EVRootCAMetadata::GetInstance(),
10337 kOCSPTestCertFingerprint,
10338 kOCSPTestCertPolicy)) {
[email protected]a13234c2012-03-20 21:45:0210339 }
10340
dcheng67be2b1f2014-10-27 21:47:2910341 void SetUp() override {
rsleevid6de8302016-06-21 01:33:2010342 context_.SetCTPolicyEnforcer(
Jeremy Roman0579ed62017-08-29 15:56:1910343 std::make_unique<AllowAnyCertCTPolicyEnforcer>());
rsleevid6de8302016-06-21 01:33:2010344 SetupContext();
[email protected]ef2bf422012-05-11 03:27:0910345 context_.Init();
[email protected]dffe8242012-03-20 15:14:2710346
[email protected]cba24642014-08-15 20:49:5910347 scoped_refptr<X509Certificate> root_cert =
[email protected]3a86a712013-07-30 07:16:2010348 ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem");
dchengc2e01e82014-08-27 00:24:4210349 CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert.get());
[email protected]90499482013-06-01 00:39:5010350 test_root_.reset(new ScopedTestRoot(root_cert.get()));
[email protected]dffe8242012-03-20 15:14:2710351
Eric Romanefddd0a2017-10-10 02:14:2510352#if defined(USE_BUILTIN_CERT_VERIFIER)
10353 SetGlobalCertNetFetcherForTesting(net::CreateCertNetFetcher(&context_));
10354#endif
10355
svaldez2135be52016-04-20 16:34:5310356#if defined(USE_NSS_CERTS)
[email protected]ef2bf422012-05-11 03:27:0910357 SetURLRequestContextForNSSHttpIO(&context_);
[email protected]dffe8242012-03-20 15:14:2710358 EnsureNSSHttpIOInit();
10359#endif
10360 }
10361
dadrian612337a2016-07-20 22:36:5810362 void DoConnectionWithDelegate(
10363 const SpawnedTestServer::SSLOptions& ssl_options,
10364 TestDelegate* delegate,
10365 SSLInfo* out_ssl_info) {
10366 // Always overwrite |out_ssl_info|.
10367 out_ssl_info->Reset();
10368
[email protected]ce7d0cbc2013-05-03 18:57:2210369 SpawnedTestServer test_server(
10370 SpawnedTestServer::TYPE_HTTPS,
10371 ssl_options,
10372 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]dffe8242012-03-20 15:14:2710373 ASSERT_TRUE(test_server.Start());
10374
dadrian612337a2016-07-20 22:36:5810375 delegate->set_allow_certificate_errors(true);
rhalavatib7bd7c792017-04-27 05:25:1610376 std::unique_ptr<URLRequest> r(
10377 context_.CreateRequest(test_server.GetURL("/"), DEFAULT_PRIORITY,
10378 delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1910379 r->Start();
[email protected]dffe8242012-03-20 15:14:2710380
[email protected]255620da2013-08-19 13:14:2910381 base::RunLoop().Run();
dadrian612337a2016-07-20 22:36:5810382 EXPECT_EQ(1, delegate->response_started_count());
[email protected]dffe8242012-03-20 15:14:2710383
dadrian612337a2016-07-20 22:36:5810384 *out_ssl_info = r->ssl_info();
10385 }
10386
10387 void DoConnection(const SpawnedTestServer::SSLOptions& ssl_options,
10388 CertStatus* out_cert_status) {
10389 // Always overwrite |out_cert_status|.
10390 *out_cert_status = 0;
10391
10392 TestDelegate d;
10393 SSLInfo ssl_info;
10394 ASSERT_NO_FATAL_FAILURE(
10395 DoConnectionWithDelegate(ssl_options, &d, &ssl_info));
10396
10397 *out_cert_status = ssl_info.cert_status;
[email protected]dffe8242012-03-20 15:14:2710398 }
10399
dcheng67be2b1f2014-10-27 21:47:2910400 ~HTTPSOCSPTest() override {
Eric Romanefddd0a2017-10-10 02:14:2510401#if defined(USE_BUILTIN_CERT_VERIFIER)
10402 ShutdownGlobalCertNetFetcher();
10403#endif
10404
svaldez2135be52016-04-20 16:34:5310405#if defined(USE_NSS_CERTS)
[email protected]dffe8242012-03-20 15:14:2710406 ShutdownNSSHttpIO();
10407#endif
10408 }
10409
[email protected]a13234c2012-03-20 21:45:0210410 protected:
rsleevid6de8302016-06-21 01:33:2010411 class AllowAnyCertCTPolicyEnforcer : public CTPolicyEnforcer {
10412 public:
10413 AllowAnyCertCTPolicyEnforcer() = default;
10414 ~AllowAnyCertCTPolicyEnforcer() override = default;
10415
10416 ct::CertPolicyCompliance DoesConformToCertPolicy(
10417 X509Certificate* cert,
10418 const SCTList& verified_scts,
tfarina42834112016-09-22 13:38:2010419 const NetLogWithSource& net_log) override {
rsleevid6de8302016-06-21 01:33:2010420 return ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS;
10421 }
rsleevid6de8302016-06-21 01:33:2010422 };
[email protected]a13234c2012-03-20 21:45:0210423 // SetupContext configures the URLRequestContext that will be used for making
10424 // connetions to testserver. This can be overridden in test subclasses for
10425 // different behaviour.
rsleevid6de8302016-06-21 01:33:2010426 virtual void SetupContext() {
10427 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1410428 true /* check for EV */, true /* online revocation checking */,
10429 false /* require rev. checking for local
10430 anchors */,
10431 false /* token binding enabled */));
[email protected]a13234c2012-03-20 21:45:0210432 }
10433
danakj8522a25b2016-04-16 00:17:3610434 std::unique_ptr<ScopedTestRoot> test_root_;
[email protected]ef2bf422012-05-11 03:27:0910435 TestURLRequestContext context_;
danakj8522a25b2016-04-16 00:17:3610436 std::unique_ptr<ScopedTestEVPolicy> ev_test_policy_;
[email protected]dffe8242012-03-20 15:14:2710437};
10438
[email protected]a13234c2012-03-20 21:45:0210439static CertStatus ExpectedCertStatusForFailedOnlineRevocationCheck() {
mattmaf868e72016-09-23 23:25:2010440#if defined(OS_WIN) || defined(OS_MACOSX)
[email protected]a13234c2012-03-20 21:45:0210441 // Windows can return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION but we don't
10442 // have that ability on other platforms.
Eric Roman1b628daa2017-10-19 19:52:0410443 // TODO(eroman): Should this also be the return value for
10444 // CertVerifyProcBuiltin?
[email protected]a13234c2012-03-20 21:45:0210445 return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION;
10446#else
10447 return 0;
10448#endif
10449}
10450
[email protected]3a86a712013-07-30 07:16:2010451// SystemSupportsHardFailRevocationChecking returns true iff the current
10452// operating system supports revocation checking and can distinguish between
10453// situations where a given certificate lacks any revocation information (eg:
10454// no CRLDistributionPoints and no OCSP Responder AuthorityInfoAccess) and when
10455// revocation information cannot be obtained (eg: the CRL was unreachable).
10456// If it does not, then tests which rely on 'hard fail' behaviour should be
10457// skipped.
10458static bool SystemSupportsHardFailRevocationChecking() {
Eric Roman1b628daa2017-10-19 19:52:0410459#if defined(OS_WIN) || defined(USE_NSS_CERTS) || \
10460 defined(USE_BUILTIN_CERT_VERIFIER)
[email protected]3a86a712013-07-30 07:16:2010461 return true;
10462#else
10463 return false;
10464#endif
10465}
10466
[email protected]a13234c2012-03-20 21:45:0210467// SystemUsesChromiumEVMetadata returns true iff the current operating system
10468// uses Chromium's EV metadata (i.e. EVRootCAMetadata). If it does not, then
10469// several tests are effected because our testing EV certificate won't be
10470// recognised as EV.
10471static bool SystemUsesChromiumEVMetadata() {
Eric Roman5f8d9d22017-10-17 02:32:5210472#if defined(PLATFORM_USES_CHROMIUM_EV_METADATA)
[email protected]05454a432012-03-20 20:04:0110473 return true;
Eric Roman5f8d9d22017-10-17 02:32:5210474#else
10475 return false;
[email protected]05454a432012-03-20 20:04:0110476#endif
10477}
10478
mattmaf868e72016-09-23 23:25:2010479// Returns the expected CertStatus for tests that expect an online revocation
10480// check failure as a result of checking a test EV cert, which will not
10481// actually trigger an online revocation check on some platforms.
10482static CertStatus ExpectedCertStatusForFailedOnlineEVRevocationCheck() {
10483 if (SystemUsesChromiumEVMetadata()) {
10484 return ExpectedCertStatusForFailedOnlineRevocationCheck();
10485 } else {
10486 // If SystemUsesChromiumEVMetadata is false, revocation checking will not
10487 // be enabled, and thus there will not be a revocation check to fail.
10488 return 0u;
10489 }
10490}
10491
[email protected]b6f2de32012-08-17 04:35:0810492static bool SystemSupportsOCSP() {
Sergey Ulanov033501e52017-10-19 22:29:2110493#if defined(OS_ANDROID) || defined(OS_FUCHSIA)
[email protected]a13234c2012-03-20 21:45:0210494 // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported.
Sergey Ulanov033501e52017-10-19 22:29:2110495 // TODO(crbug.com/776575): OCSP tests currently fail on Fuchsia.
[email protected]a13234c2012-03-20 21:45:0210496 return false;
10497#else
10498 return true;
10499#endif
10500}
10501
davidbend1fb2f12014-11-08 02:51:0010502static bool SystemSupportsOCSPStapling() {
Eric Roman1b628daa2017-10-19 19:52:0410503#if defined(USE_NSS_CERTS) || defined(OS_WIN) || \
10504 defined(USE_BUILTIN_CERT_VERIFIER)
mathpc992e602015-10-21 20:34:0310505 return true;
mathpc992e602015-10-21 20:34:0310506#else
10507 return false;
10508#endif
davidbend1fb2f12014-11-08 02:51:0010509}
10510
[email protected]dffe8242012-03-20 15:14:2710511TEST_F(HTTPSOCSPTest, Valid) {
10512 if (!SystemSupportsOCSP()) {
10513 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
10514 return;
10515 }
10516
[email protected]ce7d0cbc2013-05-03 18:57:2210517 SpawnedTestServer::SSLOptions ssl_options(
10518 SpawnedTestServer::SSLOptions::CERT_AUTO);
10519 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
[email protected]dffe8242012-03-20 15:14:2710520
[email protected]924e9f92012-12-16 22:00:5310521 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1210522 DoConnection(ssl_options, &cert_status);
[email protected]dffe8242012-03-20 15:14:2710523
10524 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
10525
[email protected]a13234c2012-03-20 21:45:0210526 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
10527 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
[email protected]dffe8242012-03-20 15:14:2710528
10529 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10530}
10531
10532TEST_F(HTTPSOCSPTest, Revoked) {
10533 if (!SystemSupportsOCSP()) {
10534 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
10535 return;
10536 }
10537
[email protected]ce7d0cbc2013-05-03 18:57:2210538 SpawnedTestServer::SSLOptions ssl_options(
10539 SpawnedTestServer::SSLOptions::CERT_AUTO);
10540 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
[email protected]dffe8242012-03-20 15:14:2710541
10542 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1210543 DoConnection(ssl_options, &cert_status);
[email protected]dffe8242012-03-20 15:14:2710544
[email protected]dffe8242012-03-20 15:14:2710545 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
[email protected]dffe8242012-03-20 15:14:2710546 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
10547 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10548}
10549
10550TEST_F(HTTPSOCSPTest, Invalid) {
10551 if (!SystemSupportsOCSP()) {
10552 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
10553 return;
10554 }
10555
[email protected]ce7d0cbc2013-05-03 18:57:2210556 SpawnedTestServer::SSLOptions ssl_options(
10557 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5810558 ssl_options.ocsp_status =
10559 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
[email protected]dffe8242012-03-20 15:14:2710560
[email protected]924e9f92012-12-16 22:00:5310561 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1210562 DoConnection(ssl_options, &cert_status);
[email protected]dffe8242012-03-20 15:14:2710563
Eric Roman1b628daa2017-10-19 19:52:0410564#if defined(USE_BUILTIN_CERT_VERIFIER)
10565 // TODO(649017): This test uses soft-fail revocation checking, but returns an
10566 // invalid OCSP response (can't parse). CertVerifyProcBuiltin currently
10567 // doesn't consider this a candidate for soft-fail (only considers
10568 // network-level failures as skippable).
10569 EXPECT_EQ(CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
10570 cert_status & CERT_STATUS_UNABLE_TO_CHECK_REVOCATION);
10571#else
[email protected]a13234c2012-03-20 21:45:0210572 EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
[email protected]dffe8242012-03-20 15:14:2710573 cert_status & CERT_STATUS_ALL_ERRORS);
Eric Roman1b628daa2017-10-19 19:52:0410574#endif
[email protected]dffe8242012-03-20 15:14:2710575
10576 // Without a positive OCSP response, we shouldn't show the EV status.
10577 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
10578 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10579}
[email protected]a13234c2012-03-20 21:45:0210580
davidbend1fb2f12014-11-08 02:51:0010581TEST_F(HTTPSOCSPTest, ValidStapled) {
mathpc992e602015-10-21 20:34:0310582 if (!SystemSupportsOCSPStapling()) {
davidbend1fb2f12014-11-08 02:51:0010583 LOG(WARNING)
10584 << "Skipping test because system doesn't support OCSP stapling";
10585 return;
10586 }
10587
10588 SpawnedTestServer::SSLOptions ssl_options(
10589 SpawnedTestServer::SSLOptions::CERT_AUTO);
10590 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
10591 ssl_options.staple_ocsp_response = true;
10592 ssl_options.ocsp_server_unavailable = true;
10593
10594 CertStatus cert_status;
10595 DoConnection(ssl_options, &cert_status);
10596
10597 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
10598
10599 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
10600 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
10601
10602 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10603}
10604
davidben6c3191b2014-11-21 22:38:0410605// Disabled on NSS ports. See https://crbug.com/431716.
davidben71f35ff2015-04-17 20:54:4810606#if defined(USE_NSS_CERTS)
davidben6c3191b2014-11-21 22:38:0410607#define MAYBE_RevokedStapled DISABLED_RevokedStapled
10608#else
10609#define MAYBE_RevokedStapled RevokedStapled
10610#endif
10611TEST_F(HTTPSOCSPTest, MAYBE_RevokedStapled) {
mathpc992e602015-10-21 20:34:0310612 if (!SystemSupportsOCSPStapling()) {
davidbend1fb2f12014-11-08 02:51:0010613 LOG(WARNING)
10614 << "Skipping test because system doesn't support OCSP stapling";
10615 return;
10616 }
10617
10618 SpawnedTestServer::SSLOptions ssl_options(
10619 SpawnedTestServer::SSLOptions::CERT_AUTO);
10620 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
10621 ssl_options.staple_ocsp_response = true;
10622 ssl_options.ocsp_server_unavailable = true;
10623
10624 CertStatus cert_status;
10625 DoConnection(ssl_options, &cert_status);
10626
10627 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
10628 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
10629 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10630}
10631
dadriand476e652016-07-26 21:33:2410632TEST_F(HTTPSOCSPTest, ExpectStapleReportSentOnMissing) {
Martijn Croonenb1383da2017-10-11 11:56:3510633 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
10634
dadriand476e652016-07-26 21:33:2410635 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10636 https_test_server.SetSSLConfig(
10637 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10638 https_test_server.ServeFilesFromSourceDirectory(
10639 base::FilePath(kTestFilePath));
10640 ASSERT_TRUE(https_test_server.Start());
10641
10642 // Set up a MockCertVerifier to accept the certificate that the server sends,
10643 // but not provide any OCSP information.
10644 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10645 ASSERT_TRUE(cert);
10646 MockCertVerifier cert_verifier;
10647 CertVerifyResult verify_result;
10648 verify_result.verified_cert = cert;
10649 verify_result.is_issued_by_known_root = true;
10650 verify_result.ocsp_result.response_status = OCSPVerifyResult::MISSING;
10651 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
10652
10653 // Catch the Expect-Staple report.
10654 TransportSecurityState transport_security_state;
10655 MockCertificateReportSender mock_report_sender;
10656 transport_security_state.SetReportSender(&mock_report_sender);
10657
10658 // Use a MockHostResolver (which by default maps all hosts to 127.0.0.1) so
10659 // that the request can be sent to a site on the Expect-Staple preload list.
10660 MockHostResolver host_resolver;
10661 TestNetworkDelegate network_delegate;
10662 TestURLRequestContext context(true);
10663 context.set_host_resolver(&host_resolver);
10664 context.set_transport_security_state(&transport_security_state);
10665 context.set_network_delegate(&network_delegate);
10666 context.set_cert_verifier(&cert_verifier);
10667 context.Init();
10668
10669 // Now send a request to trigger the violation.
10670 TestDelegate d;
10671 GURL url = https_test_server.GetURL("/");
10672 GURL::Replacements replace_host;
10673 replace_host.SetHostStr(kExpectStapleStaticHostname);
10674 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610675 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
10676 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
dadriand476e652016-07-26 21:33:2410677 violating_request->Start();
10678 base::RunLoop().Run();
10679
10680 // Confirm a report was sent.
10681 EXPECT_FALSE(mock_report_sender.latest_report().empty());
10682 EXPECT_EQ(GURL(kExpectStapleReportURI),
10683 mock_report_sender.latest_report_uri());
10684}
10685
estark13e0b312016-12-22 23:52:3210686// Tests that Expect-Staple reports are not sent for connections on which there
10687// is a certificate error.
10688TEST_F(HTTPSOCSPTest, ExpectStapleReportNotSentOnMissingWithCertError) {
10689 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10690 https_test_server.SetSSLConfig(
10691 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10692 https_test_server.ServeFilesFromSourceDirectory(
10693 base::FilePath(kTestFilePath));
10694 ASSERT_TRUE(https_test_server.Start());
10695
10696 // Set up a MockCertVerifier to report an error for the certificate
10697 // and indicate that there was no stapled OCSP response.
10698 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10699 ASSERT_TRUE(cert);
10700 MockCertVerifier cert_verifier;
10701 CertVerifyResult verify_result;
10702 verify_result.cert_status = CERT_STATUS_DATE_INVALID;
10703 verify_result.verified_cert = cert;
10704 verify_result.is_issued_by_known_root = true;
10705 verify_result.ocsp_result.response_status = OCSPVerifyResult::MISSING;
10706 cert_verifier.AddResultForCert(cert.get(), verify_result,
10707 ERR_CERT_DATE_INVALID);
10708
10709 // Set up a mock report sender so that the test can check that an
10710 // Expect-Staple report is not sent.
10711 TransportSecurityState transport_security_state;
10712 MockCertificateReportSender mock_report_sender;
10713 transport_security_state.SetReportSender(&mock_report_sender);
10714
10715 TestNetworkDelegate network_delegate;
10716 TestURLRequestContext context(true);
10717
10718 // Force |kExpectStapleStaticHostname| to resolve to |https_test_server|.
10719 MockHostResolver host_resolver;
10720 context.set_host_resolver(&host_resolver);
10721
10722 context.set_transport_security_state(&transport_security_state);
10723 context.set_network_delegate(&network_delegate);
10724 context.set_cert_verifier(&cert_verifier);
10725 context.Init();
10726
10727 // Make a connection to |kExpectStapleStaticHostname|. Because the
10728 // |verify_result| used with the |cert_verifier| will indicate a certificate
10729 // error, an Expect-Staple report should not be sent.
10730 TestDelegate d;
10731 GURL url = https_test_server.GetURL("/");
10732 GURL::Replacements replace_host;
10733 replace_host.SetHostStr(kExpectStapleStaticHostname);
10734 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610735 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
10736 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark13e0b312016-12-22 23:52:3210737 violating_request->Start();
10738 base::RunLoop().Run();
10739
10740 // Confirm a report was not sent.
10741 EXPECT_TRUE(mock_report_sender.latest_report().empty());
10742 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
10743}
10744
dadriand476e652016-07-26 21:33:2410745TEST_F(HTTPSOCSPTest, ExpectStapleReportNotSentOnValid) {
10746 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10747 https_test_server.SetSSLConfig(
10748 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10749 https_test_server.ServeFilesFromSourceDirectory(
10750 base::FilePath(kTestFilePath));
10751 ASSERT_TRUE(https_test_server.Start());
10752
10753 // Set up a MockCertVerifier to accept the certificate that the server sends,
10754 // and provide GOOD revocation status.
10755 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10756 ASSERT_TRUE(cert);
10757 MockCertVerifier cert_verifier;
10758 CertVerifyResult verify_result;
10759 verify_result.verified_cert = cert;
10760 verify_result.is_issued_by_known_root = true;
10761 verify_result.ocsp_result.response_status = OCSPVerifyResult::PROVIDED;
10762 verify_result.ocsp_result.revocation_status = OCSPRevocationStatus::GOOD;
10763 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
10764
10765 // Catch the Expect-Staple report.
10766 TransportSecurityState transport_security_state;
10767 MockCertificateReportSender mock_report_sender;
10768 transport_security_state.SetReportSender(&mock_report_sender);
10769
10770 // Use a MockHostResolver (which by default maps all hosts to 127.0.0.1) so
10771 // that the request can be sent to a site on the Expect-Staple preload list.
10772 MockHostResolver host_resolver;
10773 TestNetworkDelegate network_delegate;
10774 TestURLRequestContext context(true);
10775 context.set_host_resolver(&host_resolver);
10776 context.set_transport_security_state(&transport_security_state);
10777 context.set_network_delegate(&network_delegate);
10778 context.set_cert_verifier(&cert_verifier);
10779 context.Init();
10780
10781 // This request should not not trigger an Expect-Staple violation.
10782 TestDelegate d;
10783 GURL url = https_test_server.GetURL("/");
10784 GURL::Replacements replace_host;
10785 replace_host.SetHostStr(kExpectStapleStaticHostname);
10786 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610787 std::unique_ptr<URLRequest> ok_request(context.CreateRequest(
10788 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
dadriand476e652016-07-26 21:33:2410789 ok_request->Start();
10790 base::RunLoop().Run();
10791
10792 // Check that no report was sent.
10793 EXPECT_TRUE(mock_report_sender.latest_report().empty());
10794 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
10795}
10796
estark13e0b312016-12-22 23:52:3210797// Tests that an Expect-Staple report is not sent when OCSP details are not
10798// checked on the connection.
10799TEST_F(HTTPSOCSPTest, ExpectStapleReportNotSentOnNotChecked) {
10800 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10801 https_test_server.SetSSLConfig(
10802 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10803 https_test_server.ServeFilesFromSourceDirectory(
10804 base::FilePath(kTestFilePath));
10805 ASSERT_TRUE(https_test_server.Start());
10806
10807 // Set up a MockCertVerifier to accept the certificate that the server sends,
10808 // and set |ocsp_result| to indicate that OCSP stapling details were not
10809 // checked on the connection.
10810 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10811 ASSERT_TRUE(cert);
10812 MockCertVerifier cert_verifier;
10813 CertVerifyResult verify_result;
10814 verify_result.verified_cert = cert;
10815 verify_result.is_issued_by_known_root = true;
10816 verify_result.ocsp_result.response_status = OCSPVerifyResult::NOT_CHECKED;
10817 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
10818
10819 // Set up a mock report sender so that the test can check that an
10820 // Expect-Staple report is not sent.
10821 TransportSecurityState transport_security_state;
10822 MockCertificateReportSender mock_report_sender;
10823 transport_security_state.SetReportSender(&mock_report_sender);
10824
10825 TestNetworkDelegate network_delegate;
10826 TestURLRequestContext context(true);
10827
10828 // Force |kExpectStapleStaticHostname| to resolve to |https_test_server|.
10829 MockHostResolver host_resolver;
10830 context.set_host_resolver(&host_resolver);
10831
10832 context.set_transport_security_state(&transport_security_state);
10833 context.set_network_delegate(&network_delegate);
10834 context.set_cert_verifier(&cert_verifier);
10835 context.Init();
10836
10837 // Make a connection to |kExpectStapleStaticHostname|. Because the
10838 // |verify_result| used with the |cert_verifier| will indicate that OCSP
10839 // stapling details were not checked on the connection, an Expect-Staple
10840 // report should not be sent.
10841 TestDelegate d;
10842 GURL url = https_test_server.GetURL("/");
10843 GURL::Replacements replace_host;
10844 replace_host.SetHostStr(kExpectStapleStaticHostname);
10845 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610846 std::unique_ptr<URLRequest> ok_request(context.CreateRequest(
10847 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark13e0b312016-12-22 23:52:3210848 ok_request->Start();
10849 base::RunLoop().Run();
10850
10851 // Check that no report was sent.
10852 EXPECT_TRUE(mock_report_sender.latest_report().empty());
10853 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
10854}
10855
dadrian612337a2016-07-20 22:36:5810856static const struct OCSPVerifyTestData {
10857 std::vector<SpawnedTestServer::SSLOptions::OCSPSingleResponse> ocsp_responses;
10858 SpawnedTestServer::SSLOptions::OCSPProduced ocsp_produced;
10859 OCSPVerifyResult::ResponseStatus response_status;
10860 bool has_revocation_status;
10861 OCSPRevocationStatus cert_status;
10862} kOCSPVerifyData[] = {
Eric Roman8673b812017-09-20 18:57:3110863 // 0
dadrian612337a2016-07-20 22:36:5810864 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10865 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10866 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10867 OCSPVerifyResult::PROVIDED,
10868 true,
10869 OCSPRevocationStatus::GOOD},
10870
Eric Roman8673b812017-09-20 18:57:3110871 // 1
dadrian612337a2016-07-20 22:36:5810872 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10873 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD}},
10874 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10875 OCSPVerifyResult::INVALID_DATE,
10876 false,
10877 OCSPRevocationStatus::UNKNOWN},
10878
Eric Roman8673b812017-09-20 18:57:3110879 // 2
dadrian612337a2016-07-20 22:36:5810880 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10881 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
10882 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10883 OCSPVerifyResult::INVALID_DATE,
10884 false,
10885 OCSPRevocationStatus::UNKNOWN},
10886
Eric Roman8673b812017-09-20 18:57:3110887 // 3
dadrian612337a2016-07-20 22:36:5810888 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10889 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
10890 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10891 OCSPVerifyResult::INVALID_DATE,
10892 false,
10893 OCSPRevocationStatus::UNKNOWN},
10894
Eric Roman8673b812017-09-20 18:57:3110895 // 4
dadrian612337a2016-07-20 22:36:5810896 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10897 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
10898 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10899 OCSPVerifyResult::INVALID_DATE,
10900 false,
10901 OCSPRevocationStatus::UNKNOWN},
10902
Eric Roman8673b812017-09-20 18:57:3110903 // 5
dadrian612337a2016-07-20 22:36:5810904 {{{SpawnedTestServer::SSLOptions::OCSP_TRY_LATER,
10905 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10906 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10907 OCSPVerifyResult::ERROR_RESPONSE,
10908 false,
10909 OCSPRevocationStatus::UNKNOWN},
10910
Eric Roman8673b812017-09-20 18:57:3110911 // 6
dadrian612337a2016-07-20 22:36:5810912 {{{SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE,
10913 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10914 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10915 OCSPVerifyResult::PARSE_RESPONSE_ERROR,
10916 false,
10917 OCSPRevocationStatus::UNKNOWN},
10918
Eric Roman8673b812017-09-20 18:57:3110919 // 7
dadrian612337a2016-07-20 22:36:5810920 {{{SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE_DATA,
10921 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10922 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10923 OCSPVerifyResult::PARSE_RESPONSE_DATA_ERROR,
10924 false,
10925 OCSPRevocationStatus::UNKNOWN},
10926
Eric Roman8673b812017-09-20 18:57:3110927 // 8
dadrian612337a2016-07-20 22:36:5810928 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
10929 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
10930 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10931 OCSPVerifyResult::INVALID_DATE,
10932 false,
10933 OCSPRevocationStatus::UNKNOWN},
10934
Eric Roman8673b812017-09-20 18:57:3110935 // 9
dadrian612337a2016-07-20 22:36:5810936 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
10937 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10938 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10939 OCSPVerifyResult::PROVIDED,
10940 true,
10941 OCSPRevocationStatus::UNKNOWN},
10942
Eric Roman8673b812017-09-20 18:57:3110943 // 10
dadrian612337a2016-07-20 22:36:5810944 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
10945 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD}},
10946 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10947 OCSPVerifyResult::INVALID_DATE,
10948 false,
10949 OCSPRevocationStatus::UNKNOWN},
10950
Eric Roman8673b812017-09-20 18:57:3110951 // 11
dadrian612337a2016-07-20 22:36:5810952 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
10953 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
10954 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10955 OCSPVerifyResult::INVALID_DATE,
10956 false,
10957 OCSPRevocationStatus::UNKNOWN},
10958
Eric Roman8673b812017-09-20 18:57:3110959 // 12
dadrian612337a2016-07-20 22:36:5810960 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10961 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10962 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_BEFORE_CERT,
10963 OCSPVerifyResult::BAD_PRODUCED_AT,
10964 false,
10965 OCSPRevocationStatus::UNKNOWN},
10966
Eric Roman8673b812017-09-20 18:57:3110967 // 13
dadrian612337a2016-07-20 22:36:5810968 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10969 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10970 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_AFTER_CERT,
10971 OCSPVerifyResult::BAD_PRODUCED_AT,
10972 false,
10973 OCSPRevocationStatus::UNKNOWN},
10974
Eric Roman8673b812017-09-20 18:57:3110975 // 14
dadrian612337a2016-07-20 22:36:5810976 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10977 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10978 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_AFTER_CERT,
10979 OCSPVerifyResult::BAD_PRODUCED_AT,
10980 false,
10981 OCSPRevocationStatus::UNKNOWN},
10982
Eric Roman8673b812017-09-20 18:57:3110983 // 15
dadrian612337a2016-07-20 22:36:5810984 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10985 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10986 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10987 OCSPVerifyResult::PROVIDED,
10988 true,
10989 OCSPRevocationStatus::GOOD},
10990
Eric Roman8673b812017-09-20 18:57:3110991 // 16
dadrian612337a2016-07-20 22:36:5810992 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10993 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD},
10994 {SpawnedTestServer::SSLOptions::OCSP_OK,
10995 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10996 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10997 OCSPVerifyResult::PROVIDED,
10998 true,
10999 OCSPRevocationStatus::GOOD},
11000
Eric Roman8673b812017-09-20 18:57:3111001 // 17
dadrian612337a2016-07-20 22:36:5811002 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11003 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY},
11004 {SpawnedTestServer::SSLOptions::OCSP_OK,
11005 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11006 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11007 OCSPVerifyResult::PROVIDED,
11008 true,
11009 OCSPRevocationStatus::GOOD},
11010
Eric Roman8673b812017-09-20 18:57:3111011 // 18
dadrian612337a2016-07-20 22:36:5811012 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11013 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG},
11014 {SpawnedTestServer::SSLOptions::OCSP_OK,
11015 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11016 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11017 OCSPVerifyResult::PROVIDED,
11018 true,
11019 OCSPRevocationStatus::GOOD},
11020
Eric Roman8673b812017-09-20 18:57:3111021 // 19
dadrian612337a2016-07-20 22:36:5811022 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11023 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY},
11024 {SpawnedTestServer::SSLOptions::OCSP_OK,
11025 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD},
11026 {SpawnedTestServer::SSLOptions::OCSP_OK,
11027 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
11028 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11029 OCSPVerifyResult::INVALID_DATE,
11030 false,
11031 OCSPRevocationStatus::UNKNOWN},
11032
Eric Roman8673b812017-09-20 18:57:3111033 // 20
dadrian612337a2016-07-20 22:36:5811034 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11035 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11036 {SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11037 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11038 {SpawnedTestServer::SSLOptions::OCSP_OK,
11039 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11040 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11041 OCSPVerifyResult::PROVIDED,
11042 true,
11043 OCSPRevocationStatus::REVOKED},
11044
Eric Roman8673b812017-09-20 18:57:3111045 // 21
dadrian612337a2016-07-20 22:36:5811046 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11047 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11048 {SpawnedTestServer::SSLOptions::OCSP_OK,
11049 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11050 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11051 OCSPVerifyResult::PROVIDED,
11052 true,
11053 OCSPRevocationStatus::UNKNOWN},
11054
Eric Roman8673b812017-09-20 18:57:3111055 // 22
dadrian612337a2016-07-20 22:36:5811056 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11057 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11058 {SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11059 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG},
11060 {SpawnedTestServer::SSLOptions::OCSP_OK,
11061 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11062 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11063 OCSPVerifyResult::PROVIDED,
11064 true,
11065 OCSPRevocationStatus::UNKNOWN},
11066
Eric Roman8673b812017-09-20 18:57:3111067 // 23
dadrian612337a2016-07-20 22:36:5811068 {{{SpawnedTestServer::SSLOptions::OCSP_MISMATCHED_SERIAL,
11069 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11070 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11071 OCSPVerifyResult::NO_MATCHING_RESPONSE,
11072 false,
11073 OCSPRevocationStatus::UNKNOWN},
11074
Eric Roman8673b812017-09-20 18:57:3111075 // 24
dadrian612337a2016-07-20 22:36:5811076 {{{SpawnedTestServer::SSLOptions::OCSP_MISMATCHED_SERIAL,
11077 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
11078 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11079 OCSPVerifyResult::NO_MATCHING_RESPONSE,
11080 false,
11081 OCSPRevocationStatus::UNKNOWN},
11082
Eric Roman8673b812017-09-20 18:57:3111083// These tests fail when using NSS for certificate verification, as NSS fails
11084// and doesn't return the partial path. As a result the OCSP checks being done
11085// at the CertVerifyProc layer cannot access the issuer certificate.
11086#if !defined(USE_NSS_CERTS)
11087 // 25
11088 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11089 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11090 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11091 OCSPVerifyResult::PROVIDED,
11092 true,
11093 OCSPRevocationStatus::REVOKED},
11094
11095 // 26
11096 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11097 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD}},
11098 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11099 OCSPVerifyResult::INVALID_DATE,
11100 false,
11101 OCSPRevocationStatus::UNKNOWN},
11102
11103 // 27
11104 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11105 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
11106 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11107 OCSPVerifyResult::INVALID_DATE,
11108 false,
11109 OCSPRevocationStatus::UNKNOWN},
11110#endif
dadrian612337a2016-07-20 22:36:5811111};
11112
11113class HTTPSOCSPVerifyTest
11114 : public HTTPSOCSPTest,
11115 public testing::WithParamInterface<OCSPVerifyTestData> {};
11116
11117TEST_P(HTTPSOCSPVerifyTest, VerifyResult) {
11118 SpawnedTestServer::SSLOptions ssl_options(
11119 SpawnedTestServer::SSLOptions::CERT_AUTO);
11120 OCSPVerifyTestData test = GetParam();
11121
11122 ssl_options.ocsp_responses = test.ocsp_responses;
11123 ssl_options.ocsp_produced = test.ocsp_produced;
11124 ssl_options.staple_ocsp_response = true;
11125
11126 SSLInfo ssl_info;
11127 OCSPErrorTestDelegate delegate;
11128 ASSERT_NO_FATAL_FAILURE(
11129 DoConnectionWithDelegate(ssl_options, &delegate, &ssl_info));
11130
11131 // The SSLInfo must be extracted from |delegate| on error, due to how
11132 // URLRequest caches certificate errors.
11133 if (delegate.have_certificate_errors()) {
11134 ASSERT_TRUE(delegate.on_ssl_certificate_error_called());
11135 ssl_info = delegate.ssl_info();
11136 }
11137
11138 EXPECT_EQ(test.response_status, ssl_info.ocsp_result.response_status);
11139
11140 if (test.has_revocation_status)
11141 EXPECT_EQ(test.cert_status, ssl_info.ocsp_result.revocation_status);
11142}
11143
11144INSTANTIATE_TEST_CASE_P(OCSPVerify,
11145 HTTPSOCSPVerifyTest,
11146 testing::ValuesIn(kOCSPVerifyData));
11147
mattm0b12a6f2016-11-29 19:57:1611148static bool SystemSupportsAIA() {
Eric Romanefddd0a2017-10-10 02:14:2511149#if defined(OS_ANDROID) || defined(USE_BUILTIN_CERT_VERIFIER)
Sergey Ulanov884169a02017-09-06 18:58:0211150 // TODO(crbug.com/762380): Enable on Fuchsia once it's implemented.
mattm0b12a6f2016-11-29 19:57:1611151 return false;
11152#else
11153 return true;
11154#endif
11155}
11156
11157class HTTPSAIATest : public HTTPSOCSPTest {
11158 public:
11159 void SetupContext() override {
11160 context_.set_ssl_config_service(new TestSSLConfigService(
11161 false /* check for EV */, false /* online revocation checking */,
11162 false /* require rev. checking for local anchors */,
11163 false /* token binding enabled */));
11164 }
11165};
11166
11167TEST_F(HTTPSAIATest, AIAFetching) {
11168 SpawnedTestServer::SSLOptions ssl_options(
11169 SpawnedTestServer::SSLOptions::CERT_AUTO_AIA_INTERMEDIATE);
11170 SpawnedTestServer test_server(
11171 SpawnedTestServer::TYPE_HTTPS, ssl_options,
11172 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
11173 ASSERT_TRUE(test_server.Start());
11174
11175 TestDelegate d;
11176 d.set_allow_certificate_errors(true);
11177 std::unique_ptr<URLRequest> r(context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611178 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
11179 TRAFFIC_ANNOTATION_FOR_TESTS));
mattm0b12a6f2016-11-29 19:57:1611180
11181 r->Start();
11182 EXPECT_TRUE(r->is_pending());
11183
11184 base::RunLoop().Run();
11185
11186 EXPECT_EQ(1, d.response_started_count());
11187
11188 CertStatus cert_status = r->ssl_info().cert_status;
11189 if (SystemSupportsAIA()) {
11190 EXPECT_EQ(OK, d.request_status());
11191 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11192 ASSERT_TRUE(r->ssl_info().cert);
11193 EXPECT_EQ(2u, r->ssl_info().cert->GetIntermediateCertificates().size());
11194 } else {
11195 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID,
11196 cert_status & CERT_STATUS_ALL_ERRORS);
11197 }
11198 ASSERT_TRUE(r->ssl_info().unverified_cert);
11199 EXPECT_EQ(
11200 0u, r->ssl_info().unverified_cert->GetIntermediateCertificates().size());
11201}
11202
[email protected]3a86a712013-07-30 07:16:2011203class HTTPSHardFailTest : public HTTPSOCSPTest {
11204 protected:
rsleevid6de8302016-06-21 01:33:2011205 void SetupContext() override {
11206 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1411207 false /* check for EV */, false /* online revocation checking */,
11208 true /* require rev. checking for local
11209 anchors */,
11210 false /* token binding enabled */));
[email protected]3a86a712013-07-30 07:16:2011211 }
11212};
11213
[email protected]3a86a712013-07-30 07:16:2011214TEST_F(HTTPSHardFailTest, FailsOnOCSPInvalid) {
11215 if (!SystemSupportsOCSP()) {
11216 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11217 return;
11218 }
11219
11220 if (!SystemSupportsHardFailRevocationChecking()) {
11221 LOG(WARNING) << "Skipping test because system doesn't support hard fail "
11222 << "revocation checking";
11223 return;
11224 }
11225
11226 SpawnedTestServer::SSLOptions ssl_options(
11227 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811228 ssl_options.ocsp_status =
11229 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
[email protected]3a86a712013-07-30 07:16:2011230
11231 CertStatus cert_status;
11232 DoConnection(ssl_options, &cert_status);
11233
Eric Roman1b628daa2017-10-19 19:52:0411234#if defined(USE_BUILTIN_CERT_VERIFIER)
11235 // TODO(crbug.com/649017): Should we consider invalid response as
11236 // affirmatively revoked?
11237 EXPECT_EQ(CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
11238 cert_status & CERT_STATUS_UNABLE_TO_CHECK_REVOCATION);
11239#else
11240 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_REVOKED);
11241#endif
[email protected]3a86a712013-07-30 07:16:2011242
11243 // Without a positive OCSP response, we shouldn't show the EV status.
Eric Roman1b628daa2017-10-19 19:52:0411244 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]3a86a712013-07-30 07:16:2011245 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
11246}
11247
[email protected]a13234c2012-03-20 21:45:0211248class HTTPSEVCRLSetTest : public HTTPSOCSPTest {
11249 protected:
rsleevid6de8302016-06-21 01:33:2011250 void SetupContext() override {
11251 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1411252 true /* check for EV */, false /* online revocation checking */,
11253 false /* require rev. checking for local
11254 anchors */,
11255 false /* token binding enabled */));
[email protected]a13234c2012-03-20 21:45:0211256 }
11257};
11258
Eric Romane2243cc62017-10-17 03:59:1311259// Helper class to set the global CRLSet, and on destruction restore the
11260// previously set one.
11261class ScopedSetCRLSet {
11262 public:
11263 ScopedSetCRLSet(scoped_refptr<CRLSet> crl_set) {
11264 prev_crl_set_ = SSLConfigService::GetCRLSet();
11265 SSLConfigService::SetCRLSetForTesting(std::move(crl_set));
11266 }
11267
11268 ~ScopedSetCRLSet() {
11269 SSLConfigService::SetCRLSetForTesting(std::move(prev_crl_set_));
11270 }
11271
11272 private:
11273 scoped_refptr<CRLSet> prev_crl_set_;
11274};
11275
[email protected]a13234c2012-03-20 21:45:0211276TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) {
11277 if (!SystemSupportsOCSP()) {
11278 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11279 return;
11280 }
11281
[email protected]ce7d0cbc2013-05-03 18:57:2211282 SpawnedTestServer::SSLOptions ssl_options(
11283 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811284 ssl_options.ocsp_status =
11285 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311286 ScopedSetCRLSet set_crlset(nullptr);
[email protected]a13234c2012-03-20 21:45:0211287
[email protected]924e9f92012-12-16 22:00:5311288 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211289 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211290
mattmaf868e72016-09-23 23:25:2011291 EXPECT_EQ(ExpectedCertStatusForFailedOnlineEVRevocationCheck(),
[email protected]a13234c2012-03-20 21:45:0211292 cert_status & CERT_STATUS_ALL_ERRORS);
11293
11294 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]b6f2de32012-08-17 04:35:0811295 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11296 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211297}
11298
[email protected]be0fff62013-08-29 23:37:4811299TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndRevokedOCSP) {
11300 if (!SystemSupportsOCSP()) {
11301 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11302 return;
11303 }
11304
11305 SpawnedTestServer::SSLOptions ssl_options(
11306 SpawnedTestServer::SSLOptions::CERT_AUTO);
11307 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
Eric Romane2243cc62017-10-17 03:59:1311308 ScopedSetCRLSet set_crlset(nullptr);
[email protected]be0fff62013-08-29 23:37:4811309
11310 CertStatus cert_status;
11311 DoConnection(ssl_options, &cert_status);
11312
mattm1a282f52016-11-10 21:49:4211313// Currently only works for Windows and OS X. When using NSS, it's not
11314// possible to determine whether the check failed because of actual
11315// revocation or because there was an OCSP failure.
11316#if defined(OS_WIN) || defined(OS_MACOSX)
[email protected]be0fff62013-08-29 23:37:4811317 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
11318#else
11319 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11320#endif
11321
11322 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11323 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11324 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
11325}
11326
[email protected]a13234c2012-03-20 21:45:0211327TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) {
11328 if (!SystemSupportsOCSP()) {
11329 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11330 return;
11331 }
11332
[email protected]ce7d0cbc2013-05-03 18:57:2211333 SpawnedTestServer::SSLOptions ssl_options(
11334 SpawnedTestServer::SSLOptions::CERT_AUTO);
11335 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
Eric Romane2243cc62017-10-17 03:59:1311336 ScopedSetCRLSet set_crlset(nullptr);
[email protected]a13234c2012-03-20 21:45:0211337
11338 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211339 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211340
11341 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11342
11343 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11344 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
[email protected]b6f2de32012-08-17 04:35:0811345 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11346 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211347}
11348
11349TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) {
11350 if (!SystemSupportsOCSP()) {
11351 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11352 return;
11353 }
11354
[email protected]ce7d0cbc2013-05-03 18:57:2211355 SpawnedTestServer::SSLOptions ssl_options(
11356 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811357 ssl_options.ocsp_status =
11358 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311359 ScopedSetCRLSet set_crlset(CRLSet::ExpiredCRLSetForTesting());
[email protected]a13234c2012-03-20 21:45:0211360
11361 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211362 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211363
mattmaf868e72016-09-23 23:25:2011364 EXPECT_EQ(ExpectedCertStatusForFailedOnlineEVRevocationCheck(),
[email protected]a13234c2012-03-20 21:45:0211365 cert_status & CERT_STATUS_ALL_ERRORS);
11366
11367 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]b6f2de32012-08-17 04:35:0811368 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11369 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211370}
11371
[email protected]51523f52013-07-31 21:57:2811372TEST_F(HTTPSEVCRLSetTest, FreshCRLSetCovered) {
11373 if (!SystemSupportsOCSP()) {
11374 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11375 return;
11376 }
11377
11378 SpawnedTestServer::SSLOptions ssl_options(
11379 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811380 ssl_options.ocsp_status =
11381 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311382 ScopedSetCRLSet set_crlset(CRLSet::ForTesting(false, &kOCSPTestCertSPKI, ""));
[email protected]51523f52013-07-31 21:57:2811383
11384 CertStatus cert_status;
11385 DoConnection(ssl_options, &cert_status);
11386
11387 // With a fresh CRLSet that covers the issuing certificate, we shouldn't do a
11388 // revocation check for EV.
11389 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11390 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11391 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
11392 EXPECT_FALSE(
11393 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
11394}
11395
11396TEST_F(HTTPSEVCRLSetTest, FreshCRLSetNotCovered) {
11397 if (!SystemSupportsOCSP()) {
11398 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11399 return;
11400 }
11401
[email protected]ce7d0cbc2013-05-03 18:57:2211402 SpawnedTestServer::SSLOptions ssl_options(
11403 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811404 ssl_options.ocsp_status =
11405 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311406 ScopedSetCRLSet set_crlset(CRLSet::EmptyCRLSetForTesting());
[email protected]a13234c2012-03-20 21:45:0211407
[email protected]51523f52013-07-31 21:57:2811408 CertStatus cert_status = 0;
[email protected]295e5cd2012-08-23 01:05:1211409 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211410
[email protected]51523f52013-07-31 21:57:2811411 // Even with a fresh CRLSet, we should still do online revocation checks when
11412 // the certificate chain isn't covered by the CRLSet, which it isn't in this
11413 // test.
mattmaf868e72016-09-23 23:25:2011414 EXPECT_EQ(ExpectedCertStatusForFailedOnlineEVRevocationCheck(),
[email protected]51523f52013-07-31 21:57:2811415 cert_status & CERT_STATUS_ALL_ERRORS);
[email protected]a13234c2012-03-20 21:45:0211416
[email protected]51523f52013-07-31 21:57:2811417 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]a13234c2012-03-20 21:45:0211418 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
[email protected]51523f52013-07-31 21:57:2811419 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211420}
11421
[email protected]b6f2de32012-08-17 04:35:0811422TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSetAndRevokedNonEVCert) {
11423 // Test that when EV verification is requested, but online revocation
11424 // checking is disabled, and the leaf certificate is not in fact EV, that
11425 // no revocation checking actually happens.
11426 if (!SystemSupportsOCSP()) {
11427 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11428 return;
11429 }
11430
11431 // Unmark the certificate's OID as EV, which should disable revocation
11432 // checking (as per the user preference)
11433 ev_test_policy_.reset();
11434
[email protected]ce7d0cbc2013-05-03 18:57:2211435 SpawnedTestServer::SSLOptions ssl_options(
11436 SpawnedTestServer::SSLOptions::CERT_AUTO);
11437 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
Eric Romane2243cc62017-10-17 03:59:1311438 ScopedSetCRLSet set_crlset(CRLSet::ExpiredCRLSetForTesting());
[email protected]b6f2de32012-08-17 04:35:0811439
11440 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211441 DoConnection(ssl_options, &cert_status);
[email protected]b6f2de32012-08-17 04:35:0811442
11443 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11444
11445 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11446 EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
11447}
11448
[email protected]a13234c2012-03-20 21:45:0211449class HTTPSCRLSetTest : public HTTPSOCSPTest {
11450 protected:
rsleevid6de8302016-06-21 01:33:2011451 void SetupContext() override {
11452 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1411453 false /* check for EV */, false /* online revocation checking */,
11454 false /* require rev. checking for local
11455 anchors */,
11456 false /* token binding enabled */));
[email protected]a13234c2012-03-20 21:45:0211457 }
11458};
11459
11460TEST_F(HTTPSCRLSetTest, ExpiredCRLSet) {
[email protected]ce7d0cbc2013-05-03 18:57:2211461 SpawnedTestServer::SSLOptions ssl_options(
11462 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811463 ssl_options.ocsp_status =
11464 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311465 ScopedSetCRLSet set_crlset(CRLSet::ExpiredCRLSetForTesting());
[email protected]a13234c2012-03-20 21:45:0211466
[email protected]924e9f92012-12-16 22:00:5311467 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211468 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211469
11470 // If we're not trying EV verification then, even if the CRLSet has expired,
11471 // we don't fall back to online revocation checks.
11472 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11473 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11474 EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
11475}
[email protected]51523f52013-07-31 21:57:2811476
11477TEST_F(HTTPSCRLSetTest, CRLSetRevoked) {
Eric Romanefddd0a2017-10-10 02:14:2511478#if defined(OS_ANDROID)
[email protected]51523f52013-07-31 21:57:2811479 LOG(WARNING) << "Skipping test because system doesn't support CRLSets";
11480 return;
11481#endif
11482
11483 SpawnedTestServer::SSLOptions ssl_options(
11484 SpawnedTestServer::SSLOptions::CERT_AUTO);
11485 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
11486 ssl_options.cert_serial = 10;
Eric Romane2243cc62017-10-17 03:59:1311487 ScopedSetCRLSet set_crlset(
11488 CRLSet::ForTesting(false, &kOCSPTestCertSPKI, "\x0a"));
[email protected]51523f52013-07-31 21:57:2811489
11490 CertStatus cert_status = 0;
11491 DoConnection(ssl_options, &cert_status);
11492
11493 // If the certificate is recorded as revoked in the CRLSet, that should be
11494 // reflected without online revocation checking.
11495 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
11496 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11497 EXPECT_FALSE(
11498 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
11499}
[email protected]316c1e5e2012-09-12 15:17:4411500#endif // !defined(OS_IOS)
[email protected]dffe8242012-03-20 15:14:2711501
Sergey Ulanovc4580e72017-09-13 23:30:1111502#if !BUILDFLAG(DISABLE_FTP_SUPPORT) && !defined(OS_ANDROID) && \
11503 !defined(OS_FUCHSIA)
11504// FTP uses a second TCP connection with the port number allocated dynamically
11505// on the server side, so it would be hard to make RemoteTestServer proxy FTP
11506// connections reliably. FTP tests are disabled on platforms that use
11507// RemoteTestServer. See http://crbug.com/495220
[email protected]b89ca032009-08-31 21:41:3111508class URLRequestTestFTP : public URLRequestTest {
[email protected]95409e12010-08-17 20:07:1111509 public:
[email protected]d9fca99a2012-02-24 16:16:2011510 URLRequestTestFTP()
mmenkecd4c7532016-10-19 18:36:0511511 : ftp_test_server_(SpawnedTestServer::TYPE_FTP,
tommycli59a63432015-11-06 00:10:5511512 base::FilePath(kTestFilePath)) {
mmenke9f2ec60c2015-06-01 20:59:4711513 // Can't use |default_context_|'s HostResolver to set up the
11514 // FTPTransactionFactory because it hasn't been created yet.
11515 default_context_.set_host_resolver(&host_resolver_);
11516 }
11517
11518 // URLRequestTest interface:
11519 void SetUpFactory() override {
11520 // Add FTP support to the default URLRequestContext.
11521 job_factory_impl_->SetProtocolHandler(
mmenkecd4c7532016-10-19 18:36:0511522 "ftp", FtpProtocolHandler::Create(&host_resolver_));
mmenke9f2ec60c2015-06-01 20:59:4711523 }
11524
11525 std::string GetTestFileContents() {
11526 base::FilePath path;
11527 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &path));
11528 path = path.Append(kTestFilePath);
11529 path = path.AppendASCII(kFtpTestFile);
11530 std::string contents;
11531 EXPECT_TRUE(base::ReadFileToString(path, &contents));
11532 return contents;
[email protected]95409e12010-08-17 20:07:1111533 }
11534
[email protected]b89ca032009-08-31 21:41:3111535 protected:
mmenkecd4c7532016-10-19 18:36:0511536 // Note that this is destroyed before the FtpProtocolHandler that references
11537 // it, which is owned by the parent class. Since no requests are made during
11538 // teardown, this works, though it's not great.
mmenke9f2ec60c2015-06-01 20:59:4711539 MockHostResolver host_resolver_;
mmenke9f2ec60c2015-06-01 20:59:4711540
tommycli59a63432015-11-06 00:10:5511541 SpawnedTestServer ftp_test_server_;
[email protected]b89ca032009-08-31 21:41:3111542};
11543
[email protected]d2a133182012-08-05 16:44:0811544// Make sure an FTP request using an unsafe ports fails.
[email protected]f2f31b32013-01-16 23:24:0911545TEST_F(URLRequestTestFTP, UnsafePort) {
[email protected]d2a133182012-08-05 16:44:0811546 GURL url("ftp://127.0.0.1:7");
[email protected]d2a133182012-08-05 16:44:0811547
11548 TestDelegate d;
11549 {
rhalavatib7bd7c792017-04-27 05:25:1611550 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
11551 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911552 r->Start();
11553 EXPECT_TRUE(r->is_pending());
[email protected]d2a133182012-08-05 16:44:0811554
[email protected]255620da2013-08-19 13:14:2911555 base::RunLoop().Run();
[email protected]d2a133182012-08-05 16:44:0811556
[email protected]f7022f32014-08-21 16:32:1911557 EXPECT_FALSE(r->is_pending());
maksim.sisovb53724b52016-09-16 05:30:5011558 EXPECT_EQ(ERR_UNSAFE_PORT, d.request_status());
[email protected]d2a133182012-08-05 16:44:0811559 }
11560}
11561
mmenke9f2ec60c2015-06-01 20:59:4711562TEST_F(URLRequestTestFTP, FTPDirectoryListing) {
tommycli59a63432015-11-06 00:10:5511563 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111564
[email protected]a25e90e2009-09-09 17:05:3711565 TestDelegate d;
11566 {
danakj8522a25b2016-04-16 00:17:3611567 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611568 ftp_test_server_.GetURL("/"), DEFAULT_PRIORITY, &d,
11569 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911570 r->Start();
11571 EXPECT_TRUE(r->is_pending());
[email protected]a25e90e2009-09-09 17:05:3711572
[email protected]255620da2013-08-19 13:14:2911573 base::RunLoop().Run();
[email protected]a25e90e2009-09-09 17:05:3711574
[email protected]f7022f32014-08-21 16:32:1911575 EXPECT_FALSE(r->is_pending());
[email protected]a25e90e2009-09-09 17:05:3711576 EXPECT_EQ(1, d.response_started_count());
11577 EXPECT_FALSE(d.received_data_before_response());
11578 EXPECT_LT(0, d.bytes_received());
tommycli59a63432015-11-06 00:10:5511579 EXPECT_EQ(ftp_test_server_.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:1911580 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:5511581 EXPECT_EQ(ftp_test_server_.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:1911582 r->GetSocketAddress().port());
[email protected]a25e90e2009-09-09 17:05:3711583 }
11584}
11585
mmenke9f2ec60c2015-06-01 20:59:4711586TEST_F(URLRequestTestFTP, FTPGetTestAnonymous) {
tommycli59a63432015-11-06 00:10:5511587 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111588
[email protected]dd265012009-01-08 20:45:2711589 TestDelegate d;
11590 {
danakj8522a25b2016-04-16 00:17:3611591 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611592 ftp_test_server_.GetURL(kFtpTestFile), DEFAULT_PRIORITY, &d,
11593 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911594 r->Start();
11595 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711596
[email protected]255620da2013-08-19 13:14:2911597 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711598
[email protected]f7022f32014-08-21 16:32:1911599 EXPECT_FALSE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711600 EXPECT_EQ(1, d.response_started_count());
11601 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711602 EXPECT_EQ(GetTestFileContents(), d.data_received());
tommycli59a63432015-11-06 00:10:5511603 EXPECT_EQ(ftp_test_server_.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:1911604 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:5511605 EXPECT_EQ(ftp_test_server_.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:1911606 r->GetSocketAddress().port());
[email protected]dd265012009-01-08 20:45:2711607 }
11608}
11609
mmenke9f2ec60c2015-06-01 20:59:4711610TEST_F(URLRequestTestFTP, FTPGetTest) {
tommycli59a63432015-11-06 00:10:5511611 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111612
[email protected]dd265012009-01-08 20:45:2711613 TestDelegate d;
11614 {
danakj8522a25b2016-04-16 00:17:3611615 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511616 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11617 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611618 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911619 r->Start();
11620 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711621
[email protected]255620da2013-08-19 13:14:2911622 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711623
[email protected]f7022f32014-08-21 16:32:1911624 EXPECT_FALSE(r->is_pending());
mmenke9f2ec60c2015-06-01 20:59:4711625 EXPECT_EQ(1, d.response_started_count());
11626 EXPECT_FALSE(d.received_data_before_response());
11627 EXPECT_EQ(GetTestFileContents(), d.data_received());
tommycli59a63432015-11-06 00:10:5511628 EXPECT_EQ(ftp_test_server_.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:1911629 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:5511630 EXPECT_EQ(ftp_test_server_.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:1911631 r->GetSocketAddress().port());
[email protected]58e32bb2013-01-21 18:23:2511632
11633 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:1911634 r->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:2511635 TestLoadTimingNoHttpResponse(load_timing_info);
[email protected]dd265012009-01-08 20:45:2711636 }
11637}
11638
mmenke9f2ec60c2015-06-01 20:59:4711639TEST_F(URLRequestTestFTP, FTPCheckWrongPassword) {
tommycli59a63432015-11-06 00:10:5511640 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111641
[email protected]dd265012009-01-08 20:45:2711642 TestDelegate d;
11643 {
danakj8522a25b2016-04-16 00:17:3611644 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511645 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11646 "wrong_password"),
rhalavatib7bd7c792017-04-27 05:25:1611647 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911648 r->Start();
11649 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711650
[email protected]255620da2013-08-19 13:14:2911651 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711652
[email protected]f7022f32014-08-21 16:32:1911653 EXPECT_FALSE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711654 EXPECT_EQ(1, d.response_started_count());
11655 EXPECT_FALSE(d.received_data_before_response());
11656 EXPECT_EQ(d.bytes_received(), 0);
11657 }
11658}
11659
mmenke9f2ec60c2015-06-01 20:59:4711660TEST_F(URLRequestTestFTP, FTPCheckWrongPasswordRestart) {
tommycli59a63432015-11-06 00:10:5511661 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111662
[email protected]8b8a197d2009-08-26 15:57:5811663 TestDelegate d;
11664 // Set correct login credentials. The delegate will be asked for them when
11665 // the initial login with wrong credentials will fail.
[email protected]f3cf9802011-10-28 18:44:5811666 d.set_credentials(AuthCredentials(kChrome, kChrome));
[email protected]8b8a197d2009-08-26 15:57:5811667 {
danakj8522a25b2016-04-16 00:17:3611668 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511669 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11670 "wrong_password"),
rhalavatib7bd7c792017-04-27 05:25:1611671 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911672 r->Start();
11673 EXPECT_TRUE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811674
[email protected]255620da2013-08-19 13:14:2911675 base::RunLoop().Run();
[email protected]8b8a197d2009-08-26 15:57:5811676
[email protected]f7022f32014-08-21 16:32:1911677 EXPECT_FALSE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811678 EXPECT_EQ(1, d.response_started_count());
11679 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711680 EXPECT_EQ(GetTestFileContents(), d.data_received());
[email protected]8b8a197d2009-08-26 15:57:5811681 }
11682}
11683
mmenke9f2ec60c2015-06-01 20:59:4711684TEST_F(URLRequestTestFTP, FTPCheckWrongUser) {
tommycli59a63432015-11-06 00:10:5511685 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111686
[email protected]dd265012009-01-08 20:45:2711687 TestDelegate d;
11688 {
danakj8522a25b2016-04-16 00:17:3611689 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511690 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "wrong_user",
11691 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611692 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911693 r->Start();
11694 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711695
[email protected]255620da2013-08-19 13:14:2911696 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711697
[email protected]f7022f32014-08-21 16:32:1911698 EXPECT_FALSE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711699 EXPECT_EQ(1, d.response_started_count());
11700 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711701 EXPECT_EQ(0, d.bytes_received());
[email protected]dd265012009-01-08 20:45:2711702 }
11703}
[email protected]8b8a197d2009-08-26 15:57:5811704
mmenke9f2ec60c2015-06-01 20:59:4711705TEST_F(URLRequestTestFTP, FTPCheckWrongUserRestart) {
tommycli59a63432015-11-06 00:10:5511706 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111707
[email protected]8b8a197d2009-08-26 15:57:5811708 TestDelegate d;
11709 // Set correct login credentials. The delegate will be asked for them when
11710 // the initial login with wrong credentials will fail.
[email protected]f3cf9802011-10-28 18:44:5811711 d.set_credentials(AuthCredentials(kChrome, kChrome));
[email protected]8b8a197d2009-08-26 15:57:5811712 {
danakj8522a25b2016-04-16 00:17:3611713 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511714 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "wrong_user",
11715 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611716 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911717 r->Start();
11718 EXPECT_TRUE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811719
[email protected]255620da2013-08-19 13:14:2911720 base::RunLoop().Run();
[email protected]8b8a197d2009-08-26 15:57:5811721
[email protected]f7022f32014-08-21 16:32:1911722 EXPECT_FALSE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811723 EXPECT_EQ(1, d.response_started_count());
11724 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711725 EXPECT_EQ(GetTestFileContents(), d.data_received());
[email protected]8b8a197d2009-08-26 15:57:5811726 }
11727}
[email protected]60a3df52009-09-22 16:13:2411728
mmenke9f2ec60c2015-06-01 20:59:4711729TEST_F(URLRequestTestFTP, FTPCacheURLCredentials) {
tommycli59a63432015-11-06 00:10:5511730 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111731
danakj8522a25b2016-04-16 00:17:3611732 std::unique_ptr<TestDelegate> d(new TestDelegate);
[email protected]60a3df52009-09-22 16:13:2411733 {
11734 // Pass correct login identity in the URL.
danakj8522a25b2016-04-16 00:17:3611735 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511736 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11737 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611738 DEFAULT_PRIORITY, d.get(), TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911739 r->Start();
11740 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411741
[email protected]255620da2013-08-19 13:14:2911742 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411743
[email protected]f7022f32014-08-21 16:32:1911744 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411745 EXPECT_EQ(1, d->response_started_count());
11746 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711747 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411748 }
11749
11750 d.reset(new TestDelegate);
11751 {
11752 // This request should use cached identity from previous request.
danakj8522a25b2016-04-16 00:17:3611753 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611754 ftp_test_server_.GetURL(kFtpTestFile), DEFAULT_PRIORITY, d.get(),
11755 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911756 r->Start();
11757 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411758
[email protected]255620da2013-08-19 13:14:2911759 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411760
[email protected]f7022f32014-08-21 16:32:1911761 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411762 EXPECT_EQ(1, d->response_started_count());
11763 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711764 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411765 }
11766}
11767
mmenke9f2ec60c2015-06-01 20:59:4711768TEST_F(URLRequestTestFTP, FTPCacheLoginBoxCredentials) {
tommycli59a63432015-11-06 00:10:5511769 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111770
danakj8522a25b2016-04-16 00:17:3611771 std::unique_ptr<TestDelegate> d(new TestDelegate);
[email protected]60a3df52009-09-22 16:13:2411772 // Set correct login credentials. The delegate will be asked for them when
11773 // the initial login with wrong credentials will fail.
[email protected]f3cf9802011-10-28 18:44:5811774 d->set_credentials(AuthCredentials(kChrome, kChrome));
[email protected]60a3df52009-09-22 16:13:2411775 {
danakj8522a25b2016-04-16 00:17:3611776 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511777 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11778 "wrong_password"),
rhalavatib7bd7c792017-04-27 05:25:1611779 DEFAULT_PRIORITY, d.get(), TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911780 r->Start();
11781 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411782
[email protected]255620da2013-08-19 13:14:2911783 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411784
[email protected]f7022f32014-08-21 16:32:1911785 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411786 EXPECT_EQ(1, d->response_started_count());
11787 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711788 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411789 }
11790
11791 // Use a new delegate without explicit credentials. The cached ones should be
11792 // used.
11793 d.reset(new TestDelegate);
11794 {
11795 // Don't pass wrong credentials in the URL, they would override valid cached
11796 // ones.
danakj8522a25b2016-04-16 00:17:3611797 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611798 ftp_test_server_.GetURL(kFtpTestFile), DEFAULT_PRIORITY, d.get(),
11799 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911800 r->Start();
11801 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411802
[email protected]255620da2013-08-19 13:14:2911803 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411804
[email protected]f7022f32014-08-21 16:32:1911805 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411806 EXPECT_EQ(1, d->response_started_count());
11807 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711808 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411809 }
11810}
ricea3a1c71f2016-06-17 10:05:2611811
11812TEST_F(URLRequestTestFTP, RawBodyBytes) {
11813 ASSERT_TRUE(ftp_test_server_.Start());
11814
11815 TestDelegate d;
11816 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611817 ftp_test_server_.GetURL("simple.html"), DEFAULT_PRIORITY, &d,
11818 TRAFFIC_ANNOTATION_FOR_TESTS));
ricea3a1c71f2016-06-17 10:05:2611819 req->Start();
11820 base::RunLoop().Run();
11821
11822 EXPECT_EQ(6, req->GetRawBodyBytes());
11823}
11824
brettwa1228ebb2016-10-28 03:51:3411825#endif // !BUILDFLAG(DISABLE_FTP_SUPPORT)
[email protected]7461a402011-03-24 23:19:5111826
ttuttlec0c828492015-05-15 01:25:5511827TEST_F(URLRequestTest, NetworkAccessedClearOnDataRequest) {
11828 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:1611829 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
11830 GURL("data:,"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:5511831
11832 EXPECT_FALSE(req->response_info().network_accessed);
11833
11834 req->Start();
11835 base::RunLoop().Run();
11836
11837 EXPECT_EQ(1, default_network_delegate_.completed_requests());
11838 EXPECT_FALSE(req->response_info().network_accessed);
11839}
11840
11841TEST_F(URLRequestTest, NetworkAccessedSetOnHostResolutionFailure) {
11842 MockHostResolver host_resolver;
11843 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
11844 TestURLRequestContext context(true);
11845 context.set_network_delegate(&network_delegate);
11846 context.set_host_resolver(&host_resolver);
11847 host_resolver.rules()->AddSimulatedFailure("*");
11848 context.Init();
11849
11850 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:1611851 std::unique_ptr<URLRequest> req(
11852 context.CreateRequest(GURL("http://test_intercept/foo"), DEFAULT_PRIORITY,
11853 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:5511854
11855 EXPECT_FALSE(req->response_info().network_accessed);
11856
11857 req->Start();
11858 base::RunLoop().Run();
11859 EXPECT_TRUE(req->response_info().network_accessed);
11860}
11861
mmenkeed0498b2015-12-08 23:20:4211862// Test that URLRequest is canceled correctly.
alexanderkcd904b52015-07-24 18:57:2211863// See http://crbug.com/508900
mmenkeed0498b2015-12-08 23:20:4211864TEST_F(URLRequestTest, URLRequestRedirectJobCancelRequest) {
alexanderkcd904b52015-07-24 18:57:2211865 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3611866 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611867 GURL("http://not-a-real-domain/"), DEFAULT_PRIORITY, &d,
11868 TRAFFIC_ANNOTATION_FOR_TESTS));
alexanderkcd904b52015-07-24 18:57:2211869
danakj8522a25b2016-04-16 00:17:3611870 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
alexanderkcd904b52015-07-24 18:57:2211871 req.get(), &default_network_delegate_,
11872 GURL("http://this-should-never-be-navigated-to/"),
mmenkeed0498b2015-12-08 23:20:4211873 URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT, "Jumbo shrimp"));
11874 AddTestInterceptor()->set_main_intercept_job(std::move(job));
alexanderkcd904b52015-07-24 18:57:2211875
11876 req->Start();
11877 req->Cancel();
alexanderkcd904b52015-07-24 18:57:2211878 base::RunLoop().RunUntilIdle();
maksim.sisovb53724b52016-09-16 05:30:5011879 EXPECT_EQ(ERR_ABORTED, d.request_status());
alexanderkcd904b52015-07-24 18:57:2211880 EXPECT_EQ(0, d.received_redirect_count());
11881}
11882
Andrey Kosyakov2e893e62017-08-31 17:00:5211883TEST_F(URLRequestTestHTTP, HeadersCallbacks) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0411884 ASSERT_TRUE(http_test_server()->Start());
11885 TestURLRequestContext context;
11886 GURL url(http_test_server()->GetURL("/cachetime"));
11887 TestDelegate delegate;
11888 HttpRequestHeaders extra_headers;
11889 extra_headers.SetHeader("X-Foo", "bar");
11890
11891 {
Andrey Kosyakov2e893e62017-08-31 17:00:5211892 HttpRawRequestHeaders raw_req_headers;
11893 scoped_refptr<const HttpResponseHeaders> raw_resp_headers;
11894
Andrey Kosyakov83a6eee2017-08-14 19:20:0411895 std::unique_ptr<URLRequest> r(context.CreateRequest(
11896 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
11897 r->SetExtraRequestHeaders(extra_headers);
Andrey Kosyakov2e893e62017-08-31 17:00:5211898 r->SetRequestHeadersCallback(base::Bind(
11899 &HttpRawRequestHeaders::Assign, base::Unretained(&raw_req_headers)));
11900 r->SetResponseHeadersCallback(base::Bind(
11901 [](scoped_refptr<const HttpResponseHeaders>* left,
11902 scoped_refptr<const HttpResponseHeaders> right) { *left = right; },
11903 base::Unretained(&raw_resp_headers)));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411904 r->Start();
11905 while (!delegate.response_started_count())
11906 base::RunLoop().RunUntilIdle();
Andrey Kosyakov2e893e62017-08-31 17:00:5211907 EXPECT_FALSE(raw_req_headers.headers().empty());
Andrey Kosyakov83a6eee2017-08-14 19:20:0411908 std::string value;
Andrey Kosyakov2e893e62017-08-31 17:00:5211909 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411910 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5211911 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Accept-Encoding", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411912 EXPECT_EQ("gzip, deflate", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5211913 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Connection", &value));
11914 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Host", &value));
11915 EXPECT_EQ("GET /cachetime HTTP/1.1\r\n", raw_req_headers.request_line());
11916 EXPECT_EQ(raw_resp_headers.get(), r->response_headers());
Andrey Kosyakov83a6eee2017-08-14 19:20:0411917 }
11918 {
Andrey Kosyakov83a6eee2017-08-14 19:20:0411919 std::unique_ptr<URLRequest> r(context.CreateRequest(
11920 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
11921 r->SetExtraRequestHeaders(extra_headers);
Andrey Kosyakov2e893e62017-08-31 17:00:5211922 r->SetRequestHeadersCallback(base::Bind([](HttpRawRequestHeaders) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0411923 FAIL() << "Callback should not be called unless request is sent";
11924 }));
Andrey Kosyakov2e893e62017-08-31 17:00:5211925 r->SetResponseHeadersCallback(
11926 base::Bind([](scoped_refptr<const HttpResponseHeaders>) {
11927 FAIL() << "Callback should not be called unless request is sent";
11928 }));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411929 r->Start();
11930 base::RunLoop().Run();
11931 EXPECT_TRUE(r->was_cached());
Andrey Kosyakov83a6eee2017-08-14 19:20:0411932 }
11933}
11934
Andrey Kosyakov2e893e62017-08-31 17:00:5211935TEST_F(URLRequestTestHTTP, HeadersCallbacksWithRedirect) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0411936 ASSERT_TRUE(http_test_server()->Start());
Andrey Kosyakov2e893e62017-08-31 17:00:5211937 HttpRawRequestHeaders raw_req_headers;
11938 scoped_refptr<const HttpResponseHeaders> raw_resp_headers;
11939
Andrey Kosyakov83a6eee2017-08-14 19:20:0411940 TestURLRequestContext context;
11941 TestDelegate delegate;
11942 HttpRequestHeaders extra_headers;
11943 extra_headers.SetHeader("X-Foo", "bar");
11944 delegate.set_quit_on_redirect(true);
11945 GURL url(http_test_server()->GetURL("/redirect-test.html"));
11946 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
11947 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
11948 r->SetExtraRequestHeaders(extra_headers);
11949 r->SetRequestHeadersCallback(base::Bind(&HttpRawRequestHeaders::Assign,
Andrey Kosyakov2e893e62017-08-31 17:00:5211950 base::Unretained(&raw_req_headers)));
11951 r->SetResponseHeadersCallback(base::Bind(
11952 [](scoped_refptr<const HttpResponseHeaders>* left,
11953 scoped_refptr<const HttpResponseHeaders> right) { *left = right; },
11954 base::Unretained(&raw_resp_headers)));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411955 r->Start();
11956 base::RunLoop().Run();
11957
11958 ASSERT_EQ(1, delegate.received_redirect_count());
11959 std::string value;
Andrey Kosyakov2e893e62017-08-31 17:00:5211960 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411961 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5211962 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Accept-Encoding", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411963 EXPECT_EQ("gzip, deflate", value);
11964 EXPECT_EQ(1, delegate.received_redirect_count());
Andrey Kosyakov2e893e62017-08-31 17:00:5211965 EXPECT_EQ("GET /redirect-test.html HTTP/1.1\r\n",
11966 raw_req_headers.request_line());
11967 EXPECT_TRUE(raw_resp_headers->HasHeader("Location"));
11968 EXPECT_EQ(302, raw_resp_headers->response_code());
11969 EXPECT_EQ("Redirect", raw_resp_headers->GetStatusText());
Andrey Kosyakov83a6eee2017-08-14 19:20:0411970
Andrey Kosyakov2e893e62017-08-31 17:00:5211971 raw_req_headers = HttpRawRequestHeaders();
11972 raw_resp_headers = nullptr;
Andrey Kosyakov83a6eee2017-08-14 19:20:0411973 r->FollowDeferredRedirect();
11974 base::RunLoop().Run();
Andrey Kosyakov2e893e62017-08-31 17:00:5211975 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411976 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5211977 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Accept-Encoding", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411978 EXPECT_EQ("gzip, deflate", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5211979 EXPECT_EQ("GET /with-headers.html HTTP/1.1\r\n",
11980 raw_req_headers.request_line());
11981 EXPECT_EQ(r->response_headers(), raw_resp_headers.get());
Andrey Kosyakov83a6eee2017-08-14 19:20:0411982}
11983
Andrey Kosyakov2e893e62017-08-31 17:00:5211984TEST_F(URLRequestTest, HeadersCallbacksConnectFailed) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0411985 TestDelegate request_delegate;
11986
11987 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
11988 GURL("http://127.0.0.1:9/"), DEFAULT_PRIORITY, &request_delegate,
11989 TRAFFIC_ANNOTATION_FOR_TESTS));
11990 r->SetRequestHeadersCallback(base::Bind([](net::HttpRawRequestHeaders) {
11991 FAIL() << "Callback should not be called unless request is sent";
11992 }));
Andrey Kosyakov2e893e62017-08-31 17:00:5211993 r->SetResponseHeadersCallback(
11994 base::Bind([](scoped_refptr<const net::HttpResponseHeaders>) {
11995 FAIL() << "Callback should not be called unless request is sent";
11996 }));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411997 r->Start();
11998 base::RunLoop().Run();
11999 EXPECT_FALSE(r->is_pending());
12000}
12001
Andrey Kosyakov2e893e62017-08-31 17:00:5212002TEST_F(URLRequestTestHTTP, HeadersCallbacksAuthRetry) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412003 ASSERT_TRUE(http_test_server()->Start());
12004 GURL url(http_test_server()->GetURL("/auth-basic"));
12005
12006 TestURLRequestContext context;
12007 TestDelegate delegate;
12008
12009 delegate.set_credentials(AuthCredentials(kUser, kSecret));
12010 HttpRequestHeaders extra_headers;
12011 extra_headers.SetHeader("X-Foo", "bar");
12012
Andrey Kosyakov2e893e62017-08-31 17:00:5212013 using ReqHeadersVector = std::vector<std::unique_ptr<HttpRawRequestHeaders>>;
12014 ReqHeadersVector raw_req_headers;
Andrey Kosyakov83a6eee2017-08-14 19:20:0412015
Andrey Kosyakov2e893e62017-08-31 17:00:5212016 using RespHeadersVector =
12017 std::vector<scoped_refptr<const HttpResponseHeaders>>;
12018 RespHeadersVector raw_resp_headers;
12019
12020 auto req_headers_callback = base::Bind(
12021 [](ReqHeadersVector* vec, HttpRawRequestHeaders headers) {
12022 vec->emplace_back(new HttpRawRequestHeaders(std::move(headers)));
12023 },
12024 &raw_req_headers);
12025 auto resp_headers_callback = base::Bind(
12026 [](RespHeadersVector* vec,
12027 scoped_refptr<const HttpResponseHeaders> headers) {
12028 vec->push_back(headers);
12029 },
12030 &raw_resp_headers);
Andrey Kosyakov83a6eee2017-08-14 19:20:0412031 std::unique_ptr<URLRequest> r(context.CreateRequest(
12032 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
12033 r->SetExtraRequestHeaders(extra_headers);
Andrey Kosyakov2e893e62017-08-31 17:00:5212034 r->SetRequestHeadersCallback(req_headers_callback);
12035 r->SetResponseHeadersCallback(resp_headers_callback);
Andrey Kosyakov83a6eee2017-08-14 19:20:0412036 r->Start();
12037 base::RunLoop().Run();
12038 EXPECT_FALSE(r->is_pending());
Andrey Kosyakov2e893e62017-08-31 17:00:5212039 ASSERT_EQ(raw_req_headers.size(), 2u);
12040 ASSERT_EQ(raw_resp_headers.size(), 2u);
Andrey Kosyakov83a6eee2017-08-14 19:20:0412041 std::string value;
Andrey Kosyakov2e893e62017-08-31 17:00:5212042 EXPECT_FALSE(raw_req_headers[0]->FindHeaderForTest("Authorization", &value));
12043 EXPECT_TRUE(raw_req_headers[0]->FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412044 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212045 EXPECT_TRUE(raw_req_headers[1]->FindHeaderForTest("Authorization", &value));
12046 EXPECT_TRUE(raw_req_headers[1]->FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412047 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212048 EXPECT_EQ(raw_resp_headers[1], r->response_headers());
12049 EXPECT_NE(raw_resp_headers[0], raw_resp_headers[1]);
12050 EXPECT_EQ(401, raw_resp_headers[0]->response_code());
12051 EXPECT_EQ("Unauthorized", raw_resp_headers[0]->GetStatusText());
12052
12053 std::unique_ptr<URLRequest> r2(context.CreateRequest(
12054 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
12055 r2->SetExtraRequestHeaders(extra_headers);
12056 r2->SetRequestHeadersCallback(req_headers_callback);
12057 r2->SetResponseHeadersCallback(resp_headers_callback);
12058 r2->SetLoadFlags(LOAD_VALIDATE_CACHE);
12059 r2->Start();
12060 base::RunLoop().Run();
12061 EXPECT_FALSE(r2->is_pending());
12062 ASSERT_EQ(raw_req_headers.size(), 3u);
12063 ASSERT_EQ(raw_resp_headers.size(), 3u);
12064 EXPECT_TRUE(raw_req_headers[2]->FindHeaderForTest("If-None-Match", &value));
12065 EXPECT_NE(raw_resp_headers[2].get(), r2->response_headers());
12066 EXPECT_EQ(304, raw_resp_headers[2]->response_code());
12067 EXPECT_EQ("Not Modified", raw_resp_headers[2]->GetStatusText());
Andrey Kosyakov83a6eee2017-08-14 19:20:0412068}
12069
Andrey Kosyakov2e893e62017-08-31 17:00:5212070TEST_F(URLRequestTest, HeadersCallbacksNonHTTP) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412071 GURL data_url("data:text/html,<html><body>Hello!</body></html>");
12072 TestDelegate d;
12073 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
12074 data_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
12075 r->SetRequestHeadersCallback(base::Bind([](net::HttpRawRequestHeaders) {
Andrey Kosyakov2e893e62017-08-31 17:00:5212076 FAIL() << "Callback should not be called for non-HTTP schemes";
Andrey Kosyakov83a6eee2017-08-14 19:20:0412077 }));
Andrey Kosyakov2e893e62017-08-31 17:00:5212078 r->SetResponseHeadersCallback(
12079 base::Bind([](scoped_refptr<const net::HttpResponseHeaders>) {
12080 FAIL() << "Callback should not be called for non-HTTP schemes";
12081 }));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412082 r->Start();
12083 base::RunLoop().Run();
12084 EXPECT_FALSE(r->is_pending());
12085}
12086
[email protected]7461a402011-03-24 23:19:5112087} // namespace net