blob: cd249796dc69e250286200c22487e7ebb8a3be6f [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:
Chris Watkins7a41d3552017-12-01 02:13:27323 TestPowerMonitorSource() = default;
324 ~TestPowerMonitorSource() override = default;
mmenkefb18c772015-09-30 22:22:50325
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 }
Chris Watkins7a41d3552017-12-01 02:13:27739 ~TestURLRequestContextWithProxy() override = default;
[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:
Chris Watkins7a41d3552017-12-01 02:13:27747 MockCertificateReportSender() = default;
748 ~MockCertificateReportSender() override = default;
estark06e0dac2015-08-07 21:56:01749
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:
Chris Watkins7a41d3552017-12-01 02:13:27883 CookieBlockingNetworkDelegate() = default;
884 ;
satoruxddac0442017-05-29 06:06:18885
886 // Adds |directory| to the access white list.
887 void AddToWhitelist(const base::FilePath& directory) {
888 whitelist_.insert(directory);
889 }
890
891 private:
892 // Returns true if |path| matches the white list.
893 bool OnCanAccessFileInternal(const base::FilePath& path) const {
894 for (const auto& directory : whitelist_) {
895 if (directory == path || directory.IsParent(path))
896 return true;
897 }
898 return false;
899 }
900
901 // Returns true only if both |original_path| and |absolute_path| match the
902 // white list.
903 bool OnCanAccessFile(const URLRequest& request,
904 const base::FilePath& original_path,
905 const base::FilePath& absolute_path) const override {
906 return (OnCanAccessFileInternal(original_path) &&
907 OnCanAccessFileInternal(absolute_path));
908 }
909
910 std::set<base::FilePath> whitelist_;
911
912 DISALLOW_COPY_AND_ASSIGN(CookieBlockingNetworkDelegate);
913};
914
[email protected]316c1e5e2012-09-12 15:17:44915TEST_F(URLRequestTest, AboutBlankTest) {
916 TestDelegate d;
917 {
rhalavatib7bd7c792017-04-27 05:25:16918 std::unique_ptr<URLRequest> r(
919 default_context_.CreateRequest(GURL("about:blank"), DEFAULT_PRIORITY,
920 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:44921
[email protected]f7022f32014-08-21 16:32:19922 r->Start();
923 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44924
[email protected]255620da2013-08-19 13:14:29925 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:44926
[email protected]f7022f32014-08-21 16:32:19927 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44928 EXPECT_FALSE(d.received_data_before_response());
929 EXPECT_EQ(d.bytes_received(), 0);
[email protected]f7022f32014-08-21 16:32:19930 EXPECT_EQ("", r->GetSocketAddress().host());
931 EXPECT_EQ(0, r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:04932
933 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:19934 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]316c1e5e2012-09-12 15:17:44935 }
936}
937
938TEST_F(URLRequestTest, DataURLImageTest) {
939 TestDelegate d;
940 {
941 // Use our nice little Chrome logo.
danakj8522a25b2016-04-16 00:17:36942 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
943 GURL("data:image/png;base64,"
944 "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUB"
945 "BjG3w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQ"
946 "xIEVxitD5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI"
947 "5MpCVdW0gO7tvNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKz"
948 "Mx1+fg9bAgK6zHq9cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7Ck"
949 "IMDxQpF7r/MWq12UctI1dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0"
950 "WYUqt57yWf2McHTObYPbVD+ZwbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2H"
951 "QQcm43XwmtoYM6vVKleh0uoWvnzW3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nk"
952 "DFHF9ZS+uYVjRUasMeHUmyLYtcklTvzWGFZnNOXczThvpKIzjcahSqIzkvDLayDq6"
953 "D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTbxXX1T5xsV9tm9r4TQwHLiZw/pdDZJ"
954 "ea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5MrVvMzNaI3+ERHfrFzPKQukrQ"
955 "GI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gVMd6q5c8GdosynKmSeRuGz"
956 "pjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq/uxxZKzNiZFGD0wRC"
957 "3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7FUx1qLnV7MGF40"
958 "smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufBJbsysjjW4"
959 "kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJMnlm2O"
960 "34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfmm"
961 "oRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV"
962 "5EnhORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="),
rhalavatib7bd7c792017-04-27 05:25:16963 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:44964
[email protected]f7022f32014-08-21 16:32:19965 r->Start();
966 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44967
[email protected]255620da2013-08-19 13:14:29968 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:44969
[email protected]f7022f32014-08-21 16:32:19970 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44971 EXPECT_FALSE(d.received_data_before_response());
972 EXPECT_EQ(d.bytes_received(), 911);
[email protected]f7022f32014-08-21 16:32:19973 EXPECT_EQ("", r->GetSocketAddress().host());
974 EXPECT_EQ(0, r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:04975
976 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:19977 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]316c1e5e2012-09-12 15:17:44978 }
979}
980
brettwa1228ebb2016-10-28 03:51:34981#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]316c1e5e2012-09-12 15:17:44982TEST_F(URLRequestTest, FileTest) {
Sergey Ulanov2e49f492017-09-14 19:37:51983 const char kTestFileContent[] = "Hello";
984 base::FilePath test_file;
985 ASSERT_NO_FATAL_FAILURE(
986 CreateTestFile(kTestFileContent, sizeof(kTestFileContent), &test_file));
kraush5a645822016-04-07 18:35:04987
Sergey Ulanov2e49f492017-09-14 19:37:51988 GURL test_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:44989
990 TestDelegate d;
991 {
rhalavatib7bd7c792017-04-27 05:25:16992 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
Sergey Ulanov2e49f492017-09-14 19:37:51993 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:44994
[email protected]f7022f32014-08-21 16:32:19995 r->Start();
996 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44997
[email protected]255620da2013-08-19 13:14:29998 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:44999
[email protected]f7022f32014-08-21 16:32:191000 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441001 EXPECT_EQ(1, d.response_started_count());
1002 EXPECT_FALSE(d.received_data_before_response());
Sergey Ulanov2e49f492017-09-14 19:37:511003 EXPECT_EQ(d.bytes_received(), static_cast<int>(sizeof(kTestFileContent)));
[email protected]f7022f32014-08-21 16:32:191004 EXPECT_EQ("", r->GetSocketAddress().host());
1005 EXPECT_EQ(0, r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:041006
1007 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:191008 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]316c1e5e2012-09-12 15:17:441009 }
1010}
1011
[email protected]ba40bb762012-12-17 07:11:041012TEST_F(URLRequestTest, FileTestCancel) {
Sergey Ulanov2e49f492017-09-14 19:37:511013 const char kTestFileContent[] = "Hello";
1014 base::FilePath test_file;
1015 ASSERT_NO_FATAL_FAILURE(
1016 CreateTestFile(kTestFileContent, sizeof(kTestFileContent), &test_file));
1017
1018 GURL test_url = FilePathToFileURL(test_file);
[email protected]ba40bb762012-12-17 07:11:041019
1020 TestDelegate d;
1021 {
rhalavatib7bd7c792017-04-27 05:25:161022 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
Sergey Ulanov2e49f492017-09-14 19:37:511023 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]ba40bb762012-12-17 07:11:041024
[email protected]f7022f32014-08-21 16:32:191025 r->Start();
1026 EXPECT_TRUE(r->is_pending());
1027 r->Cancel();
[email protected]ba40bb762012-12-17 07:11:041028 }
[email protected]79e1fd62013-06-20 06:50:041029 // Async cancellation should be safe even when URLRequest has been already
[email protected]ba40bb762012-12-17 07:11:041030 // destroyed.
[email protected]255620da2013-08-19 13:14:291031 base::RunLoop().RunUntilIdle();
[email protected]ba40bb762012-12-17 07:11:041032}
1033
[email protected]316c1e5e2012-09-12 15:17:441034TEST_F(URLRequestTest, FileTestFullSpecifiedRange) {
1035 const size_t buffer_size = 4000;
danakj8522a25b2016-04-16 00:17:361036 std::unique_ptr<char[]> buffer(new char[buffer_size]);
[email protected]316c1e5e2012-09-12 15:17:441037 FillBuffer(buffer.get(), buffer_size);
1038
Sergey Ulanov2e49f492017-09-14 19:37:511039 base::FilePath test_file;
1040 ASSERT_NO_FATAL_FAILURE(
1041 CreateTestFile(buffer.get(), buffer_size, &test_file));
1042 GURL temp_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:441043
1044 const size_t first_byte_position = 500;
1045 const size_t last_byte_position = buffer_size - first_byte_position;
1046 const size_t content_length = last_byte_position - first_byte_position + 1;
1047 std::string partial_buffer_string(buffer.get() + first_byte_position,
1048 buffer.get() + last_byte_position + 1);
1049
1050 TestDelegate d;
1051 {
rhalavatib7bd7c792017-04-27 05:25:161052 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1053 temp_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:441054
1055 HttpRequestHeaders headers;
[email protected]b7572ea2013-11-26 20:16:381056 headers.SetHeader(
1057 HttpRequestHeaders::kRange,
[email protected]cba24642014-08-15 20:49:591058 HttpByteRange::Bounded(
[email protected]b7572ea2013-11-26 20:16:381059 first_byte_position, last_byte_position).GetHeaderValue());
[email protected]f7022f32014-08-21 16:32:191060 r->SetExtraRequestHeaders(headers);
1061 r->Start();
1062 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441063
[email protected]255620da2013-08-19 13:14:291064 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:191065 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441066 EXPECT_EQ(1, d.response_started_count());
1067 EXPECT_FALSE(d.received_data_before_response());
1068 EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
1069 // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
1070 EXPECT_TRUE(partial_buffer_string == d.data_received());
1071 }
[email protected]316c1e5e2012-09-12 15:17:441072}
1073
1074TEST_F(URLRequestTest, FileTestHalfSpecifiedRange) {
1075 const size_t buffer_size = 4000;
danakj8522a25b2016-04-16 00:17:361076 std::unique_ptr<char[]> buffer(new char[buffer_size]);
[email protected]316c1e5e2012-09-12 15:17:441077 FillBuffer(buffer.get(), buffer_size);
1078
Sergey Ulanov2e49f492017-09-14 19:37:511079 base::FilePath test_file;
1080 ASSERT_NO_FATAL_FAILURE(
1081 CreateTestFile(buffer.get(), buffer_size, &test_file));
1082 GURL temp_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:441083
1084 const size_t first_byte_position = 500;
1085 const size_t last_byte_position = buffer_size - 1;
1086 const size_t content_length = last_byte_position - first_byte_position + 1;
1087 std::string partial_buffer_string(buffer.get() + first_byte_position,
1088 buffer.get() + last_byte_position + 1);
1089
1090 TestDelegate d;
1091 {
rhalavatib7bd7c792017-04-27 05:25:161092 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1093 temp_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:441094
1095 HttpRequestHeaders headers;
1096 headers.SetHeader(HttpRequestHeaders::kRange,
[email protected]cba24642014-08-15 20:49:591097 HttpByteRange::RightUnbounded(
[email protected]b7572ea2013-11-26 20:16:381098 first_byte_position).GetHeaderValue());
[email protected]f7022f32014-08-21 16:32:191099 r->SetExtraRequestHeaders(headers);
1100 r->Start();
1101 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441102
[email protected]255620da2013-08-19 13:14:291103 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:191104 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441105 EXPECT_EQ(1, d.response_started_count());
1106 EXPECT_FALSE(d.received_data_before_response());
1107 EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
1108 // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
1109 EXPECT_TRUE(partial_buffer_string == d.data_received());
1110 }
[email protected]316c1e5e2012-09-12 15:17:441111}
1112
1113TEST_F(URLRequestTest, FileTestMultipleRanges) {
1114 const size_t buffer_size = 400000;
danakj8522a25b2016-04-16 00:17:361115 std::unique_ptr<char[]> buffer(new char[buffer_size]);
[email protected]316c1e5e2012-09-12 15:17:441116 FillBuffer(buffer.get(), buffer_size);
1117
Sergey Ulanov2e49f492017-09-14 19:37:511118 base::FilePath test_file;
1119 ASSERT_NO_FATAL_FAILURE(
1120 CreateTestFile(buffer.get(), buffer_size, &test_file));
1121 GURL temp_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:441122
1123 TestDelegate d;
1124 {
rhalavatib7bd7c792017-04-27 05:25:161125 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1126 temp_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:441127
1128 HttpRequestHeaders headers;
[email protected]b7572ea2013-11-26 20:16:381129 headers.SetHeader(HttpRequestHeaders::kRange, "bytes=0-0,10-200,200-300");
[email protected]f7022f32014-08-21 16:32:191130 r->SetExtraRequestHeaders(headers);
1131 r->Start();
1132 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441133
[email protected]255620da2013-08-19 13:14:291134 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441135 EXPECT_TRUE(d.request_failed());
1136 }
[email protected]316c1e5e2012-09-12 15:17:441137}
1138
[email protected]3ca8b362013-11-11 22:18:071139TEST_F(URLRequestTest, AllowFileURLs) {
Sergey Ulanov2e49f492017-09-14 19:37:511140 std::string test_data("monkey");
[email protected]3ca8b362013-11-11 22:18:071141 base::FilePath test_file;
Sergey Ulanov2e49f492017-09-14 19:37:511142 ASSERT_NO_FATAL_FAILURE(
1143 CreateTestFile(test_data.data(), test_data.size(), &test_file));
1144
satoruxddac0442017-05-29 06:06:181145 // The directory part of the path returned from CreateTemporaryFileInDir()
1146 // can be slightly different from |absolute_temp_dir| on Windows.
1147 // Example: C:\\Users\\CHROME~2 -> C:\\Users\\chrome-bot
1148 // Hence the test should use the directory name of |test_file|, rather than
1149 // |absolute_temp_dir|, for whitelisting.
1150 base::FilePath real_temp_dir = test_file.DirName();
[email protected]cba24642014-08-15 20:49:591151 GURL test_file_url = FilePathToFileURL(test_file);
[email protected]3ca8b362013-11-11 22:18:071152 {
1153 TestDelegate d;
satoruxddac0442017-05-29 06:06:181154 CookieBlockingNetworkDelegate network_delegate;
1155 network_delegate.AddToWhitelist(real_temp_dir);
[email protected]3ca8b362013-11-11 22:18:071156 default_context_.set_network_delegate(&network_delegate);
rhalavatib7bd7c792017-04-27 05:25:161157 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1158 test_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191159 r->Start();
[email protected]3ca8b362013-11-11 22:18:071160 base::RunLoop().Run();
satoruxddac0442017-05-29 06:06:181161 // This should be allowed as the file path is whitelisted.
[email protected]3ca8b362013-11-11 22:18:071162 EXPECT_FALSE(d.request_failed());
1163 EXPECT_EQ(test_data, d.data_received());
1164 }
1165
1166 {
1167 TestDelegate d;
satoruxddac0442017-05-29 06:06:181168 CookieBlockingNetworkDelegate network_delegate;
[email protected]3ca8b362013-11-11 22:18:071169 default_context_.set_network_delegate(&network_delegate);
rhalavatib7bd7c792017-04-27 05:25:161170 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1171 test_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191172 r->Start();
[email protected]3ca8b362013-11-11 22:18:071173 base::RunLoop().Run();
satoruxddac0442017-05-29 06:06:181174 // This should be rejected as the file path is not whitelisted.
[email protected]3ca8b362013-11-11 22:18:071175 EXPECT_TRUE(d.request_failed());
1176 EXPECT_EQ("", d.data_received());
satoruxddac0442017-05-29 06:06:181177 EXPECT_EQ(ERR_ACCESS_DENIED, d.request_status());
[email protected]3ca8b362013-11-11 22:18:071178 }
1179}
1180
Kevin Marshalla9f05ec2017-07-14 02:10:051181#if defined(OS_POSIX) && !defined(OS_FUCHSIA) // Because of symbolic links.
satoruxddac0442017-05-29 06:06:181182
1183TEST_F(URLRequestTest, SymlinksToFiles) {
Sergey Ulanov2e49f492017-09-14 19:37:511184 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
satoruxddac0442017-05-29 06:06:181185 // Get an absolute path since temp_dir can contain a symbolic link.
1186 base::FilePath absolute_temp_dir =
Sergey Ulanov2e49f492017-09-14 19:37:511187 base::MakeAbsoluteFilePath(temp_dir_.GetPath());
satoruxddac0442017-05-29 06:06:181188
1189 // Create a good directory (will be whitelisted) and a good file.
1190 base::FilePath good_dir = absolute_temp_dir.AppendASCII("good");
1191 ASSERT_TRUE(base::CreateDirectory(good_dir));
1192 base::FilePath good_file;
1193 ASSERT_TRUE(base::CreateTemporaryFileInDir(good_dir, &good_file));
1194 std::string good_data("good");
1195 base::WriteFile(good_file, good_data.data(), good_data.size());
1196 // See the comment in AllowFileURLs() for why this is done.
1197 base::FilePath real_good_dir = good_file.DirName();
1198
1199 // Create a bad directory (will not be whitelisted) and a bad file.
1200 base::FilePath bad_dir = absolute_temp_dir.AppendASCII("bad");
1201 ASSERT_TRUE(base::CreateDirectory(bad_dir));
1202 base::FilePath bad_file;
1203 ASSERT_TRUE(base::CreateTemporaryFileInDir(bad_dir, &bad_file));
1204 std::string bad_data("bad");
1205 base::WriteFile(bad_file, bad_data.data(), bad_data.size());
1206
1207 // This symlink will point to the good file. Access to the symlink will be
1208 // allowed as both the symlink and the destination file are in the same
1209 // good directory.
1210 base::FilePath good_symlink = good_dir.AppendASCII("good_symlink");
1211 ASSERT_TRUE(base::CreateSymbolicLink(good_file, good_symlink));
1212 GURL good_file_url = FilePathToFileURL(good_symlink);
1213 // This symlink will point to the bad file. Even though the symlink is in
1214 // the good directory, access to the symlink will be rejected since it
1215 // points to the bad file.
1216 base::FilePath bad_symlink = good_dir.AppendASCII("bad_symlink");
1217 ASSERT_TRUE(base::CreateSymbolicLink(bad_file, bad_symlink));
1218 GURL bad_file_url = FilePathToFileURL(bad_symlink);
1219
1220 CookieBlockingNetworkDelegate network_delegate;
1221 network_delegate.AddToWhitelist(real_good_dir);
1222 {
1223 TestDelegate d;
1224 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371225 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1226 good_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181227 r->Start();
1228 base::RunLoop().Run();
1229 // good_file_url should be allowed.
1230 EXPECT_FALSE(d.request_failed());
1231 EXPECT_EQ(good_data, d.data_received());
1232 }
1233
1234 {
1235 TestDelegate d;
1236 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371237 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1238 bad_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181239 r->Start();
1240 base::RunLoop().Run();
1241 // bad_file_url should be rejected.
1242 EXPECT_TRUE(d.request_failed());
1243 EXPECT_EQ("", d.data_received());
1244 EXPECT_EQ(ERR_ACCESS_DENIED, d.request_status());
1245 }
1246}
1247
1248TEST_F(URLRequestTest, SymlinksToDirs) {
Sergey Ulanov2e49f492017-09-14 19:37:511249 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
satoruxddac0442017-05-29 06:06:181250 // Get an absolute path since temp_dir can contain a symbolic link.
1251 base::FilePath absolute_temp_dir =
Sergey Ulanov2e49f492017-09-14 19:37:511252 base::MakeAbsoluteFilePath(temp_dir_.GetPath());
satoruxddac0442017-05-29 06:06:181253
1254 // Create a good directory (will be whitelisted).
1255 base::FilePath good_dir = absolute_temp_dir.AppendASCII("good");
1256 ASSERT_TRUE(base::CreateDirectory(good_dir));
1257
1258 // Create a bad directory (will not be whitelisted).
1259 base::FilePath bad_dir = absolute_temp_dir.AppendASCII("bad");
1260 ASSERT_TRUE(base::CreateDirectory(bad_dir));
1261
1262 // This symlink will point to the good directory. Access to the symlink
1263 // will be allowed as the symlink is in the good dir that'll be white
1264 // listed.
1265 base::FilePath good_symlink = good_dir.AppendASCII("good_symlink");
1266 ASSERT_TRUE(base::CreateSymbolicLink(good_dir, good_symlink));
1267 GURL good_file_url = FilePathToFileURL(good_symlink);
1268 // This symlink will point to the bad directory. Even though the symlink is
1269 // in the good directory, access to the symlink will be rejected since it
1270 // points to the bad directory.
1271 base::FilePath bad_symlink = good_dir.AppendASCII("bad_symlink");
1272 ASSERT_TRUE(base::CreateSymbolicLink(bad_dir, bad_symlink));
1273 GURL bad_file_url = FilePathToFileURL(bad_symlink);
1274
1275 CookieBlockingNetworkDelegate network_delegate;
1276 network_delegate.AddToWhitelist(good_dir);
1277 {
1278 TestDelegate d;
1279 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371280 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1281 good_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181282 r->Start();
1283 base::RunLoop().Run();
1284 // good_file_url should be allowed.
1285 EXPECT_FALSE(d.request_failed());
1286 ASSERT_NE(d.data_received().find("good_symlink"), std::string::npos);
1287 }
1288
1289 {
1290 TestDelegate d;
1291 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371292 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1293 bad_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181294 r->Start();
1295 base::RunLoop().Run();
1296 // bad_file_url should be rejected.
1297 EXPECT_TRUE(d.request_failed());
1298 EXPECT_EQ("", d.data_received());
1299 EXPECT_EQ(ERR_ACCESS_DENIED, d.request_status());
1300 }
1301}
1302
Kevin Marshalla9f05ec2017-07-14 02:10:051303#endif // defined(OS_POSIX) && !defined(OS_FUCHSIA)
[email protected]316c1e5e2012-09-12 15:17:441304
1305TEST_F(URLRequestTest, FileDirCancelTest) {
1306 // Put in mock resource provider.
1307 NetModule::SetResourceProvider(TestNetResourceProvider);
1308
1309 TestDelegate d;
1310 {
[email protected]6cdfd7f2013-02-08 20:40:151311 base::FilePath file_path;
[email protected]316c1e5e2012-09-12 15:17:441312 PathService::Get(base::DIR_SOURCE_ROOT, &file_path);
1313 file_path = file_path.Append(FILE_PATH_LITERAL("net"));
1314 file_path = file_path.Append(FILE_PATH_LITERAL("data"));
1315
danakj8522a25b2016-04-16 00:17:361316 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161317 FilePathToFileURL(file_path), DEFAULT_PRIORITY, &d,
1318 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191319 req->Start();
1320 EXPECT_TRUE(req->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441321
1322 d.set_cancel_in_received_data_pending(true);
1323
[email protected]255620da2013-08-19 13:14:291324 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441325 }
1326
1327 // Take out mock resource provider.
1328 NetModule::SetResourceProvider(NULL);
1329}
1330
[email protected]5f9581402013-10-30 13:08:321331TEST_F(URLRequestTest, FileDirOutputSanity) {
1332 // Verify the general sanity of the the output of the file:
1333 // directory lister by checking for the output of a known existing
1334 // file.
1335 const char sentinel_name[] = "filedir-sentinel";
1336
1337 base::FilePath path;
1338 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:471339 path = path.Append(kTestFilePath);
[email protected]5f9581402013-10-30 13:08:321340
1341 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:161342 std::unique_ptr<URLRequest> req(
1343 default_context_.CreateRequest(FilePathToFileURL(path), DEFAULT_PRIORITY,
1344 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191345 req->Start();
[email protected]5f9581402013-10-30 13:08:321346 base::RunLoop().Run();
1347
1348 // Generate entry for the sentinel file.
1349 base::FilePath sentinel_path = path.AppendASCII(sentinel_name);
[email protected]54124ed02014-01-07 10:06:581350 base::File::Info info;
[email protected]9eae4e62013-12-04 20:56:491351 EXPECT_TRUE(base::GetFileInfo(sentinel_path, &info));
[email protected]5f9581402013-10-30 13:08:321352 EXPECT_GT(info.size, 0);
1353 std::string sentinel_output = GetDirectoryListingEntry(
1354 base::string16(sentinel_name, sentinel_name + strlen(sentinel_name)),
satoruxddac0442017-05-29 06:06:181355 std::string(sentinel_name), false /* is_dir */, info.size,
1356
[email protected]5f9581402013-10-30 13:08:321357 info.last_modified);
1358
1359 ASSERT_LT(0, d.bytes_received());
1360 ASSERT_FALSE(d.request_failed());
maksim.sisovb53724b52016-09-16 05:30:501361 EXPECT_EQ(OK, d.request_status());
[email protected]5f9581402013-10-30 13:08:321362 // Check for the entry generated for the "sentinel" file.
1363 const std::string& data = d.data_received();
1364 ASSERT_NE(data.find(sentinel_output), std::string::npos);
1365}
1366
[email protected]316c1e5e2012-09-12 15:17:441367TEST_F(URLRequestTest, FileDirRedirectNoCrash) {
1368 // There is an implicit redirect when loading a file path that matches a
1369 // directory and does not end with a slash. Ensure that following such
1370 // redirects does not crash. See http://crbug.com/18686.
1371
[email protected]6cdfd7f2013-02-08 20:40:151372 base::FilePath path;
[email protected]316c1e5e2012-09-12 15:17:441373 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:471374 path = path.Append(kTestFilePath);
[email protected]316c1e5e2012-09-12 15:17:441375
1376 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:161377 std::unique_ptr<URLRequest> req(
1378 default_context_.CreateRequest(FilePathToFileURL(path), DEFAULT_PRIORITY,
1379 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191380 req->Start();
[email protected]255620da2013-08-19 13:14:291381 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441382
1383 ASSERT_EQ(1, d.received_redirect_count());
1384 ASSERT_LT(0, d.bytes_received());
1385 ASSERT_FALSE(d.request_failed());
maksim.sisovb53724b52016-09-16 05:30:501386 EXPECT_EQ(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:441387}
1388
1389#if defined(OS_WIN)
1390// Don't accept the url "file:///" on windows. See http://crbug.com/1474.
1391TEST_F(URLRequestTest, FileDirRedirectSingleSlash) {
1392 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:161393 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
1394 GURL("file:///"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191395 req->Start();
[email protected]255620da2013-08-19 13:14:291396 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441397
1398 ASSERT_EQ(1, d.received_redirect_count());
maksim.sisovb53724b52016-09-16 05:30:501399 EXPECT_NE(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:441400}
[email protected]5ecf7cb282014-05-11 01:49:551401#endif // defined(OS_WIN)
1402
brettwa1228ebb2016-10-28 03:51:341403#endif // !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]5ecf7cb282014-05-11 01:49:551404
1405TEST_F(URLRequestTest, InvalidUrlTest) {
1406 TestDelegate d;
1407 {
rhalavatib7bd7c792017-04-27 05:25:161408 std::unique_ptr<URLRequest> r(
1409 default_context_.CreateRequest(GURL("invalid url"), DEFAULT_PRIORITY,
1410 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5ecf7cb282014-05-11 01:49:551411
[email protected]f7022f32014-08-21 16:32:191412 r->Start();
1413 EXPECT_TRUE(r->is_pending());
[email protected]5ecf7cb282014-05-11 01:49:551414
1415 base::RunLoop().Run();
1416 EXPECT_TRUE(d.request_failed());
1417 }
1418}
1419
jochen0e3b3a62014-09-16 18:31:231420TEST_F(URLRequestTest, InvalidReferrerTest) {
1421 TestURLRequestContext context;
1422 TestNetworkDelegate network_delegate;
1423 network_delegate.set_cancel_request_with_policy_violating_referrer(true);
1424 context.set_network_delegate(&network_delegate);
1425 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361426 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:161427 context.CreateRequest(GURL("http://localhost/"), DEFAULT_PRIORITY, &d,
1428 TRAFFIC_ANNOTATION_FOR_TESTS));
jochen0e3b3a62014-09-16 18:31:231429 req->SetReferrer("https://somewhere.com/");
1430
1431 req->Start();
1432 base::RunLoop().Run();
1433 EXPECT_TRUE(d.request_failed());
1434}
1435
[email protected]5ecf7cb282014-05-11 01:49:551436#if defined(OS_WIN)
1437TEST_F(URLRequestTest, ResolveShortcutTest) {
1438 base::FilePath app_path;
1439 PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
mmenke9f2ec60c2015-06-01 20:59:471440 app_path = app_path.Append(kTestFilePath);
[email protected]5ecf7cb282014-05-11 01:49:551441 app_path = app_path.AppendASCII("with-headers.html");
1442
1443 std::wstring lnk_path = app_path.value() + L".lnk";
1444
1445 base::win::ScopedCOMInitializer com_initializer;
1446
1447 // Temporarily create a shortcut for test
1448 {
Robert Liaoc88f99d12017-10-17 21:48:331449 Microsoft::WRL::ComPtr<IShellLink> shell;
robliaoeb9bfd642017-05-18 17:35:161450 ASSERT_TRUE(SUCCEEDED(::CoCreateInstance(
1451 CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shell))));
Robert Liaoc88f99d12017-10-17 21:48:331452 Microsoft::WRL::ComPtr<IPersistFile> persist;
robliao310fa98b2017-05-11 17:14:001453 ASSERT_TRUE(SUCCEEDED(shell.CopyTo(persist.GetAddressOf())));
[email protected]5ecf7cb282014-05-11 01:49:551454 EXPECT_TRUE(SUCCEEDED(shell->SetPath(app_path.value().c_str())));
1455 EXPECT_TRUE(SUCCEEDED(shell->SetDescription(L"ResolveShortcutTest")));
1456 EXPECT_TRUE(SUCCEEDED(persist->Save(lnk_path.c_str(), TRUE)));
1457 }
1458
1459 TestDelegate d;
1460 {
danakj8522a25b2016-04-16 00:17:361461 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161462 FilePathToFileURL(base::FilePath(lnk_path)), DEFAULT_PRIORITY, &d,
1463 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5ecf7cb282014-05-11 01:49:551464
[email protected]f7022f32014-08-21 16:32:191465 r->Start();
1466 EXPECT_TRUE(r->is_pending());
[email protected]5ecf7cb282014-05-11 01:49:551467
1468 base::RunLoop().Run();
1469
1470 WIN32_FILE_ATTRIBUTE_DATA data;
1471 GetFileAttributesEx(app_path.value().c_str(),
1472 GetFileExInfoStandard, &data);
1473 HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ,
1474 FILE_SHARE_READ, NULL, OPEN_EXISTING,
1475 FILE_ATTRIBUTE_NORMAL, NULL);
1476 EXPECT_NE(INVALID_HANDLE_VALUE, file);
danakj8522a25b2016-04-16 00:17:361477 std::unique_ptr<char[]> buffer(new char[data.nFileSizeLow]);
[email protected]5ecf7cb282014-05-11 01:49:551478 DWORD read_size;
1479 BOOL result;
1480 result = ReadFile(file, buffer.get(), data.nFileSizeLow,
1481 &read_size, NULL);
1482 std::string content(buffer.get(), read_size);
1483 CloseHandle(file);
1484
[email protected]f7022f32014-08-21 16:32:191485 EXPECT_TRUE(!r->is_pending());
[email protected]5ecf7cb282014-05-11 01:49:551486 EXPECT_EQ(1, d.received_redirect_count());
1487 EXPECT_EQ(content, d.data_received());
1488 }
1489
1490 // Clean the shortcut
1491 DeleteFile(lnk_path.c_str());
1492}
1493#endif // defined(OS_WIN)
[email protected]316c1e5e2012-09-12 15:17:441494
1495// Custom URLRequestJobs for use with interceptor tests
1496class RestartTestJob : public URLRequestTestJob {
1497 public:
1498 RestartTestJob(URLRequest* request, NetworkDelegate* network_delegate)
1499 : URLRequestTestJob(request, network_delegate, true) {}
1500 protected:
dchengb03027d2014-10-21 12:00:201501 void StartAsync() override { this->NotifyRestartRequired(); }
[email protected]316c1e5e2012-09-12 15:17:441502 private:
Chris Watkins7a41d3552017-12-01 02:13:271503 ~RestartTestJob() override = default;
[email protected]316c1e5e2012-09-12 15:17:441504};
1505
1506class CancelTestJob : public URLRequestTestJob {
1507 public:
1508 explicit CancelTestJob(URLRequest* request, NetworkDelegate* network_delegate)
1509 : URLRequestTestJob(request, network_delegate, true) {}
1510 protected:
dchengb03027d2014-10-21 12:00:201511 void StartAsync() override { request_->Cancel(); }
[email protected]316c1e5e2012-09-12 15:17:441512 private:
Chris Watkins7a41d3552017-12-01 02:13:271513 ~CancelTestJob() override = default;
[email protected]316c1e5e2012-09-12 15:17:441514};
1515
1516class CancelThenRestartTestJob : public URLRequestTestJob {
1517 public:
1518 explicit CancelThenRestartTestJob(URLRequest* request,
1519 NetworkDelegate* network_delegate)
1520 : URLRequestTestJob(request, network_delegate, true) {
1521 }
1522 protected:
dchengb03027d2014-10-21 12:00:201523 void StartAsync() override {
[email protected]316c1e5e2012-09-12 15:17:441524 request_->Cancel();
1525 this->NotifyRestartRequired();
1526 }
1527 private:
Chris Watkins7a41d3552017-12-01 02:13:271528 ~CancelThenRestartTestJob() override = default;
[email protected]316c1e5e2012-09-12 15:17:441529};
1530
bengr1bf8e942014-11-07 01:36:501531// An Interceptor for use with interceptor tests.
1532class MockURLRequestInterceptor : public URLRequestInterceptor {
1533 public:
1534 // Static getters for canned response header and data strings.
1535 static std::string ok_data() {
1536 return URLRequestTestJob::test_data_1();
1537 }
1538
1539 static std::string ok_headers() {
1540 return URLRequestTestJob::test_headers();
1541 }
1542
1543 static std::string redirect_data() {
1544 return std::string();
1545 }
1546
1547 static std::string redirect_headers() {
1548 return URLRequestTestJob::test_redirect_headers();
1549 }
1550
1551 static std::string error_data() {
1552 return std::string("ohhh nooooo mr. bill!");
1553 }
1554
1555 static std::string error_headers() {
1556 return URLRequestTestJob::test_error_headers();
1557 }
1558
1559 MockURLRequestInterceptor()
1560 : intercept_main_request_(false), restart_main_request_(false),
1561 cancel_main_request_(false), cancel_then_restart_main_request_(false),
1562 simulate_main_network_error_(false),
1563 intercept_redirect_(false), cancel_redirect_request_(false),
1564 intercept_final_response_(false), cancel_final_request_(false),
1565 use_url_request_http_job_(false),
1566 did_intercept_main_(false), did_restart_main_(false),
1567 did_cancel_main_(false), did_cancel_then_restart_main_(false),
1568 did_simulate_error_main_(false),
1569 did_intercept_redirect_(false), did_cancel_redirect_(false),
1570 did_intercept_final_(false), did_cancel_final_(false) {
1571 }
1572
Chris Watkins7a41d3552017-12-01 02:13:271573 ~MockURLRequestInterceptor() override = default;
bengr1bf8e942014-11-07 01:36:501574
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) {}
Chris Watkins7a41d3552017-12-01 02:13:273401 ~FixedDateNetworkDelegate() override = default;
[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,
Brett Wilson5accd242017-11-30 22:07:323567 base::NumberToString(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:
Chris Watkins7a41d3552017-12-01 02:13:273752 ~TestSSLConfigService() override = default;
nharperb7441ef2016-01-25 23:54:143753
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,
Brett Wilson5accd242017-11-30 22:07:324320 base::NumberToString(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
Chris Watkins7a41d3552017-12-01 02:13:275234 ~AsyncDelegateLogger() = default;
[email protected]abe1c4a2013-10-25 19:28:515235
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:
Chris Watkins7a41d3552017-12-01 02:13:275281 AsyncLoggingNetworkDelegate() = default;
5282 ~AsyncLoggingNetworkDelegate() override = default;
[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 }
Chris Watkins7a41d3552017-12-01 02:13:275374 ~AsyncLoggingUrlRequestDelegate() override = default;
[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) {}
Chris Watkins7a41d3552017-12-01 02:13:276786 ~MockExpectCTReporter() override = default;
estark1614475f2016-03-10 03:46:476787
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
Emily Stark627238f2017-11-29 03:29:546804// A CTPolicyEnforcer that returns a default CTPolicyCompliance value
estark1614475f2016-03-10 03:46:476805// for every certificate.
6806class MockCTPolicyEnforcer : public CTPolicyEnforcer {
6807 public:
6808 MockCTPolicyEnforcer()
Emily Stark627238f2017-11-29 03:29:546809 : default_result_(ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS) {}
Chris Watkins7a41d3552017-12-01 02:13:276810 ~MockCTPolicyEnforcer() override = default;
estark1614475f2016-03-10 03:46:476811
Emily Stark627238f2017-11-29 03:29:546812 ct::CTPolicyCompliance CheckCompliance(
estark1614475f2016-03-10 03:46:476813 X509Certificate* cert,
6814 const SCTList& verified_scts,
tfarina42834112016-09-22 13:38:206815 const NetLogWithSource& net_log) override {
estark1614475f2016-03-10 03:46:476816 return default_result_;
6817 }
6818
Emily Stark627238f2017-11-29 03:29:546819 void set_default_result(ct::CTPolicyCompliance default_result) {
estark1614475f2016-03-10 03:46:476820 default_result_ = default_result;
6821 }
6822
6823 private:
Emily Stark627238f2017-11-29 03:29:546824 ct::CTPolicyCompliance default_result_;
estark1614475f2016-03-10 03:46:476825};
6826
Emily Stark4cfecf072017-08-08 01:05:516827// Tests that Expect CT headers for the preload list are processed correctly.
6828TEST_F(URLRequestTestHTTP, PreloadExpectCTHeader) {
Martijn Croonenb1383da2017-10-11 11:56:356829 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
6830
estark1614475f2016-03-10 03:46:476831 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6832 https_test_server.SetSSLConfig(
6833 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6834 https_test_server.ServeFilesFromSourceDirectory(
6835 base::FilePath(kTestFilePath));
6836 ASSERT_TRUE(https_test_server.Start());
6837
6838 MockExpectCTReporter reporter;
6839 TransportSecurityState transport_security_state;
6840 transport_security_state.enable_static_expect_ct_ = true;
6841 transport_security_state.SetExpectCTReporter(&reporter);
6842
6843 // Set up a MockCertVerifier to accept the certificate that the server sends.
6844 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6845 ASSERT_TRUE(cert);
6846 MockCertVerifier cert_verifier;
6847 CertVerifyResult verify_result;
6848 verify_result.verified_cert = cert;
6849 verify_result.is_issued_by_known_root = true;
6850 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6851
rsleevi22cae1672016-12-28 01:53:366852 // Set up a DoNothingCTVerifier and MockCTPolicyEnforcer to trigger an Expect
6853 // CT violation.
6854 DoNothingCTVerifier ct_verifier;
estark1614475f2016-03-10 03:46:476855 MockCTPolicyEnforcer ct_policy_enforcer;
6856 ct_policy_enforcer.set_default_result(
Emily Stark627238f2017-11-29 03:29:546857 ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS);
estark1614475f2016-03-10 03:46:476858
6859 TestNetworkDelegate network_delegate;
6860 // Use a MockHostResolver (which by default maps all hosts to
6861 // 127.0.0.1) so that the request can be sent to a site on the Expect
6862 // CT preload list.
6863 MockHostResolver host_resolver;
6864 TestURLRequestContext context(true);
6865 context.set_host_resolver(&host_resolver);
6866 context.set_transport_security_state(&transport_security_state);
6867 context.set_network_delegate(&network_delegate);
6868 context.set_cert_verifier(&cert_verifier);
6869 context.set_cert_transparency_verifier(&ct_verifier);
vabr13d00742017-06-05 10:31:466870 context.set_ct_policy_enforcer(&ct_policy_enforcer);
estark1614475f2016-03-10 03:46:476871 context.Init();
6872
6873 // Now send a request to trigger the violation.
6874 TestDelegate d;
Emily Stark4cfecf072017-08-08 01:05:516875 GURL url = https_test_server.GetURL("/expect-ct-header-preload.html");
estark1614475f2016-03-10 03:46:476876 GURL::Replacements replace_host;
6877 replace_host.SetHostStr(kExpectCTStaticHostname);
6878 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:166879 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
6880 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark1614475f2016-03-10 03:46:476881 violating_request->Start();
6882 base::RunLoop().Run();
6883
6884 EXPECT_EQ(1u, reporter.num_failures());
6885}
Emily Stark4cfecf072017-08-08 01:05:516886
6887// Tests that Expect CT HTTP headers are processed correctly.
6888TEST_F(URLRequestTestHTTP, ExpectCTHeader) {
6889 base::test::ScopedFeatureList feature_list;
6890 feature_list.InitAndEnableFeature(
6891 TransportSecurityState::kDynamicExpectCTFeature);
6892
6893 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6894 https_test_server.SetSSLConfig(
6895 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6896 https_test_server.ServeFilesFromSourceDirectory(
6897 base::FilePath(kTestFilePath));
6898 ASSERT_TRUE(https_test_server.Start());
6899
6900 MockExpectCTReporter reporter;
6901 TransportSecurityState transport_security_state;
6902 transport_security_state.SetExpectCTReporter(&reporter);
6903
6904 // Set up a MockCertVerifier to accept the certificate that the server sends.
6905 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6906 ASSERT_TRUE(cert);
6907 MockCertVerifier cert_verifier;
6908 CertVerifyResult verify_result;
6909 verify_result.verified_cert = cert;
6910 verify_result.is_issued_by_known_root = true;
6911 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6912
6913 // Set up a DoNothingCTVerifier and MockCTPolicyEnforcer to simulate CT
6914 // compliance.
6915 DoNothingCTVerifier ct_verifier;
6916 MockCTPolicyEnforcer ct_policy_enforcer;
6917 ct_policy_enforcer.set_default_result(
Emily Stark627238f2017-11-29 03:29:546918 ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS);
Emily Stark4cfecf072017-08-08 01:05:516919
6920 TestNetworkDelegate network_delegate;
6921 // Use a MockHostResolver (which by default maps all hosts to
6922 // 127.0.0.1).
6923 MockHostResolver host_resolver;
6924 TestURLRequestContext context(true);
6925 context.set_host_resolver(&host_resolver);
6926 context.set_transport_security_state(&transport_security_state);
6927 context.set_network_delegate(&network_delegate);
6928 context.set_cert_verifier(&cert_verifier);
6929 context.set_cert_transparency_verifier(&ct_verifier);
6930 context.set_ct_policy_enforcer(&ct_policy_enforcer);
6931 context.Init();
6932
6933 // Now send a request to trigger the header processing.
6934 TestDelegate d;
6935 GURL url = https_test_server.GetURL("/expect-ct-header.html");
6936 std::unique_ptr<URLRequest> request(context.CreateRequest(
6937 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
6938 request->Start();
6939 base::RunLoop().Run();
6940
6941 TransportSecurityState::ExpectCTState state;
6942 ASSERT_TRUE(
6943 transport_security_state.GetDynamicExpectCTState(url.host(), &state));
6944 EXPECT_TRUE(state.enforce);
6945 EXPECT_EQ(GURL("https://example.test"), state.report_uri);
6946}
6947
6948// Tests that if multiple Expect CT HTTP headers are sent, they are all
6949// processed.
6950TEST_F(URLRequestTestHTTP, MultipleExpectCTHeaders) {
6951 base::test::ScopedFeatureList feature_list;
6952 feature_list.InitAndEnableFeature(
6953 TransportSecurityState::kDynamicExpectCTFeature);
6954
6955 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6956 https_test_server.SetSSLConfig(
6957 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6958 https_test_server.ServeFilesFromSourceDirectory(
6959 base::FilePath(kTestFilePath));
6960 ASSERT_TRUE(https_test_server.Start());
6961
6962 MockExpectCTReporter reporter;
6963 TransportSecurityState transport_security_state;
6964 transport_security_state.SetExpectCTReporter(&reporter);
6965
6966 // Set up a MockCertVerifier to accept the certificate that the server sends.
6967 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6968 ASSERT_TRUE(cert);
6969 MockCertVerifier cert_verifier;
6970 CertVerifyResult verify_result;
6971 verify_result.verified_cert = cert;
6972 verify_result.is_issued_by_known_root = true;
6973 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6974
6975 // Set up a DoNothingCTVerifier and MockCTPolicyEnforcer to simulate CT
6976 // compliance.
6977 DoNothingCTVerifier ct_verifier;
6978 MockCTPolicyEnforcer ct_policy_enforcer;
6979 ct_policy_enforcer.set_default_result(
Emily Stark627238f2017-11-29 03:29:546980 ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS);
Emily Stark4cfecf072017-08-08 01:05:516981
6982 TestNetworkDelegate network_delegate;
6983 // Use a MockHostResolver (which by default maps all hosts to
6984 // 127.0.0.1).
6985 MockHostResolver host_resolver;
6986 TestURLRequestContext context(true);
6987 context.set_host_resolver(&host_resolver);
6988 context.set_transport_security_state(&transport_security_state);
6989 context.set_network_delegate(&network_delegate);
6990 context.set_cert_verifier(&cert_verifier);
6991 context.set_cert_transparency_verifier(&ct_verifier);
6992 context.set_ct_policy_enforcer(&ct_policy_enforcer);
6993 context.Init();
6994
6995 // Now send a request to trigger the header processing.
6996 TestDelegate d;
6997 GURL url = https_test_server.GetURL("/expect-ct-header-multiple.html");
6998 std::unique_ptr<URLRequest> request(context.CreateRequest(
6999 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7000 request->Start();
7001 base::RunLoop().Run();
7002
7003 TransportSecurityState::ExpectCTState state;
7004 ASSERT_TRUE(
7005 transport_security_state.GetDynamicExpectCTState(url.host(), &state));
7006 EXPECT_TRUE(state.enforce);
7007 EXPECT_EQ(GURL("https://example.test"), state.report_uri);
7008}
7009
mmenkefd9d15c2017-06-29 13:45:547010#endif // !defined(OS_IOS)
estark1614475f2016-03-10 03:46:477011
mmenkefd9d15c2017-06-29 13:45:547012#if BUILDFLAG(ENABLE_REPORTING)
juliatuttle2b8dd2d12017-04-12 21:27:417013namespace {
7014
7015class TestReportingService : public ReportingService {
7016 public:
7017 struct Header {
7018 GURL url;
7019 std::string header_value;
7020 };
7021
juliatuttle2b8dd2d12017-04-12 21:27:417022 const std::vector<Header>& headers() { return headers_; }
7023
juliatuttle1d92f0152017-04-28 17:19:217024 // ReportingService implementation:
7025
Chris Watkins7a41d3552017-12-01 02:13:277026 ~TestReportingService() override = default;
juliatuttle1d92f0152017-04-28 17:19:217027
juliatuttle2b8dd2d12017-04-12 21:27:417028 void QueueReport(const GURL& url,
7029 const std::string& group,
7030 const std::string& type,
7031 std::unique_ptr<const base::Value> body) override {
7032 NOTIMPLEMENTED();
7033 }
7034
7035 void ProcessHeader(const GURL& url,
7036 const std::string& header_value) override {
7037 headers_.push_back({url, header_value});
7038 }
7039
juliatuttleaeb1abc2017-05-04 21:14:387040 void RemoveBrowsingData(
7041 int data_type_mask,
7042 base::Callback<bool(const GURL&)> origin_filter) override {
7043 NOTIMPLEMENTED();
7044 }
7045
juliatuttle2b8dd2d12017-04-12 21:27:417046 private:
7047 std::vector<Header> headers_;
7048};
7049
7050std::unique_ptr<test_server::HttpResponse> SendReportToHeader(
7051 const test_server::HttpRequest& request) {
7052 std::unique_ptr<test_server::BasicHttpResponse> http_response(
7053 new test_server::BasicHttpResponse);
7054 http_response->set_code(HTTP_OK);
7055 http_response->AddCustomHeader("Report-To", "foo");
7056 http_response->AddCustomHeader("Report-To", "bar");
7057 return std::move(http_response);
7058}
7059
7060} // namespace
7061
7062TEST_F(URLRequestTestHTTP, DontProcessReportToHeaderNoService) {
7063 http_test_server()->RegisterRequestHandler(base::Bind(&SendReportToHeader));
7064 ASSERT_TRUE(http_test_server()->Start());
7065 GURL request_url = http_test_server()->GetURL("/");
7066
7067 TestNetworkDelegate network_delegate;
7068 TestURLRequestContext context(true);
7069 context.set_network_delegate(&network_delegate);
7070 context.Init();
7071
7072 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167073 std::unique_ptr<URLRequest> request(context.CreateRequest(
7074 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417075 request->Start();
7076 base::RunLoop().Run();
7077}
7078
7079TEST_F(URLRequestTestHTTP, DontProcessReportToHeaderHTTP) {
7080 http_test_server()->RegisterRequestHandler(base::Bind(&SendReportToHeader));
7081 ASSERT_TRUE(http_test_server()->Start());
7082 GURL request_url = http_test_server()->GetURL("/");
7083
7084 TestNetworkDelegate network_delegate;
7085 TestReportingService reporting_service;
7086 TestURLRequestContext context(true);
7087 context.set_network_delegate(&network_delegate);
7088 context.set_reporting_service(&reporting_service);
7089 context.Init();
7090
7091 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167092 std::unique_ptr<URLRequest> request(context.CreateRequest(
7093 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417094 request->Start();
7095 base::RunLoop().Run();
7096
7097 EXPECT_TRUE(reporting_service.headers().empty());
7098}
7099
7100TEST_F(URLRequestTestHTTP, ProcessReportToHeaderHTTPS) {
7101 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7102 https_test_server.RegisterRequestHandler(base::Bind(&SendReportToHeader));
7103 ASSERT_TRUE(https_test_server.Start());
7104 GURL request_url = https_test_server.GetURL("/");
7105
7106 TestNetworkDelegate network_delegate;
7107 TestReportingService reporting_service;
7108 TestURLRequestContext context(true);
7109 context.set_network_delegate(&network_delegate);
7110 context.set_reporting_service(&reporting_service);
7111 context.Init();
7112
7113 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167114 std::unique_ptr<URLRequest> request(context.CreateRequest(
7115 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417116 request->Start();
7117 base::RunLoop().Run();
7118
7119 ASSERT_EQ(1u, reporting_service.headers().size());
7120 EXPECT_EQ(request_url, reporting_service.headers()[0].url);
7121 EXPECT_EQ("foo, bar", reporting_service.headers()[0].header_value);
7122}
7123
Julia Tuttlef9b74062017-07-27 14:44:057124TEST_F(URLRequestTestHTTP, DontProcessReportToHeaderInvalidHttps) {
juliatuttle2b8dd2d12017-04-12 21:27:417125 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7126 https_test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
7127 https_test_server.RegisterRequestHandler(base::Bind(&SendReportToHeader));
7128 ASSERT_TRUE(https_test_server.Start());
7129 GURL request_url = https_test_server.GetURL("/");
7130
7131 TestNetworkDelegate network_delegate;
7132 TestReportingService reporting_service;
7133 TestURLRequestContext context(true);
7134 context.set_network_delegate(&network_delegate);
7135 context.set_reporting_service(&reporting_service);
7136 context.Init();
7137
7138 TestDelegate d;
7139 d.set_allow_certificate_errors(true);
rhalavatib7bd7c792017-04-27 05:25:167140 std::unique_ptr<URLRequest> request(context.CreateRequest(
7141 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417142 request->Start();
7143 base::RunLoop().Run();
7144
7145 EXPECT_TRUE(d.have_certificate_errors());
7146 EXPECT_TRUE(IsCertStatusError(request->ssl_info().cert_status));
7147 EXPECT_TRUE(reporting_service.headers().empty());
7148}
Julia Tuttlefadc26d2017-10-13 18:12:297149
7150// Network Error Logging is dependent on the Reporting API, so only run NEL
7151// tests if Reporting is enabled in the build.
tommycli59a63432015-11-06 00:10:557152
Julia Tuttlef9b74062017-07-27 14:44:057153namespace {
7154
7155class TestNetworkErrorLoggingDelegate : public NetworkErrorLoggingDelegate {
7156 public:
7157 struct Header {
Chris Watkins7a41d3552017-12-01 02:13:277158 Header() = default;
7159 ~Header() = default;
Julia Tuttlef9b74062017-07-27 14:44:057160
7161 url::Origin origin;
7162 std::string value;
7163 };
7164
Julia Tuttlef9b74062017-07-27 14:44:057165 const std::vector<Header>& headers() { return headers_; }
Julia Tuttleb0d45472017-09-25 20:14:437166 const std::vector<ErrorDetails>& errors() { return errors_; }
Julia Tuttlef9b74062017-07-27 14:44:057167
7168 // NetworkErrorLoggingDelegate implementation:
7169
Chris Watkins7a41d3552017-12-01 02:13:277170 ~TestNetworkErrorLoggingDelegate() override = default;
Julia Tuttlef9b74062017-07-27 14:44:057171
7172 void SetReportingService(ReportingService* reporting_service) override {
7173 NOTREACHED();
7174 }
7175
7176 void OnHeader(const url::Origin& origin, const std::string& value) override {
7177 Header header;
7178 header.origin = origin;
7179 header.value = value;
7180 headers_.push_back(header);
7181 }
7182
Julia Tuttleb0d45472017-09-25 20:14:437183 void OnNetworkError(const ErrorDetails& details) override {
7184 errors_.push_back(details);
Julia Tuttlef9b74062017-07-27 14:44:057185 }
7186
7187 private:
7188 std::vector<Header> headers_;
Julia Tuttleb0d45472017-09-25 20:14:437189 std::vector<ErrorDetails> errors_;
Julia Tuttlef9b74062017-07-27 14:44:057190};
7191
7192std::unique_ptr<test_server::HttpResponse> SendNelHeader(
7193 const test_server::HttpRequest& request) {
7194 std::unique_ptr<test_server::BasicHttpResponse> http_response(
7195 new test_server::BasicHttpResponse);
7196 http_response->set_code(HTTP_OK);
7197 http_response->AddCustomHeader(NetworkErrorLoggingDelegate::kHeaderName,
7198 "foo");
7199 return std::move(http_response);
7200}
7201
7202} // namespace
7203
7204TEST_F(URLRequestTestHTTP, DontProcessNelHeaderNoDelegate) {
7205 http_test_server()->RegisterRequestHandler(base::Bind(&SendNelHeader));
7206 ASSERT_TRUE(http_test_server()->Start());
7207 GURL request_url = http_test_server()->GetURL("/");
7208
7209 TestNetworkDelegate network_delegate;
7210 TestURLRequestContext context(true);
7211 context.set_network_delegate(&network_delegate);
7212 context.Init();
7213
7214 TestDelegate d;
7215 std::unique_ptr<URLRequest> request(context.CreateRequest(
7216 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7217 request->Start();
7218 base::RunLoop().Run();
7219}
7220
7221TEST_F(URLRequestTestHTTP, DontProcessNelHeaderHttp) {
7222 http_test_server()->RegisterRequestHandler(base::Bind(&SendNelHeader));
7223 ASSERT_TRUE(http_test_server()->Start());
7224 GURL request_url = http_test_server()->GetURL("/");
7225
7226 TestNetworkDelegate network_delegate;
7227 TestNetworkErrorLoggingDelegate nel_delegate;
7228 TestURLRequestContext context(true);
7229 context.set_network_delegate(&network_delegate);
7230 context.set_network_error_logging_delegate(&nel_delegate);
7231 context.Init();
7232
7233 TestDelegate d;
7234 std::unique_ptr<URLRequest> request(context.CreateRequest(
7235 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7236 request->Start();
7237 base::RunLoop().Run();
7238
7239 EXPECT_TRUE(nel_delegate.headers().empty());
7240}
7241
7242TEST_F(URLRequestTestHTTP, ProcessNelHeaderHttps) {
7243 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7244 https_test_server.RegisterRequestHandler(base::Bind(&SendNelHeader));
7245 ASSERT_TRUE(https_test_server.Start());
7246 GURL request_url = https_test_server.GetURL("/");
7247
7248 TestNetworkDelegate network_delegate;
7249 TestNetworkErrorLoggingDelegate nel_delegate;
7250 TestURLRequestContext context(true);
7251 context.set_network_delegate(&network_delegate);
7252 context.set_network_error_logging_delegate(&nel_delegate);
7253 context.Init();
7254
7255 TestDelegate d;
7256 std::unique_ptr<URLRequest> request(context.CreateRequest(
7257 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7258 request->Start();
7259 base::RunLoop().Run();
7260
7261 ASSERT_EQ(1u, nel_delegate.headers().size());
Daniel Cheng88186bd52017-10-20 08:14:467262 EXPECT_EQ(url::Origin::Create(request_url), nel_delegate.headers()[0].origin);
Julia Tuttlef9b74062017-07-27 14:44:057263 EXPECT_EQ("foo", nel_delegate.headers()[0].value);
7264}
7265
7266TEST_F(URLRequestTestHTTP, DontProcessNelHeaderInvalidHttps) {
7267 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7268 https_test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
7269 https_test_server.RegisterRequestHandler(base::Bind(&SendNelHeader));
7270 ASSERT_TRUE(https_test_server.Start());
7271 GURL request_url = https_test_server.GetURL("/");
7272
7273 TestNetworkDelegate network_delegate;
7274 TestNetworkErrorLoggingDelegate nel_delegate;
7275 TestURLRequestContext context(true);
7276 context.set_network_delegate(&network_delegate);
7277 context.set_network_error_logging_delegate(&nel_delegate);
7278 context.Init();
7279
7280 TestDelegate d;
7281 d.set_allow_certificate_errors(true);
7282 std::unique_ptr<URLRequest> request(context.CreateRequest(
7283 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7284 request->Start();
7285 base::RunLoop().Run();
7286
7287 EXPECT_TRUE(d.have_certificate_errors());
7288 EXPECT_TRUE(IsCertStatusError(request->ssl_info().cert_status));
7289 EXPECT_TRUE(nel_delegate.headers().empty());
7290}
7291
Julia Tuttlefadc26d2017-10-13 18:12:297292TEST_F(URLRequestTestHTTP, DontForwardErrorToNelNoDelegate) {
7293 URLRequestFailedJob::AddUrlHandler();
7294
7295 GURL request_url =
7296 URLRequestFailedJob::GetMockHttpsUrl(ERR_CONNECTION_REFUSED);
7297
7298 TestNetworkDelegate network_delegate;
7299 TestURLRequestContext context(true);
7300 context.set_network_delegate(&network_delegate);
7301 context.Init();
7302
7303 TestDelegate d;
7304 std::unique_ptr<URLRequest> request(context.CreateRequest(
7305 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7306 request->Start();
7307 base::RunLoop().Run();
7308
7309 URLRequestFilter::GetInstance()->ClearHandlers();
7310}
7311
7312// TODO(juliatuttle): Figure out whether this restriction should be in place,
7313// and either implement it or remove this test.
7314TEST_F(URLRequestTestHTTP, DISABLED_DontForwardErrorToNelHttp) {
7315 URLRequestFailedJob::AddUrlHandler();
7316
7317 GURL request_url =
7318 URLRequestFailedJob::GetMockHttpUrl(ERR_CONNECTION_REFUSED);
7319
7320 TestNetworkDelegate network_delegate;
7321 TestNetworkErrorLoggingDelegate nel_delegate;
7322 TestURLRequestContext context(true);
7323 context.set_network_delegate(&network_delegate);
7324 context.set_network_error_logging_delegate(&nel_delegate);
7325 context.Init();
7326
7327 TestDelegate d;
7328 std::unique_ptr<URLRequest> request(context.CreateRequest(
7329 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7330 request->Start();
7331 base::RunLoop().Run();
7332
7333 EXPECT_TRUE(nel_delegate.errors().empty());
7334
7335 URLRequestFilter::GetInstance()->ClearHandlers();
7336}
7337
7338TEST_F(URLRequestTestHTTP, ForwardErrorToNelHttps) {
7339 URLRequestFailedJob::AddUrlHandler();
7340
7341 GURL request_url =
7342 URLRequestFailedJob::GetMockHttpsUrl(ERR_CONNECTION_REFUSED);
7343
7344 TestNetworkDelegate network_delegate;
7345 TestNetworkErrorLoggingDelegate nel_delegate;
7346 TestURLRequestContext context(true);
7347 context.set_network_delegate(&network_delegate);
7348 context.set_network_error_logging_delegate(&nel_delegate);
7349 context.Init();
7350
7351 TestDelegate d;
7352 std::unique_ptr<URLRequest> request(context.CreateRequest(
7353 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7354 request->Start();
7355 base::RunLoop().Run();
7356
7357 ASSERT_EQ(1u, nel_delegate.errors().size());
7358 EXPECT_EQ(request_url, nel_delegate.errors()[0].uri);
7359 EXPECT_EQ(0, nel_delegate.errors()[0].status_code);
7360 EXPECT_EQ(ERR_CONNECTION_REFUSED, nel_delegate.errors()[0].type);
7361
7362 URLRequestFilter::GetInstance()->ClearHandlers();
7363}
7364
7365#endif // BUILDFLAG(ENABLE_REPORTING)
7366
[email protected]316c1e5e2012-09-12 15:17:447367TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) {
tommycli59a63432015-11-06 00:10:557368 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447369
7370 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367371 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557372 http_test_server()->GetURL("/content-type-normalization.html"),
rhalavatib7bd7c792017-04-27 05:25:167373 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197374 req->Start();
[email protected]255620da2013-08-19 13:14:297375 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447376
7377 std::string mime_type;
[email protected]f7022f32014-08-21 16:32:197378 req->GetMimeType(&mime_type);
[email protected]316c1e5e2012-09-12 15:17:447379 EXPECT_EQ("text/html", mime_type);
7380
7381 std::string charset;
[email protected]f7022f32014-08-21 16:32:197382 req->GetCharset(&charset);
[email protected]316c1e5e2012-09-12 15:17:447383 EXPECT_EQ("utf-8", charset);
[email protected]f7022f32014-08-21 16:32:197384 req->Cancel();
[email protected]316c1e5e2012-09-12 15:17:447385}
7386
[email protected]02494ec2014-05-07 15:05:297387TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictDataRedirects) {
[email protected]e0f35c92013-05-08 16:04:347388 // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget().
[email protected]e0f35c92013-05-08 16:04:347389 GURL data_url("data:,foo");
[email protected]e0f35c92013-05-08 16:04:347390 DataProtocolHandler data_protocol_handler;
[email protected]588614c22013-08-16 00:09:027391 EXPECT_FALSE(data_protocol_handler.IsSafeRedirectTarget(data_url));
[email protected]e0f35c92013-05-08 16:04:347392
7393 // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget().
bengr1bf8e942014-11-07 01:36:507394 EXPECT_FALSE(job_factory_->IsSafeRedirectTarget(data_url));
[email protected]e0f35c92013-05-08 16:04:347395}
7396
brettwa1228ebb2016-10-28 03:51:347397#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]02494ec2014-05-07 15:05:297398TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictFileRedirects) {
7399 // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget().
7400 GURL file_url("file:///foo.txt");
skyostil4891b25b2015-06-11 11:43:457401 FileProtocolHandler file_protocol_handler(
7402 base::ThreadTaskRunnerHandle::Get());
[email protected]02494ec2014-05-07 15:05:297403 EXPECT_FALSE(file_protocol_handler.IsSafeRedirectTarget(file_url));
7404
7405 // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget().
bengr1bf8e942014-11-07 01:36:507406 EXPECT_FALSE(job_factory_->IsSafeRedirectTarget(file_url));
[email protected]02494ec2014-05-07 15:05:297407}
7408
[email protected]588614c22013-08-16 00:09:027409TEST_F(URLRequestTestHTTP, RestrictFileRedirects) {
tommycli59a63432015-11-06 00:10:557410 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447411
7412 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367413 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557414 http_test_server()->GetURL("/redirect-to-file.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167415 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197416 req->Start();
[email protected]255620da2013-08-19 13:14:297417 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447418
maksim.sisovb53724b52016-09-16 05:30:507419 EXPECT_EQ(ERR_UNSAFE_REDIRECT, d.request_status());
davidbend894710b2017-06-06 19:28:307420
7421 // The redirect should have been rejected before reporting it to the caller.
7422 EXPECT_EQ(0, d.received_redirect_count());
[email protected]316c1e5e2012-09-12 15:17:447423}
brettwa1228ebb2016-10-28 03:51:347424#endif // !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]316c1e5e2012-09-12 15:17:447425
[email protected]588614c22013-08-16 00:09:027426TEST_F(URLRequestTestHTTP, RestrictDataRedirects) {
tommycli59a63432015-11-06 00:10:557427 ASSERT_TRUE(http_test_server()->Start());
[email protected]588614c22013-08-16 00:09:027428
7429 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367430 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557431 http_test_server()->GetURL("/redirect-to-data.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167432 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197433 req->Start();
fdoray5eeb7642016-06-22 16:11:287434 base::RunLoop().Run();
[email protected]588614c22013-08-16 00:09:027435
maksim.sisovb53724b52016-09-16 05:30:507436 EXPECT_EQ(ERR_UNSAFE_REDIRECT, d.request_status());
davidbend894710b2017-06-06 19:28:307437
7438 // The redirect should have been rejected before reporting it to the
7439 // caller. See https://crbug.com/723796
7440 EXPECT_EQ(0, d.received_redirect_count());
[email protected]588614c22013-08-16 00:09:027441}
7442
davidbend894710b2017-06-06 19:28:307443// Test that redirects to invalid URLs are rejected. See
7444// https://crbug.com/462272.
[email protected]316c1e5e2012-09-12 15:17:447445TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) {
tommycli59a63432015-11-06 00:10:557446 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447447
7448 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367449 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557450 http_test_server()->GetURL("/redirect-to-invalid-url.html"),
rhalavatib7bd7c792017-04-27 05:25:167451 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197452 req->Start();
[email protected]255620da2013-08-19 13:14:297453 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447454
davidbend894710b2017-06-06 19:28:307455 EXPECT_EQ(1, d.response_started_count());
7456 EXPECT_EQ(ERR_INVALID_REDIRECT, d.request_status());
7457
7458 // The redirect should have been rejected before reporting it to the caller.
7459 EXPECT_EQ(0, d.received_redirect_count());
[email protected]316c1e5e2012-09-12 15:17:447460}
7461
[email protected]e50efea2014-03-24 18:41:007462// Make sure redirects are cached, despite not reading their bodies.
7463TEST_F(URLRequestTestHTTP, CacheRedirect) {
tommycli59a63432015-11-06 00:10:557464 ASSERT_TRUE(http_test_server()->Start());
[email protected]e50efea2014-03-24 18:41:007465 GURL redirect_url =
tommycli59a63432015-11-06 00:10:557466 http_test_server()->GetURL("/redirect302-to-echo-cacheable");
[email protected]e50efea2014-03-24 18:41:007467
7468 {
7469 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167470 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7471 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197472 req->Start();
[email protected]e50efea2014-03-24 18:41:007473 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:507474 EXPECT_EQ(OK, d.request_status());
[email protected]e50efea2014-03-24 18:41:007475 EXPECT_EQ(1, d.received_redirect_count());
tommycli59a63432015-11-06 00:10:557476 EXPECT_EQ(http_test_server()->GetURL("/echo"), req->url());
[email protected]e50efea2014-03-24 18:41:007477 }
7478
7479 {
7480 TestDelegate d;
7481 d.set_quit_on_redirect(true);
rhalavatib7bd7c792017-04-27 05:25:167482 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7483 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197484 req->Start();
[email protected]e50efea2014-03-24 18:41:007485 base::RunLoop().Run();
7486
7487 EXPECT_EQ(1, d.received_redirect_count());
7488 EXPECT_EQ(0, d.response_started_count());
[email protected]f7022f32014-08-21 16:32:197489 EXPECT_TRUE(req->was_cached());
[email protected]e50efea2014-03-24 18:41:007490
[email protected]f7022f32014-08-21 16:32:197491 req->FollowDeferredRedirect();
[email protected]e50efea2014-03-24 18:41:007492 base::RunLoop().Run();
7493 EXPECT_EQ(1, d.received_redirect_count());
7494 EXPECT_EQ(1, d.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:507495 EXPECT_EQ(OK, d.request_status());
tommycli59a63432015-11-06 00:10:557496 EXPECT_EQ(http_test_server()->GetURL("/echo"), req->url());
[email protected]e50efea2014-03-24 18:41:007497 }
7498}
7499
7500// Make sure a request isn't cached when a NetworkDelegate forces a redirect
7501// when the headers are read, since the body won't have been read.
7502TEST_F(URLRequestTestHTTP, NoCacheOnNetworkDelegateRedirect) {
tommycli59a63432015-11-06 00:10:557503 ASSERT_TRUE(http_test_server()->Start());
[email protected]e50efea2014-03-24 18:41:007504 // URL that is normally cached.
tommycli59a63432015-11-06 00:10:557505 GURL initial_url = http_test_server()->GetURL("/cachetime");
[email protected]e50efea2014-03-24 18:41:007506
7507 {
7508 // Set up the TestNetworkDelegate tp force a redirect.
tommycli59a63432015-11-06 00:10:557509 GURL redirect_to_url = http_test_server()->GetURL("/echo");
[email protected]e50efea2014-03-24 18:41:007510 default_network_delegate_.set_redirect_on_headers_received_url(
7511 redirect_to_url);
7512
7513 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167514 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7515 initial_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197516 req->Start();
[email protected]e50efea2014-03-24 18:41:007517 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:507518 EXPECT_EQ(OK, d.request_status());
[email protected]e50efea2014-03-24 18:41:007519 EXPECT_EQ(1, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:197520 EXPECT_EQ(redirect_to_url, req->url());
[email protected]e50efea2014-03-24 18:41:007521 }
7522
7523 {
7524 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167525 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7526 initial_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197527 req->Start();
[email protected]e50efea2014-03-24 18:41:007528 base::RunLoop().Run();
7529
maksim.sisovb53724b52016-09-16 05:30:507530 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197531 EXPECT_FALSE(req->was_cached());
[email protected]e50efea2014-03-24 18:41:007532 EXPECT_EQ(0, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:197533 EXPECT_EQ(initial_url, req->url());
[email protected]e50efea2014-03-24 18:41:007534 }
7535}
7536
[email protected]5f714132014-03-26 10:41:167537// Tests that redirection to an unsafe URL is allowed when it has been marked as
7538// safe.
7539TEST_F(URLRequestTestHTTP, UnsafeRedirectToWhitelistedUnsafeURL) {
tommycli59a63432015-11-06 00:10:557540 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167541
7542 GURL unsafe_url("data:text/html,this-is-considered-an-unsafe-url");
7543 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
7544 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
7545
7546 TestDelegate d;
7547 {
danakj8522a25b2016-04-16 00:17:367548 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167549 http_test_server()->GetURL("/whatever"), DEFAULT_PRIORITY, &d,
7550 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167551
[email protected]f7022f32014-08-21 16:32:197552 r->Start();
[email protected]5f714132014-03-26 10:41:167553 base::RunLoop().Run();
7554
maksim.sisovb53724b52016-09-16 05:30:507555 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197556 EXPECT_EQ(2U, r->url_chain().size());
[email protected]f7022f32014-08-21 16:32:197557 EXPECT_EQ(unsafe_url, r->url());
[email protected]5f714132014-03-26 10:41:167558 EXPECT_EQ("this-is-considered-an-unsafe-url", d.data_received());
7559 }
7560}
7561
7562// Tests that a redirect to a different unsafe URL is blocked, even after adding
7563// some other URL to the whitelist.
7564TEST_F(URLRequestTestHTTP, UnsafeRedirectToDifferentUnsafeURL) {
tommycli59a63432015-11-06 00:10:557565 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167566
7567 GURL unsafe_url("data:text/html,something");
7568 GURL different_unsafe_url("data:text/html,something-else");
7569 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
7570 default_network_delegate_.set_allowed_unsafe_redirect_url(
7571 different_unsafe_url);
7572
7573 TestDelegate d;
7574 {
danakj8522a25b2016-04-16 00:17:367575 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167576 http_test_server()->GetURL("/whatever"), DEFAULT_PRIORITY, &d,
7577 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167578
[email protected]f7022f32014-08-21 16:32:197579 r->Start();
[email protected]5f714132014-03-26 10:41:167580 base::RunLoop().Run();
7581
maksim.sisovb53724b52016-09-16 05:30:507582 EXPECT_EQ(ERR_UNSAFE_REDIRECT, d.request_status());
davidbend894710b2017-06-06 19:28:307583
7584 // The redirect should have been rejected before reporting it to the caller.
7585 EXPECT_EQ(0, d.received_redirect_count());
[email protected]5f714132014-03-26 10:41:167586 }
7587}
7588
[email protected]5f714132014-03-26 10:41:167589// Redirects from an URL with fragment to an unsafe URL with fragment should
7590// be allowed, and the reference fragment of the target URL should be preserved.
7591TEST_F(URLRequestTestHTTP, UnsafeRedirectWithDifferentReferenceFragment) {
tommycli59a63432015-11-06 00:10:557592 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167593
tommycli59a63432015-11-06 00:10:557594 GURL original_url(http_test_server()->GetURL("/original#fragment1"));
[email protected]5f714132014-03-26 10:41:167595 GURL unsafe_url("data:,url-marked-safe-and-used-in-redirect#fragment2");
7596 GURL expected_url("data:,url-marked-safe-and-used-in-redirect#fragment2");
7597
7598 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
7599 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
7600
7601 TestDelegate d;
7602 {
rhalavatib7bd7c792017-04-27 05:25:167603 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7604 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167605
[email protected]f7022f32014-08-21 16:32:197606 r->Start();
[email protected]5f714132014-03-26 10:41:167607 base::RunLoop().Run();
7608
[email protected]f7022f32014-08-21 16:32:197609 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:507610 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197611 EXPECT_EQ(original_url, r->original_url());
7612 EXPECT_EQ(expected_url, r->url());
[email protected]5f714132014-03-26 10:41:167613 }
7614}
7615
7616// When a delegate has specified a safe redirect URL, but it does not match the
7617// redirect target, then do not prevent the reference fragment from being added.
[email protected]f878230e2014-04-03 15:36:147618TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragmentAndUnrelatedUnsafeUrl) {
tommycli59a63432015-11-06 00:10:557619 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167620
tommycli59a63432015-11-06 00:10:557621 GURL original_url(http_test_server()->GetURL("/original#expected-fragment"));
[email protected]5f714132014-03-26 10:41:167622 GURL unsafe_url("data:text/html,this-url-does-not-match-redirect-url");
tommycli59a63432015-11-06 00:10:557623 GURL redirect_url(http_test_server()->GetURL("/target"));
7624 GURL expected_redirect_url(
7625 http_test_server()->GetURL("/target#expected-fragment"));
[email protected]5f714132014-03-26 10:41:167626
7627 default_network_delegate_.set_redirect_on_headers_received_url(redirect_url);
7628 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
7629
7630 TestDelegate d;
7631 {
rhalavatib7bd7c792017-04-27 05:25:167632 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7633 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167634
[email protected]f7022f32014-08-21 16:32:197635 r->Start();
[email protected]5f714132014-03-26 10:41:167636 base::RunLoop().Run();
7637
[email protected]f7022f32014-08-21 16:32:197638 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:507639 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197640 EXPECT_EQ(original_url, r->original_url());
7641 EXPECT_EQ(expected_redirect_url, r->url());
[email protected]5f714132014-03-26 10:41:167642 }
7643}
7644
[email protected]f878230e2014-04-03 15:36:147645// When a delegate has specified a safe redirect URL, assume that the redirect
7646// URL should not be changed. In particular, the reference fragment should not
7647// be modified.
7648TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragment) {
tommycli59a63432015-11-06 00:10:557649 ASSERT_TRUE(http_test_server()->Start());
[email protected]f878230e2014-04-03 15:36:147650
tommycli59a63432015-11-06 00:10:557651 GURL original_url(
7652 http_test_server()->GetURL("/original#should-not-be-appended"));
[email protected]f878230e2014-04-03 15:36:147653 GURL redirect_url("data:text/html,expect-no-reference-fragment");
7654
7655 default_network_delegate_.set_redirect_on_headers_received_url(redirect_url);
7656 default_network_delegate_.set_allowed_unsafe_redirect_url(redirect_url);
7657
7658 TestDelegate d;
7659 {
rhalavatib7bd7c792017-04-27 05:25:167660 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7661 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f878230e2014-04-03 15:36:147662
[email protected]f7022f32014-08-21 16:32:197663 r->Start();
[email protected]f878230e2014-04-03 15:36:147664 base::RunLoop().Run();
7665
[email protected]f7022f32014-08-21 16:32:197666 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:507667 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197668 EXPECT_EQ(original_url, r->original_url());
7669 EXPECT_EQ(redirect_url, r->url());
[email protected]f878230e2014-04-03 15:36:147670 }
7671}
7672
7673// When a URLRequestRedirectJob is created, the redirection must be followed and
7674// the reference fragment of the target URL must not be modified.
7675TEST_F(URLRequestTestHTTP, RedirectJobWithReferenceFragment) {
tommycli59a63432015-11-06 00:10:557676 ASSERT_TRUE(http_test_server()->Start());
[email protected]f878230e2014-04-03 15:36:147677
tommycli59a63432015-11-06 00:10:557678 GURL original_url(
7679 http_test_server()->GetURL("/original#should-not-be-appended"));
7680 GURL redirect_url(http_test_server()->GetURL("/echo"));
[email protected]f878230e2014-04-03 15:36:147681
7682 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167683 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7684 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f878230e2014-04-03 15:36:147685
danakj8522a25b2016-04-16 00:17:367686 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
[email protected]f7022f32014-08-21 16:32:197687 r.get(), &default_network_delegate_, redirect_url,
mmenkeed0498b2015-12-08 23:20:427688 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"));
7689 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]f878230e2014-04-03 15:36:147690
[email protected]f7022f32014-08-21 16:32:197691 r->Start();
[email protected]f878230e2014-04-03 15:36:147692 base::RunLoop().Run();
7693
maksim.sisovb53724b52016-09-16 05:30:507694 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197695 EXPECT_EQ(original_url, r->original_url());
7696 EXPECT_EQ(redirect_url, r->url());
[email protected]f878230e2014-04-03 15:36:147697}
7698
lizeb5120f6dc2016-02-19 09:29:447699TEST_F(URLRequestTestHTTP, UnsupportedReferrerScheme) {
7700 ASSERT_TRUE(http_test_server()->Start());
7701
7702 const std::string referrer("foobar://totally.legit.referrer");
7703 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367704 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167705 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7706 TRAFFIC_ANNOTATION_FOR_TESTS));
lizeb5120f6dc2016-02-19 09:29:447707 req->SetReferrer(referrer);
7708 req->Start();
7709 base::RunLoop().Run();
7710
7711 EXPECT_EQ(std::string("None"), d.data_received());
7712}
7713
[email protected]316c1e5e2012-09-12 15:17:447714TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) {
tommycli59a63432015-11-06 00:10:557715 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447716
7717 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367718 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167719 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7720 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197721 req->SetReferrer("http://user:[email protected]/");
7722 req->Start();
[email protected]255620da2013-08-19 13:14:297723 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447724
7725 EXPECT_EQ(std::string("http://foo.com/"), d.data_received());
7726}
7727
[email protected]99ecf6e2013-04-10 22:46:137728TEST_F(URLRequestTestHTTP, NoFragmentInReferrer) {
tommycli59a63432015-11-06 00:10:557729 ASSERT_TRUE(http_test_server()->Start());
[email protected]99ecf6e2013-04-10 22:46:137730
7731 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367732 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167733 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7734 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197735 req->SetReferrer("http://foo.com/test#fragment");
7736 req->Start();
[email protected]255620da2013-08-19 13:14:297737 base::RunLoop().Run();
[email protected]99ecf6e2013-04-10 22:46:137738
7739 EXPECT_EQ(std::string("http://foo.com/test"), d.data_received());
7740}
7741
7742TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) {
tommycli59a63432015-11-06 00:10:557743 ASSERT_TRUE(http_test_server()->Start());
[email protected]99ecf6e2013-04-10 22:46:137744
7745 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367746 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167747 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7748 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197749 req->SetReferrer("http://foo.com/test#fragment");
7750 req->SetReferrer("");
7751 req->Start();
[email protected]255620da2013-08-19 13:14:297752 base::RunLoop().Run();
[email protected]99ecf6e2013-04-10 22:46:137753
7754 EXPECT_EQ(std::string("None"), d.data_received());
7755}
7756
[email protected]316c1e5e2012-09-12 15:17:447757TEST_F(URLRequestTestHTTP, CancelRedirect) {
tommycli59a63432015-11-06 00:10:557758 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447759
7760 TestDelegate d;
7761 {
7762 d.set_cancel_in_received_redirect(true);
danakj8522a25b2016-04-16 00:17:367763 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167764 http_test_server()->GetURL("/redirect-test.html"), DEFAULT_PRIORITY, &d,
7765 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197766 req->Start();
[email protected]255620da2013-08-19 13:14:297767 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447768
7769 EXPECT_EQ(1, d.response_started_count());
7770 EXPECT_EQ(0, d.bytes_received());
7771 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507772 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:447773 }
7774}
7775
7776TEST_F(URLRequestTestHTTP, DeferredRedirect) {
tommycli59a63432015-11-06 00:10:557777 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447778
7779 TestDelegate d;
7780 {
7781 d.set_quit_on_redirect(true);
tommycli59a63432015-11-06 00:10:557782 GURL test_url(http_test_server()->GetURL("/redirect-test.html"));
rhalavatib7bd7c792017-04-27 05:25:167783 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7784 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]79e1fd62013-06-20 06:50:047785
[email protected]f7022f32014-08-21 16:32:197786 req->Start();
[email protected]255620da2013-08-19 13:14:297787 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447788
7789 EXPECT_EQ(1, d.received_redirect_count());
Shivani Sharmac18f9762017-10-23 16:43:237790 EXPECT_TRUE(d.have_full_request_headers());
7791 CheckFullRequestHeaders(d.full_request_headers(), test_url);
7792 d.ClearFullRequestHeaders();
[email protected]316c1e5e2012-09-12 15:17:447793
[email protected]f7022f32014-08-21 16:32:197794 req->FollowDeferredRedirect();
[email protected]255620da2013-08-19 13:14:297795 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447796
7797 EXPECT_EQ(1, d.response_started_count());
7798 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507799 EXPECT_EQ(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:447800
[email protected]6cdfd7f2013-02-08 20:40:157801 base::FilePath path;
[email protected]316c1e5e2012-09-12 15:17:447802 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:477803 path = path.Append(kTestFilePath);
[email protected]316c1e5e2012-09-12 15:17:447804 path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
7805
7806 std::string contents;
[email protected]82f84b92013-08-30 18:23:507807 EXPECT_TRUE(base::ReadFileToString(path, &contents));
[email protected]316c1e5e2012-09-12 15:17:447808 EXPECT_EQ(contents, d.data_received());
7809 }
7810}
7811
[email protected]79e1fd62013-06-20 06:50:047812TEST_F(URLRequestTestHTTP, DeferredRedirect_GetFullRequestHeaders) {
tommycli59a63432015-11-06 00:10:557813 ASSERT_TRUE(http_test_server()->Start());
[email protected]79e1fd62013-06-20 06:50:047814
7815 TestDelegate d;
7816 {
7817 d.set_quit_on_redirect(true);
tommycli59a63432015-11-06 00:10:557818 GURL test_url(http_test_server()->GetURL("/redirect-test.html"));
rhalavatib7bd7c792017-04-27 05:25:167819 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7820 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]79e1fd62013-06-20 06:50:047821
7822 EXPECT_FALSE(d.have_full_request_headers());
7823
[email protected]f7022f32014-08-21 16:32:197824 req->Start();
[email protected]255620da2013-08-19 13:14:297825 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:047826
7827 EXPECT_EQ(1, d.received_redirect_count());
[email protected]79e1fd62013-06-20 06:50:047828
[email protected]f7022f32014-08-21 16:32:197829 req->FollowDeferredRedirect();
[email protected]255620da2013-08-19 13:14:297830 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:047831
tommycli59a63432015-11-06 00:10:557832 GURL target_url(http_test_server()->GetURL("/with-headers.html"));
[email protected]79e1fd62013-06-20 06:50:047833 EXPECT_EQ(1, d.response_started_count());
7834 EXPECT_TRUE(d.have_full_request_headers());
7835 CheckFullRequestHeaders(d.full_request_headers(), target_url);
7836 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507837 EXPECT_EQ(OK, d.request_status());
[email protected]79e1fd62013-06-20 06:50:047838
7839 base::FilePath path;
7840 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:477841 path = path.Append(kTestFilePath);
[email protected]79e1fd62013-06-20 06:50:047842 path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
7843
7844 std::string contents;
[email protected]82f84b92013-08-30 18:23:507845 EXPECT_TRUE(base::ReadFileToString(path, &contents));
[email protected]79e1fd62013-06-20 06:50:047846 EXPECT_EQ(contents, d.data_received());
7847 }
7848}
7849
[email protected]316c1e5e2012-09-12 15:17:447850TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) {
tommycli59a63432015-11-06 00:10:557851 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447852
7853 TestDelegate d;
7854 {
7855 d.set_quit_on_redirect(true);
danakj8522a25b2016-04-16 00:17:367856 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167857 http_test_server()->GetURL("/redirect-test.html"), DEFAULT_PRIORITY, &d,
7858 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197859 req->Start();
[email protected]255620da2013-08-19 13:14:297860 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447861
7862 EXPECT_EQ(1, d.received_redirect_count());
7863
[email protected]f7022f32014-08-21 16:32:197864 req->Cancel();
[email protected]255620da2013-08-19 13:14:297865 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447866
7867 EXPECT_EQ(1, d.response_started_count());
7868 EXPECT_EQ(0, d.bytes_received());
7869 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507870 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:447871 }
7872}
7873
7874TEST_F(URLRequestTestHTTP, VaryHeader) {
tommycli59a63432015-11-06 00:10:557875 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447876
[email protected]3b23a222013-05-15 21:33:257877 // Populate the cache.
[email protected]316c1e5e2012-09-12 15:17:447878 {
7879 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367880 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557881 http_test_server()->GetURL("/echoheadercache?foo"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167882 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:447883 HttpRequestHeaders headers;
7884 headers.SetHeader("foo", "1");
[email protected]f7022f32014-08-21 16:32:197885 req->SetExtraRequestHeaders(headers);
7886 req->Start();
[email protected]255620da2013-08-19 13:14:297887 base::RunLoop().Run();
[email protected]3b23a222013-05-15 21:33:257888
7889 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:197890 req->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:257891 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
[email protected]316c1e5e2012-09-12 15:17:447892 }
7893
[email protected]3b23a222013-05-15 21:33:257894 // Expect a cache hit.
[email protected]316c1e5e2012-09-12 15:17:447895 {
7896 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367897 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557898 http_test_server()->GetURL("/echoheadercache?foo"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167899 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:447900 HttpRequestHeaders headers;
7901 headers.SetHeader("foo", "1");
[email protected]f7022f32014-08-21 16:32:197902 req->SetExtraRequestHeaders(headers);
7903 req->Start();
[email protected]255620da2013-08-19 13:14:297904 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447905
[email protected]f7022f32014-08-21 16:32:197906 EXPECT_TRUE(req->was_cached());
[email protected]3b23a222013-05-15 21:33:257907
7908 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:197909 req->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:257910 TestLoadTimingCacheHitNoNetwork(load_timing_info);
[email protected]316c1e5e2012-09-12 15:17:447911 }
7912
[email protected]3b23a222013-05-15 21:33:257913 // Expect a cache miss.
[email protected]316c1e5e2012-09-12 15:17:447914 {
7915 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367916 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557917 http_test_server()->GetURL("/echoheadercache?foo"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167918 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:447919 HttpRequestHeaders headers;
7920 headers.SetHeader("foo", "2");
[email protected]f7022f32014-08-21 16:32:197921 req->SetExtraRequestHeaders(headers);
7922 req->Start();
[email protected]255620da2013-08-19 13:14:297923 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447924
[email protected]f7022f32014-08-21 16:32:197925 EXPECT_FALSE(req->was_cached());
[email protected]3b23a222013-05-15 21:33:257926
7927 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:197928 req->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:257929 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
[email protected]316c1e5e2012-09-12 15:17:447930 }
7931}
7932
7933TEST_F(URLRequestTestHTTP, BasicAuth) {
tommycli59a63432015-11-06 00:10:557934 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447935
7936 // populate the cache
7937 {
7938 TestDelegate d;
7939 d.set_credentials(AuthCredentials(kUser, kSecret));
7940
danakj8522a25b2016-04-16 00:17:367941 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167942 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
7943 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197944 r->Start();
[email protected]316c1e5e2012-09-12 15:17:447945
[email protected]255620da2013-08-19 13:14:297946 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447947
7948 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
7949 }
7950
7951 // repeat request with end-to-end validation. since auth-basic results in a
7952 // cachable page, we expect this test to result in a 304. in which case, the
7953 // response should be fetched from the cache.
7954 {
7955 TestDelegate d;
7956 d.set_credentials(AuthCredentials(kUser, kSecret));
7957
danakj8522a25b2016-04-16 00:17:367958 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167959 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
7960 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197961 r->SetLoadFlags(LOAD_VALIDATE_CACHE);
7962 r->Start();
[email protected]316c1e5e2012-09-12 15:17:447963
[email protected]255620da2013-08-19 13:14:297964 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447965
7966 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
7967
7968 // Should be the same cached document.
[email protected]f7022f32014-08-21 16:32:197969 EXPECT_TRUE(r->was_cached());
[email protected]316c1e5e2012-09-12 15:17:447970 }
7971}
7972
7973// Check that Set-Cookie headers in 401 responses are respected.
7974// http://crbug.com/6450
7975TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) {
tommycli59a63432015-11-06 00:10:557976 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447977
7978 GURL url_requiring_auth =
tommycli59a63432015-11-06 00:10:557979 http_test_server()->GetURL("/auth-basic?set-cookie-if-challenged");
[email protected]316c1e5e2012-09-12 15:17:447980
7981 // Request a page that will give a 401 containing a Set-Cookie header.
7982 // Verify that when the transaction is restarted, it includes the new cookie.
7983 {
[email protected]ceefd7fd2012-11-29 00:36:247984 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:447985 TestURLRequestContext context(true);
7986 context.set_network_delegate(&network_delegate);
7987 context.Init();
7988
7989 TestDelegate d;
7990 d.set_credentials(AuthCredentials(kUser, kSecret));
7991
danakj8522a25b2016-04-16 00:17:367992 std::unique_ptr<URLRequest> r(
rhalavatib7bd7c792017-04-27 05:25:167993 context.CreateRequest(url_requiring_auth, DEFAULT_PRIORITY, &d,
7994 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197995 r->Start();
[email protected]316c1e5e2012-09-12 15:17:447996
[email protected]255620da2013-08-19 13:14:297997 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447998
7999 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8000
8001 // Make sure we sent the cookie in the restarted transaction.
8002 EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
8003 != std::string::npos);
8004 }
8005
8006 // Same test as above, except this time the restart is initiated earlier
8007 // (without user intervention since identity is embedded in the URL).
8008 {
[email protected]ceefd7fd2012-11-29 00:36:248009 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:448010 TestURLRequestContext context(true);
8011 context.set_network_delegate(&network_delegate);
8012 context.Init();
8013
8014 TestDelegate d;
8015
8016 GURL::Replacements replacements;
mgiuca77752c32015-02-05 07:31:188017 replacements.SetUsernameStr("user2");
8018 replacements.SetPasswordStr("secret");
[email protected]316c1e5e2012-09-12 15:17:448019 GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements);
8020
rhalavatib7bd7c792017-04-27 05:25:168021 std::unique_ptr<URLRequest> r(context.CreateRequest(
8022 url_with_identity, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198023 r->Start();
[email protected]316c1e5e2012-09-12 15:17:448024
[email protected]255620da2013-08-19 13:14:298025 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448026
8027 EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos);
8028
8029 // Make sure we sent the cookie in the restarted transaction.
8030 EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
8031 != std::string::npos);
8032 }
8033}
8034
[email protected]58e32bb2013-01-21 18:23:258035// Tests that load timing works as expected with auth and the cache.
8036TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) {
tommycli59a63432015-11-06 00:10:558037 ASSERT_TRUE(http_test_server()->Start());
[email protected]58e32bb2013-01-21 18:23:258038
8039 // populate the cache
8040 {
8041 TestDelegate d;
8042 d.set_credentials(AuthCredentials(kUser, kSecret));
8043
danakj8522a25b2016-04-16 00:17:368044 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168045 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
8046 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198047 r->Start();
[email protected]58e32bb2013-01-21 18:23:258048
[email protected]255620da2013-08-19 13:14:298049 base::RunLoop().Run();
[email protected]58e32bb2013-01-21 18:23:258050
8051 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8052
8053 LoadTimingInfo load_timing_info_before_auth;
8054 EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeAuth(
8055 &load_timing_info_before_auth));
8056 TestLoadTimingNotReused(load_timing_info_before_auth,
8057 CONNECT_TIMING_HAS_DNS_TIMES);
8058
8059 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:198060 r->GetLoadTimingInfo(&load_timing_info);
[email protected]58e32bb2013-01-21 18:23:258061 // The test server does not support keep alive sockets, so the second
8062 // request with auth should use a new socket.
8063 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
8064 EXPECT_NE(load_timing_info_before_auth.socket_log_id,
8065 load_timing_info.socket_log_id);
8066 EXPECT_LE(load_timing_info_before_auth.receive_headers_end,
8067 load_timing_info.connect_timing.connect_start);
8068 }
8069
[email protected]3b23a222013-05-15 21:33:258070 // Repeat request with end-to-end validation. Since auth-basic results in a
8071 // cachable page, we expect this test to result in a 304. In which case, the
[email protected]58e32bb2013-01-21 18:23:258072 // response should be fetched from the cache.
8073 {
8074 TestDelegate d;
8075 d.set_credentials(AuthCredentials(kUser, kSecret));
8076
danakj8522a25b2016-04-16 00:17:368077 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168078 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
8079 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198080 r->SetLoadFlags(LOAD_VALIDATE_CACHE);
8081 r->Start();
[email protected]58e32bb2013-01-21 18:23:258082
[email protected]255620da2013-08-19 13:14:298083 base::RunLoop().Run();
[email protected]58e32bb2013-01-21 18:23:258084
8085 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8086
8087 // Should be the same cached document.
[email protected]f7022f32014-08-21 16:32:198088 EXPECT_TRUE(r->was_cached());
[email protected]58e32bb2013-01-21 18:23:258089
[email protected]3b23a222013-05-15 21:33:258090 // Since there was a request that went over the wire, the load timing
8091 // information should include connection times.
[email protected]58e32bb2013-01-21 18:23:258092 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:198093 r->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:258094 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
[email protected]58e32bb2013-01-21 18:23:258095 }
8096}
8097
[email protected]316c1e5e2012-09-12 15:17:448098// In this test, we do a POST which the server will 302 redirect.
8099// The subsequent transaction should use GET, and should not send the
8100// Content-Type header.
8101// http://code.google.com/p/chromium/issues/detail?id=843
8102TEST_F(URLRequestTestHTTP, Post302RedirectGet) {
tommycli59a63432015-11-06 00:10:558103 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448104
8105 const char kData[] = "hello world";
8106
8107 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368108 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168109 http_test_server()->GetURL("/redirect-to-echoall"), DEFAULT_PRIORITY, &d,
8110 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198111 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:078112 req->set_upload(CreateSimpleUploadData(kData));
[email protected]316c1e5e2012-09-12 15:17:448113
8114 // Set headers (some of which are specific to the POST).
8115 HttpRequestHeaders headers;
8116 headers.AddHeadersFromString(
8117 "Content-Type: multipart/form-data; "
8118 "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n"
8119 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,"
8120 "text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
8121 "Accept-Language: en-US,en\r\n"
8122 "Accept-Charset: ISO-8859-1,*,utf-8\r\n"
8123 "Content-Length: 11\r\n"
8124 "Origin: http://localhost:1337/");
[email protected]f7022f32014-08-21 16:32:198125 req->SetExtraRequestHeaders(headers);
8126 req->Start();
[email protected]255620da2013-08-19 13:14:298127 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448128
8129 std::string mime_type;
[email protected]f7022f32014-08-21 16:32:198130 req->GetMimeType(&mime_type);
[email protected]316c1e5e2012-09-12 15:17:448131 EXPECT_EQ("text/html", mime_type);
8132
8133 const std::string& data = d.data_received();
8134
8135 // Check that the post-specific headers were stripped:
8136 EXPECT_FALSE(ContainsString(data, "Content-Length:"));
8137 EXPECT_FALSE(ContainsString(data, "Content-Type:"));
Yutaka Hirano957d722f2017-08-31 08:40:498138 EXPECT_FALSE(ContainsString(data, "Origin:"));
[email protected]316c1e5e2012-09-12 15:17:448139
8140 // These extra request headers should not have been stripped.
8141 EXPECT_TRUE(ContainsString(data, "Accept:"));
8142 EXPECT_TRUE(ContainsString(data, "Accept-Language:"));
8143 EXPECT_TRUE(ContainsString(data, "Accept-Charset:"));
8144}
8145
jww5fe460ff2015-03-28 00:22:518146// The following tests check that we handle mutating the request for HTTP
8147// redirects as expected.
8148// See https://crbug.com/56373, https://crbug.com/102130, and
8149// https://crbug.com/465517.
[email protected]316c1e5e2012-09-12 15:17:448150
8151TEST_F(URLRequestTestHTTP, Redirect301Tests) {
tommycli59a63432015-11-06 00:10:558152 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448153
tommycli59a63432015-11-06 00:10:558154 const GURL url = http_test_server()->GetURL("/redirect301-to-echo");
jww5fe460ff2015-03-28 00:22:518155 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558156 http_test_server()->GetURL("/redirect301-to-https");
[email protected]316c1e5e2012-09-12 15:17:448157
8158 HTTPRedirectMethodTest(url, "POST", "GET", true);
8159 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8160 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518161
8162 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8163 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
Yutaka Hirano957d722f2017-08-31 08:40:498164 HTTPRedirectOriginHeaderTest(url, "POST", "GET", std::string());
8165 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "GET",
8166 std::string());
Alex Clarke1e08882b32017-10-06 14:22:408167 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8168 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]316c1e5e2012-09-12 15:17:448169}
8170
8171TEST_F(URLRequestTestHTTP, Redirect302Tests) {
tommycli59a63432015-11-06 00:10:558172 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448173
tommycli59a63432015-11-06 00:10:558174 const GURL url = http_test_server()->GetURL("/redirect302-to-echo");
jww5fe460ff2015-03-28 00:22:518175 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558176 http_test_server()->GetURL("/redirect302-to-https");
[email protected]316c1e5e2012-09-12 15:17:448177
8178 HTTPRedirectMethodTest(url, "POST", "GET", true);
8179 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8180 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518181
8182 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8183 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
Yutaka Hirano957d722f2017-08-31 08:40:498184 HTTPRedirectOriginHeaderTest(url, "POST", "GET", std::string());
8185 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "GET",
8186 std::string());
Alex Clarke1e08882b32017-10-06 14:22:408187 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8188 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]316c1e5e2012-09-12 15:17:448189}
8190
8191TEST_F(URLRequestTestHTTP, Redirect303Tests) {
tommycli59a63432015-11-06 00:10:558192 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448193
tommycli59a63432015-11-06 00:10:558194 const GURL url = http_test_server()->GetURL("/redirect303-to-echo");
jww5fe460ff2015-03-28 00:22:518195 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558196 http_test_server()->GetURL("/redirect303-to-https");
[email protected]316c1e5e2012-09-12 15:17:448197
8198 HTTPRedirectMethodTest(url, "POST", "GET", true);
8199 HTTPRedirectMethodTest(url, "PUT", "GET", true);
8200 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518201
Alex Clarke1e08882b32017-10-06 14:22:408202 HTTPRedirectOriginHeaderTest(url, "CONNECT", "GET", std::string());
8203 HTTPRedirectOriginHeaderTest(https_redirect_url, "CONNECT", "GET",
8204 std::string());
8205 HTTPRedirectOriginHeaderTest(url, "DELETE", "GET", std::string());
8206 HTTPRedirectOriginHeaderTest(https_redirect_url, "DELETE", "GET",
8207 std::string());
jww5fe460ff2015-03-28 00:22:518208 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8209 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
Alex Clarke1e08882b32017-10-06 14:22:408210 HTTPRedirectOriginHeaderTest(url, "HEAD", "HEAD", url.GetOrigin().spec());
8211 HTTPRedirectOriginHeaderTest(https_redirect_url, "HEAD", "HEAD", "null");
8212 HTTPRedirectOriginHeaderTest(url, "OPTIONS", "GET", std::string());
8213 HTTPRedirectOriginHeaderTest(https_redirect_url, "OPTIONS", "GET",
8214 std::string());
Yutaka Hirano957d722f2017-08-31 08:40:498215 HTTPRedirectOriginHeaderTest(url, "POST", "GET", std::string());
8216 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "GET",
8217 std::string());
Alex Clarke1e08882b32017-10-06 14:22:408218 HTTPRedirectOriginHeaderTest(url, "PUT", "GET", std::string());
8219 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "GET", std::string());
[email protected]316c1e5e2012-09-12 15:17:448220}
8221
8222TEST_F(URLRequestTestHTTP, Redirect307Tests) {
tommycli59a63432015-11-06 00:10:558223 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448224
tommycli59a63432015-11-06 00:10:558225 const GURL url = http_test_server()->GetURL("/redirect307-to-echo");
jww5fe460ff2015-03-28 00:22:518226 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558227 http_test_server()->GetURL("/redirect307-to-https");
[email protected]316c1e5e2012-09-12 15:17:448228
8229 HTTPRedirectMethodTest(url, "POST", "POST", true);
8230 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8231 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518232
8233 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8234 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
8235 HTTPRedirectOriginHeaderTest(url, "POST", "POST", url.GetOrigin().spec());
8236 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "POST", "null");
Alex Clarke1e08882b32017-10-06 14:22:408237 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8238 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]316c1e5e2012-09-12 15:17:448239}
8240
[email protected]0a17aab32014-04-24 03:32:378241TEST_F(URLRequestTestHTTP, Redirect308Tests) {
tommycli59a63432015-11-06 00:10:558242 ASSERT_TRUE(http_test_server()->Start());
[email protected]0a17aab32014-04-24 03:32:378243
tommycli59a63432015-11-06 00:10:558244 const GURL url = http_test_server()->GetURL("/redirect308-to-echo");
jww5fe460ff2015-03-28 00:22:518245 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558246 http_test_server()->GetURL("/redirect308-to-https");
[email protected]0a17aab32014-04-24 03:32:378247
8248 HTTPRedirectMethodTest(url, "POST", "POST", true);
8249 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8250 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518251
8252 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8253 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
8254 HTTPRedirectOriginHeaderTest(url, "POST", "POST", url.GetOrigin().spec());
8255 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "POST", "null");
Alex Clarke1e08882b32017-10-06 14:22:408256 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8257 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]0a17aab32014-04-24 03:32:378258}
8259
8260// Make sure that 308 responses without bodies are not treated as redirects.
8261// Certain legacy apis that pre-date the response code expect this behavior
8262// (Like Google Drive).
8263TEST_F(URLRequestTestHTTP, NoRedirectOn308WithoutLocationHeader) {
tommycli59a63432015-11-06 00:10:558264 ASSERT_TRUE(http_test_server()->Start());
[email protected]0a17aab32014-04-24 03:32:378265
8266 TestDelegate d;
tommycli59a63432015-11-06 00:10:558267 const GURL url = http_test_server()->GetURL("/308-without-location-header");
[email protected]0a17aab32014-04-24 03:32:378268
rhalavatib7bd7c792017-04-27 05:25:168269 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
8270 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]0a17aab32014-04-24 03:32:378271
[email protected]f7022f32014-08-21 16:32:198272 request->Start();
[email protected]0a17aab32014-04-24 03:32:378273 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:508274 EXPECT_EQ(OK, d.request_status());
[email protected]0a17aab32014-04-24 03:32:378275 EXPECT_EQ(0, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:198276 EXPECT_EQ(308, request->response_headers()->response_code());
[email protected]0a17aab32014-04-24 03:32:378277 EXPECT_EQ("This is not a redirect.", d.data_received());
8278}
8279
[email protected]f878230e2014-04-03 15:36:148280TEST_F(URLRequestTestHTTP, Redirect302PreserveReferenceFragment) {
tommycli59a63432015-11-06 00:10:558281 ASSERT_TRUE(http_test_server()->Start());
[email protected]f878230e2014-04-03 15:36:148282
tommycli59a63432015-11-06 00:10:558283 GURL original_url(
8284 http_test_server()->GetURL("/redirect302-to-echo#fragment"));
8285 GURL expected_url(http_test_server()->GetURL("/echo#fragment"));
[email protected]f878230e2014-04-03 15:36:148286
8287 TestDelegate d;
8288 {
rhalavatib7bd7c792017-04-27 05:25:168289 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
8290 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f878230e2014-04-03 15:36:148291
[email protected]f7022f32014-08-21 16:32:198292 r->Start();
[email protected]f878230e2014-04-03 15:36:148293 base::RunLoop().Run();
8294
[email protected]f7022f32014-08-21 16:32:198295 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:508296 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:198297 EXPECT_EQ(original_url, r->original_url());
8298 EXPECT_EQ(expected_url, r->url());
[email protected]f878230e2014-04-03 15:36:148299 }
8300}
8301
[email protected]cba24642014-08-15 20:49:598302TEST_F(URLRequestTestHTTP, RedirectPreserveFirstPartyURL) {
tommycli59a63432015-11-06 00:10:558303 ASSERT_TRUE(http_test_server()->Start());
[email protected]cba24642014-08-15 20:49:598304
tommycli59a63432015-11-06 00:10:558305 GURL url(http_test_server()->GetURL("/redirect302-to-echo"));
[email protected]cba24642014-08-15 20:49:598306 GURL first_party_url("http://example.com");
8307
8308 TestDelegate d;
8309 {
rhalavatib7bd7c792017-04-27 05:25:168310 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
8311 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:468312 r->set_site_for_cookies(first_party_url);
[email protected]cba24642014-08-15 20:49:598313
[email protected]f7022f32014-08-21 16:32:198314 r->Start();
[email protected]cba24642014-08-15 20:49:598315 base::RunLoop().Run();
8316
[email protected]f7022f32014-08-21 16:32:198317 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:508318 EXPECT_EQ(OK, d.request_status());
Mike Westb85da8ed2017-08-10 14:16:468319 EXPECT_EQ(first_party_url, r->site_for_cookies());
[email protected]cba24642014-08-15 20:49:598320 }
8321}
8322
8323TEST_F(URLRequestTestHTTP, RedirectUpdateFirstPartyURL) {
tommycli59a63432015-11-06 00:10:558324 ASSERT_TRUE(http_test_server()->Start());
[email protected]cba24642014-08-15 20:49:598325
tommycli59a63432015-11-06 00:10:558326 GURL url(http_test_server()->GetURL("/redirect302-to-echo"));
[email protected]cba24642014-08-15 20:49:598327 GURL original_first_party_url("http://example.com");
tommycli59a63432015-11-06 00:10:558328 GURL expected_first_party_url(http_test_server()->GetURL("/echo"));
[email protected]cba24642014-08-15 20:49:598329
8330 TestDelegate d;
8331 {
rhalavatib7bd7c792017-04-27 05:25:168332 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
8333 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:468334 r->set_site_for_cookies(original_first_party_url);
[email protected]f7022f32014-08-21 16:32:198335 r->set_first_party_url_policy(
[email protected]cba24642014-08-15 20:49:598336 URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT);
8337
[email protected]f7022f32014-08-21 16:32:198338 r->Start();
[email protected]cba24642014-08-15 20:49:598339 base::RunLoop().Run();
8340
[email protected]f7022f32014-08-21 16:32:198341 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:508342 EXPECT_EQ(OK, d.request_status());
Mike Westb85da8ed2017-08-10 14:16:468343 EXPECT_EQ(expected_first_party_url, r->site_for_cookies());
[email protected]cba24642014-08-15 20:49:598344 }
8345}
8346
[email protected]316c1e5e2012-09-12 15:17:448347TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) {
tommycli59a63432015-11-06 00:10:558348 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448349
8350 const char kData[] = "hello world";
8351
8352 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368353 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168354 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
8355 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198356 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:078357 req->set_upload(CreateSimpleUploadData(kData));
[email protected]316c1e5e2012-09-12 15:17:448358 HttpRequestHeaders headers;
8359 headers.SetHeader(HttpRequestHeaders::kContentLength,
Brett Wilson5accd242017-11-30 22:07:328360 base::NumberToString(arraysize(kData) - 1));
[email protected]f7022f32014-08-21 16:32:198361 req->SetExtraRequestHeaders(headers);
[email protected]316c1e5e2012-09-12 15:17:448362
danakj8522a25b2016-04-16 00:17:368363 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
tommycli59a63432015-11-06 00:10:558364 req.get(), &default_network_delegate_,
8365 http_test_server()->GetURL("/echo"),
mmenkeed0498b2015-12-08 23:20:428366 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"));
8367 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]316c1e5e2012-09-12 15:17:448368
[email protected]f7022f32014-08-21 16:32:198369 req->Start();
[email protected]255620da2013-08-19 13:14:298370 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:198371 EXPECT_EQ("GET", req->method());
[email protected]316c1e5e2012-09-12 15:17:448372}
8373
8374TEST_F(URLRequestTestHTTP, InterceptPost307RedirectPost) {
tommycli59a63432015-11-06 00:10:558375 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448376
8377 const char kData[] = "hello world";
8378
8379 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368380 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168381 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
8382 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198383 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:078384 req->set_upload(CreateSimpleUploadData(kData));
[email protected]316c1e5e2012-09-12 15:17:448385 HttpRequestHeaders headers;
8386 headers.SetHeader(HttpRequestHeaders::kContentLength,
Brett Wilson5accd242017-11-30 22:07:328387 base::NumberToString(arraysize(kData) - 1));
[email protected]f7022f32014-08-21 16:32:198388 req->SetExtraRequestHeaders(headers);
[email protected]316c1e5e2012-09-12 15:17:448389
danakj8522a25b2016-04-16 00:17:368390 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
tommycli59a63432015-11-06 00:10:558391 req.get(), &default_network_delegate_,
8392 http_test_server()->GetURL("/echo"),
[email protected]7983c4a2014-03-12 01:47:098393 URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT,
mmenkeed0498b2015-12-08 23:20:428394 "Very Good Reason"));
8395 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]316c1e5e2012-09-12 15:17:448396
[email protected]f7022f32014-08-21 16:32:198397 req->Start();
[email protected]255620da2013-08-19 13:14:298398 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:198399 EXPECT_EQ("POST", req->method());
[email protected]316c1e5e2012-09-12 15:17:448400 EXPECT_EQ(kData, d.data_received());
8401}
8402
8403// Check that default A-L header is sent.
8404TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) {
tommycli59a63432015-11-06 00:10:558405 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448406
[email protected]8790210c2013-12-02 05:29:538407 StaticHttpUserAgentSettings settings("en", std::string());
[email protected]ceefd7fd2012-11-29 00:36:248408 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]316c1e5e2012-09-12 15:17:448409 TestURLRequestContext context(true);
8410 context.set_network_delegate(&network_delegate);
[email protected]ee4c30d2012-11-07 15:08:438411 context.set_http_user_agent_settings(&settings);
[email protected]316c1e5e2012-09-12 15:17:448412 context.Init();
8413
8414 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368415 std::unique_ptr<URLRequest> req(context.CreateRequest(
tommycli59a63432015-11-06 00:10:558416 http_test_server()->GetURL("/echoheader?Accept-Language"),
rhalavatib7bd7c792017-04-27 05:25:168417 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198418 req->Start();
[email protected]255620da2013-08-19 13:14:298419 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448420 EXPECT_EQ("en", d.data_received());
8421}
8422
8423// Check that an empty A-L header is not sent. http://crbug.com/77365.
8424TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) {
tommycli59a63432015-11-06 00:10:558425 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448426
[email protected]8790210c2013-12-02 05:29:538427 std::string empty_string; // Avoid most vexing parse on line below.
8428 StaticHttpUserAgentSettings settings(empty_string, empty_string);
[email protected]ceefd7fd2012-11-29 00:36:248429 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]316c1e5e2012-09-12 15:17:448430 TestURLRequestContext context(true);
8431 context.set_network_delegate(&network_delegate);
8432 context.Init();
8433 // We override the language after initialization because empty entries
8434 // get overridden by Init().
[email protected]ee4c30d2012-11-07 15:08:438435 context.set_http_user_agent_settings(&settings);
[email protected]316c1e5e2012-09-12 15:17:448436
8437 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368438 std::unique_ptr<URLRequest> req(context.CreateRequest(
tommycli59a63432015-11-06 00:10:558439 http_test_server()->GetURL("/echoheader?Accept-Language"),
rhalavatib7bd7c792017-04-27 05:25:168440 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198441 req->Start();
[email protected]255620da2013-08-19 13:14:298442 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448443 EXPECT_EQ("None", d.data_received());
8444}
8445
8446// Check that if request overrides the A-L header, the default is not appended.
8447// See http://crbug.com/20894
8448TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) {
tommycli59a63432015-11-06 00:10:558449 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448450
8451 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368452 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558453 http_test_server()->GetURL("/echoheader?Accept-Language"),
rhalavatib7bd7c792017-04-27 05:25:168454 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448455 HttpRequestHeaders headers;
8456 headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru");
[email protected]f7022f32014-08-21 16:32:198457 req->SetExtraRequestHeaders(headers);
8458 req->Start();
[email protected]255620da2013-08-19 13:14:298459 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448460 EXPECT_EQ(std::string("ru"), d.data_received());
8461}
8462
8463// Check that default A-E header is sent.
8464TEST_F(URLRequestTestHTTP, DefaultAcceptEncoding) {
tommycli59a63432015-11-06 00:10:558465 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448466
8467 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368468 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558469 http_test_server()->GetURL("/echoheader?Accept-Encoding"),
rhalavatib7bd7c792017-04-27 05:25:168470 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448471 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:198472 req->SetExtraRequestHeaders(headers);
8473 req->Start();
[email protected]255620da2013-08-19 13:14:298474 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448475 EXPECT_TRUE(ContainsString(d.data_received(), "gzip"));
8476}
8477
8478// Check that if request overrides the A-E header, the default is not appended.
8479// See http://crbug.com/47381
8480TEST_F(URLRequestTestHTTP, OverrideAcceptEncoding) {
tommycli59a63432015-11-06 00:10:558481 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448482
8483 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368484 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558485 http_test_server()->GetURL("/echoheader?Accept-Encoding"),
rhalavatib7bd7c792017-04-27 05:25:168486 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448487 HttpRequestHeaders headers;
8488 headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, "identity");
[email protected]f7022f32014-08-21 16:32:198489 req->SetExtraRequestHeaders(headers);
8490 req->Start();
[email protected]255620da2013-08-19 13:14:298491 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448492 EXPECT_FALSE(ContainsString(d.data_received(), "gzip"));
8493 EXPECT_TRUE(ContainsString(d.data_received(), "identity"));
8494}
8495
[email protected]84f05432013-03-15 01:00:128496// Check that setting the A-C header sends the proper header.
8497TEST_F(URLRequestTestHTTP, SetAcceptCharset) {
tommycli59a63432015-11-06 00:10:558498 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448499
8500 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368501 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558502 http_test_server()->GetURL("/echoheader?Accept-Charset"),
rhalavatib7bd7c792017-04-27 05:25:168503 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448504 HttpRequestHeaders headers;
8505 headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r");
[email protected]f7022f32014-08-21 16:32:198506 req->SetExtraRequestHeaders(headers);
8507 req->Start();
[email protected]255620da2013-08-19 13:14:298508 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448509 EXPECT_EQ(std::string("koi-8r"), d.data_received());
8510}
8511
8512// Check that default User-Agent header is sent.
8513TEST_F(URLRequestTestHTTP, DefaultUserAgent) {
tommycli59a63432015-11-06 00:10:558514 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448515
8516 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368517 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558518 http_test_server()->GetURL("/echoheader?User-Agent"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:168519 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198520 req->Start();
[email protected]255620da2013-08-19 13:14:298521 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:198522 EXPECT_EQ(default_context_.http_user_agent_settings()->GetUserAgent(),
[email protected]051a4b32014-01-09 04:02:378523 d.data_received());
[email protected]316c1e5e2012-09-12 15:17:448524}
8525
8526// Check that if request overrides the User-Agent header,
8527// the default is not appended.
marqf14fff8d2015-12-02 15:52:298528// TODO(crbug.com/564656) This test is flaky on iOS.
8529#if defined(OS_IOS)
8530#define MAYBE_OverrideUserAgent FLAKY_OverrideUserAgent
8531#else
8532#define MAYBE_OverrideUserAgent OverrideUserAgent
8533#endif
8534TEST_F(URLRequestTestHTTP, MAYBE_OverrideUserAgent) {
tommycli59a63432015-11-06 00:10:558535 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448536
8537 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368538 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558539 http_test_server()->GetURL("/echoheader?User-Agent"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:168540 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448541 HttpRequestHeaders headers;
8542 headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)");
[email protected]f7022f32014-08-21 16:32:198543 req->SetExtraRequestHeaders(headers);
8544 req->Start();
[email protected]255620da2013-08-19 13:14:298545 base::RunLoop().Run();
[email protected]cd6f2522014-01-16 18:27:358546 EXPECT_EQ(std::string("Lynx (textmode)"), d.data_received());
[email protected]316c1e5e2012-09-12 15:17:448547}
8548
[email protected]ee4c30d2012-11-07 15:08:438549// Check that a NULL HttpUserAgentSettings causes the corresponding empty
8550// User-Agent header to be sent but does not send the Accept-Language and
8551// Accept-Charset headers.
8552TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) {
tommycli59a63432015-11-06 00:10:558553 ASSERT_TRUE(http_test_server()->Start());
[email protected]ee4c30d2012-11-07 15:08:438554
[email protected]ceefd7fd2012-11-29 00:36:248555 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]ee4c30d2012-11-07 15:08:438556 TestURLRequestContext context(true);
8557 context.set_network_delegate(&network_delegate);
8558 context.Init();
8559 // We override the HttpUserAgentSettings after initialization because empty
8560 // entries get overridden by Init().
8561 context.set_http_user_agent_settings(NULL);
8562
8563 struct {
8564 const char* request;
8565 const char* expected_response;
tommycli59a63432015-11-06 00:10:558566 } tests[] = {{"/echoheader?Accept-Language", "None"},
8567 {"/echoheader?Accept-Charset", "None"},
8568 {"/echoheader?User-Agent", ""}};
[email protected]ee4c30d2012-11-07 15:08:438569
viettrungluue4a8b882014-10-16 06:17:388570 for (size_t i = 0; i < arraysize(tests); i++) {
[email protected]ee4c30d2012-11-07 15:08:438571 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368572 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168573 http_test_server()->GetURL(tests[i].request), DEFAULT_PRIORITY, &d,
8574 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198575 req->Start();
[email protected]255620da2013-08-19 13:14:298576 base::RunLoop().Run();
[email protected]ee4c30d2012-11-07 15:08:438577 EXPECT_EQ(tests[i].expected_response, d.data_received())
8578 << " Request = \"" << tests[i].request << "\"";
8579 }
8580}
8581
[email protected]5033ab82013-03-22 20:17:468582// Make sure that URLRequest passes on its priority updates to
8583// newly-created jobs after the first one.
8584TEST_F(URLRequestTestHTTP, SetSubsequentJobPriority) {
tommycli59a63432015-11-06 00:10:558585 ASSERT_TRUE(http_test_server()->Start());
[email protected]5033ab82013-03-22 20:17:468586
8587 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368588 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168589 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
8590 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198591 EXPECT_EQ(DEFAULT_PRIORITY, req->priority());
[email protected]5033ab82013-03-22 20:17:468592
danakj8522a25b2016-04-16 00:17:368593 std::unique_ptr<URLRequestRedirectJob> redirect_job(new URLRequestRedirectJob(
tommycli59a63432015-11-06 00:10:558594 req.get(), &default_network_delegate_,
8595 http_test_server()->GetURL("/echo"),
mmenkeed0498b2015-12-08 23:20:428596 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"));
8597 AddTestInterceptor()->set_main_intercept_job(std::move(redirect_job));
[email protected]5033ab82013-03-22 20:17:468598
[email protected]f7022f32014-08-21 16:32:198599 req->SetPriority(LOW);
8600 req->Start();
8601 EXPECT_TRUE(req->is_pending());
[email protected]5033ab82013-03-22 20:17:468602
mmenkeed0498b2015-12-08 23:20:428603 RequestPriority job_priority;
danakj8522a25b2016-04-16 00:17:368604 std::unique_ptr<URLRequestJob> job(new PriorityMonitoringURLRequestJob(
mmenkeed0498b2015-12-08 23:20:428605 req.get(), &default_network_delegate_, &job_priority));
8606 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]5033ab82013-03-22 20:17:468607
8608 // Should trigger |job| to be started.
[email protected]255620da2013-08-19 13:14:298609 base::RunLoop().Run();
mmenkeed0498b2015-12-08 23:20:428610 EXPECT_EQ(LOW, job_priority);
[email protected]5033ab82013-03-22 20:17:468611}
8612
[email protected]80abdad2014-03-15 00:20:548613// Check that creating a network request while entering/exiting suspend mode
8614// fails as it should. This is the only case where an HttpTransactionFactory
8615// does not return an HttpTransaction.
8616TEST_F(URLRequestTestHTTP, NetworkSuspendTest) {
8617 // Create a new HttpNetworkLayer that thinks it's suspended.
danakj8522a25b2016-04-16 00:17:368618 std::unique_ptr<HttpNetworkLayer> network_layer(new HttpNetworkLayer(
mmenke2281f3762015-11-02 20:38:178619 default_context_.http_transaction_factory()->GetSession()));
[email protected]80abdad2014-03-15 00:20:548620 network_layer->OnSuspend();
8621
dchengc7eeda422015-12-26 03:56:488622 HttpCache http_cache(std::move(network_layer),
zhongyi3ceab9f2017-02-04 02:06:038623 HttpCache::DefaultBackend::InMemory(0),
zhongyi4928bd52017-02-08 02:16:278624 false /* is_main_cache */);
[email protected]80abdad2014-03-15 00:20:548625
8626 TestURLRequestContext context(true);
8627 context.set_http_transaction_factory(&http_cache);
8628 context.Init();
8629
8630 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368631 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:168632 context.CreateRequest(GURL("http://127.0.0.1/"), DEFAULT_PRIORITY, &d,
8633 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198634 req->Start();
[email protected]80abdad2014-03-15 00:20:548635 base::RunLoop().Run();
8636
8637 EXPECT_TRUE(d.request_failed());
maksim.sisovb53724b52016-09-16 05:30:508638 EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, d.request_status());
[email protected]80abdad2014-03-15 00:20:548639}
8640
mmenke2281f3762015-11-02 20:38:178641namespace {
[email protected]80abdad2014-03-15 00:20:548642
mmenke2281f3762015-11-02 20:38:178643// HttpTransactionFactory that synchronously fails to create transactions.
8644class FailingHttpTransactionFactory : public HttpTransactionFactory {
8645 public:
8646 explicit FailingHttpTransactionFactory(HttpNetworkSession* network_session)
8647 : network_session_(network_session) {}
8648
Chris Watkins7a41d3552017-12-01 02:13:278649 ~FailingHttpTransactionFactory() override = default;
mmenke2281f3762015-11-02 20:38:178650
8651 // HttpTransactionFactory methods:
8652 int CreateTransaction(RequestPriority priority,
danakj8522a25b2016-04-16 00:17:368653 std::unique_ptr<HttpTransaction>* trans) override {
mmenke2281f3762015-11-02 20:38:178654 return ERR_FAILED;
8655 }
8656
8657 HttpCache* GetCache() override { return nullptr; }
8658
8659 HttpNetworkSession* GetSession() override { return network_session_; }
8660
8661 private:
8662 HttpNetworkSession* network_session_;
8663
8664 DISALLOW_COPY_AND_ASSIGN(FailingHttpTransactionFactory);
8665};
8666
8667} // namespace
8668
8669// Check that when a request that fails to create an HttpTransaction can be
8670// cancelled while the failure notification is pending, and doesn't send two
8671// failure notifications.
8672//
8673// This currently only happens when in suspend mode and there's no cache, but
8674// just use a special HttpTransactionFactory, to avoid depending on those
8675// behaviors.
8676TEST_F(URLRequestTestHTTP, NetworkCancelAfterCreateTransactionFailsTest) {
8677 FailingHttpTransactionFactory http_transaction_factory(
8678 default_context_.http_transaction_factory()->GetSession());
[email protected]80abdad2014-03-15 00:20:548679 TestURLRequestContext context(true);
mmenke2281f3762015-11-02 20:38:178680 context.set_http_transaction_factory(&http_transaction_factory);
8681 context.set_network_delegate(default_network_delegate());
[email protected]80abdad2014-03-15 00:20:548682 context.Init();
8683
8684 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368685 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:168686 context.CreateRequest(GURL("http://127.0.0.1/"), DEFAULT_PRIORITY, &d,
8687 TRAFFIC_ANNOTATION_FOR_TESTS));
mmenke2281f3762015-11-02 20:38:178688 // Don't send cookies (Collecting cookies is asynchronous, and need request to
8689 // try to create an HttpNetworkTransaction synchronously on start).
8690 req->SetLoadFlags(LOAD_DO_NOT_SEND_COOKIES);
[email protected]f7022f32014-08-21 16:32:198691 req->Start();
mmenke2281f3762015-11-02 20:38:178692 req->Cancel();
[email protected]80abdad2014-03-15 00:20:548693 base::RunLoop().Run();
mmenke2281f3762015-11-02 20:38:178694 // Run pending error task, if there is one.
8695 base::RunLoop().RunUntilIdle();
[email protected]80abdad2014-03-15 00:20:548696
8697 EXPECT_TRUE(d.request_failed());
mmenke2281f3762015-11-02 20:38:178698 EXPECT_EQ(1, d.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:508699 EXPECT_EQ(ERR_ABORTED, d.request_status());
mmenke2281f3762015-11-02 20:38:178700
8701 // NetworkDelegate should see the cancellation, but not the error.
8702 EXPECT_EQ(1, default_network_delegate()->canceled_requests());
8703 EXPECT_EQ(0, default_network_delegate()->error_count());
[email protected]80abdad2014-03-15 00:20:548704}
8705
ttuttlec0c828492015-05-15 01:25:558706TEST_F(URLRequestTestHTTP, NetworkAccessedSetOnNetworkRequest) {
tommycli59a63432015-11-06 00:10:558707 ASSERT_TRUE(http_test_server()->Start());
ttuttlec0c828492015-05-15 01:25:558708
8709 TestDelegate d;
tommycli59a63432015-11-06 00:10:558710 GURL test_url(http_test_server()->GetURL("/"));
rhalavatib7bd7c792017-04-27 05:25:168711 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
8712 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:558713
8714 req->Start();
8715 base::RunLoop().Run();
8716
8717 EXPECT_TRUE(req->response_info().network_accessed);
8718}
8719
8720TEST_F(URLRequestTestHTTP, NetworkAccessedClearOnCachedResponse) {
tommycli59a63432015-11-06 00:10:558721 ASSERT_TRUE(http_test_server()->Start());
ttuttlec0c828492015-05-15 01:25:558722
8723 // Populate the cache.
8724 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368725 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168726 http_test_server()->GetURL("/cachetime"), DEFAULT_PRIORITY, &d,
8727 TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:558728 req->Start();
8729 base::RunLoop().Run();
8730
maksim.sisovb53724b52016-09-16 05:30:508731 EXPECT_EQ(OK, d.request_status());
ttuttlec0c828492015-05-15 01:25:558732 EXPECT_TRUE(req->response_info().network_accessed);
8733 EXPECT_FALSE(req->response_info().was_cached);
8734
tommycli59a63432015-11-06 00:10:558735 req = default_context_.CreateRequest(http_test_server()->GetURL("/cachetime"),
rhalavatib7bd7c792017-04-27 05:25:168736 DEFAULT_PRIORITY, &d,
8737 TRAFFIC_ANNOTATION_FOR_TESTS);
ttuttlec0c828492015-05-15 01:25:558738 req->Start();
8739 base::RunLoop().Run();
8740
maksim.sisovb53724b52016-09-16 05:30:508741 EXPECT_EQ(OK, d.request_status());
ttuttlec0c828492015-05-15 01:25:558742 EXPECT_FALSE(req->response_info().network_accessed);
8743 EXPECT_TRUE(req->response_info().was_cached);
8744}
8745
8746TEST_F(URLRequestTestHTTP, NetworkAccessedClearOnLoadOnlyFromCache) {
tommycli59a63432015-11-06 00:10:558747 ASSERT_TRUE(http_test_server()->Start());
ttuttlec0c828492015-05-15 01:25:558748
8749 TestDelegate d;
tommycli59a63432015-11-06 00:10:558750 GURL test_url(http_test_server()->GetURL("/"));
rhalavatib7bd7c792017-04-27 05:25:168751 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
8752 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
jkarlina067deed2016-10-27 14:48:338753 req->SetLoadFlags(LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION);
ttuttlec0c828492015-05-15 01:25:558754
8755 req->Start();
8756 base::RunLoop().Run();
8757
8758 EXPECT_FALSE(req->response_info().network_accessed);
8759}
8760
rdsmithbf8c3c12016-11-18 18:16:248761// Test that a single job with a THROTTLED priority completes
rdsmith5eb6fbc2016-10-21 17:36:088762// correctly in the absence of contention.
8763TEST_F(URLRequestTestHTTP, ThrottledPriority) {
8764 ASSERT_TRUE(http_test_server()->Start());
8765
8766 TestDelegate d;
8767 GURL test_url(http_test_server()->GetURL("/"));
rhalavatib7bd7c792017-04-27 05:25:168768 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
8769 test_url, THROTTLED, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmith5eb6fbc2016-10-21 17:36:088770 req->Start();
8771 base::RunLoop().Run();
8772
8773 EXPECT_TRUE(req->status().is_success());
8774}
8775
rdsmithbf8c3c12016-11-18 18:16:248776// A class to hold state for responding to USER_NOTIFY callbacks from
8777// BlockingNetworkDelegate. It also accepts a RunLoop that will be
8778// signaled via QuitWhenIdle() when any request is blocked.
8779//
8780class NotificationCallbackHandler {
8781 public:
8782 // Default constructed object doesn't block anything.
8783 NotificationCallbackHandler() : run_loop_(nullptr) {}
8784
8785 void AddURLRequestToBlockList(const URLRequest* request) {
8786 requests_to_block_.insert(request);
8787 }
8788
8789 Error ShouldBlockRequest(const CompletionCallback& callback,
8790 const URLRequest* request) {
8791 if (requests_to_block_.find(request) == requests_to_block_.end()) {
8792 return OK;
8793 }
8794
8795 DCHECK(blocked_callbacks_.find(request) == blocked_callbacks_.end());
8796 blocked_callbacks_[request] = callback;
8797 if (run_loop_ && blocked_callbacks_.size() == requests_to_block_.size())
8798 run_loop_->QuitWhenIdle();
8799 return ERR_IO_PENDING;
8800 }
8801
8802 // Erases object's memory of blocked callbacks as a side effect.
8803 void GetBlockedCallbacks(
8804 std::map<const URLRequest*, CompletionCallback>* blocked_callbacks) {
8805 blocked_callbacks_.swap(*blocked_callbacks);
8806 }
8807
8808 // Set a RunLoop that, if non-null, will be signaled if any request
8809 // is blocked. It is the callers responsibility to make sure the
8810 // passed object lives past the destruction of this class or
8811 // next call to SetRunLoop().
8812 void SetRunLoop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
8813
8814 private:
8815 std::set<const URLRequest*> requests_to_block_;
8816 std::map<const URLRequest*, CompletionCallback> blocked_callbacks_;
8817
8818 base::RunLoop* run_loop_;
8819
8820 DISALLOW_COPY_AND_ASSIGN(NotificationCallbackHandler);
8821};
8822
8823TEST_F(URLRequestTestHTTP, MultiThrottledPriority) {
8824 ASSERT_TRUE(http_test_server()->Start());
8825
8826 base::RunLoop run_until_request_blocked;
8827
8828 NotificationCallbackHandler notification_handler;
8829 notification_handler.SetRunLoop(&run_until_request_blocked);
8830 BlockingNetworkDelegate network_delegate(
8831 BlockingNetworkDelegate::USER_NOTIFY);
8832 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
8833 network_delegate.set_notification_callback(
8834 base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
8835 // Both objects are owned by this function, and
8836 // |*network_delegate| will be destroyed first, so
8837 // it's safe to pass it an unretained pointer.
8838 base::Unretained(&notification_handler)));
8839
8840 TestURLRequestContext context(true);
8841 context.set_network_delegate(&network_delegate);
8842 context.Init();
8843
8844 // Use different test URLs to make sure all three requests turn into
8845 // HttpNetworkTransacations. Use different URLRequest::Delegates so that
8846 // the requests may be waited on separately.
8847 TestDelegate d1;
rhalavatib7bd7c792017-04-27 05:25:168848 std::unique_ptr<URLRequest> req1(
8849 context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
8850 &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248851 notification_handler.AddURLRequestToBlockList(req1.get());
8852
8853 TestDelegate d2;
rhalavatib7bd7c792017-04-27 05:25:168854 std::unique_ptr<URLRequest> req2(
8855 context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
8856 &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248857 notification_handler.AddURLRequestToBlockList(req2.get());
8858
8859 TestDelegate d3;
rhalavatib7bd7c792017-04-27 05:25:168860 std::unique_ptr<URLRequest> req3(
8861 context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
8862 &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248863 req1->Start();
8864 req2->Start();
8865 req3->Start();
8866 run_until_request_blocked.Run();
8867 notification_handler.SetRunLoop(nullptr);
8868
8869 // The first two requests should be blocked based on the notification
8870 // callback, and their status should have blocked the third request
8871 // through throttling.
8872 EXPECT_TRUE(req1->status().is_io_pending());
8873 EXPECT_TRUE(req2->status().is_io_pending());
8874 EXPECT_TRUE(req3->status().is_io_pending());
8875
8876 std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
8877 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
8878 ASSERT_EQ(2u, blocked_callbacks.size());
8879 ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
8880 ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
8881
8882 // Unblocking one of the requests blocked on the notification callback
8883 // should let it complete, which should then let the third request
8884 // complete. Unblock the second request, then wait for the third
8885 // request to complete.
8886 // TODO(rdsmith): Find something to wait on other than the third
8887 // requests completion; if there's a bug in throttling, that will
8888 // result in this test hanging rather than failing quickly.
8889 d1.set_quit_on_complete(false);
8890 d2.set_quit_on_complete(false);
8891 d3.set_quit_on_complete(true);
8892 blocked_callbacks[req2.get()].Run(OK);
8893 base::RunLoop().Run();
8894
8895 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
8896 EXPECT_EQ(0u, blocked_callbacks.size());
8897 EXPECT_TRUE(req1->status().is_io_pending());
8898 // req3 is only unblocked after req2 completes, so req2's
8899 // success is guaranteed at this point in the function.
8900 EXPECT_EQ(URLRequestStatus::SUCCESS, req2->status().status());
8901 EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
8902}
8903
8904// Confirm that failing a request unblocks following requests.
8905TEST_F(URLRequestTestHTTP, ThrottledFailure) {
8906 ASSERT_TRUE(http_test_server()->Start());
8907
8908 base::RunLoop run_until_request_blocked;
8909
8910 NotificationCallbackHandler notification_handler;
8911 notification_handler.SetRunLoop(&run_until_request_blocked);
8912 BlockingNetworkDelegate network_delegate(
8913 BlockingNetworkDelegate::USER_NOTIFY);
8914 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
8915 network_delegate.set_notification_callback(
8916 base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
8917 // Both objects are owned by this function, and
8918 // |*network_delegate| will be destroyed first, so
8919 // it's safe to pass it an unretained pointer.
8920 base::Unretained(&notification_handler)));
8921
8922 TestURLRequestContext context(true);
8923 context.set_network_delegate(&network_delegate);
8924 context.Init();
8925
8926 // Use different test URLs to make sure all three requests turn into
8927 // HttpNetworkTransacations. Use different URLRequest::Delegates so that
8928 // the requests may be waited on separately.
8929 TestDelegate d1;
rhalavatib7bd7c792017-04-27 05:25:168930 std::unique_ptr<URLRequest> req1(
8931 context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
8932 &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248933 notification_handler.AddURLRequestToBlockList(req1.get());
8934
8935 TestDelegate d2;
rhalavatib7bd7c792017-04-27 05:25:168936 std::unique_ptr<URLRequest> req2(
8937 context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
8938 &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248939 notification_handler.AddURLRequestToBlockList(req2.get());
8940
8941 TestDelegate d3;
rhalavatib7bd7c792017-04-27 05:25:168942 std::unique_ptr<URLRequest> req3(
8943 context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
8944 &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248945 req1->Start();
8946 req2->Start();
8947 req3->Start();
8948 run_until_request_blocked.Run();
8949 notification_handler.SetRunLoop(nullptr);
8950
8951 // The first two requests should be blocked based on the notification
8952 // callback, and their status should have blocked the third request
8953 // through throttling.
8954 EXPECT_TRUE(req1->status().is_io_pending());
8955 EXPECT_TRUE(req2->status().is_io_pending());
8956 EXPECT_TRUE(req3->status().is_io_pending());
8957
8958 std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
8959 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
8960 ASSERT_EQ(2u, blocked_callbacks.size());
8961 ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
8962 ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
8963
8964 // Confirm canceling one of the outstanding requests allows the
8965 // blocked request to complete.
8966
8967 // TODO(rdsmith): Find something to wait on other than the third
8968 // requests completion; if there's a bug in throttling, that will
8969 // result in this test hanging rather than failing quickly.
8970 d1.set_quit_on_complete(false);
8971 d2.set_quit_on_complete(false);
8972 d3.set_quit_on_complete(true);
8973 req2->Cancel();
8974 base::RunLoop().Run();
8975
8976 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
8977 EXPECT_EQ(0u, blocked_callbacks.size());
8978 EXPECT_TRUE(req1->status().is_io_pending());
8979 EXPECT_EQ(URLRequestStatus::CANCELED, req2->status().status());
8980 EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
8981}
8982
8983TEST_F(URLRequestTestHTTP, ThrottledRepriUnblock) {
8984 ASSERT_TRUE(http_test_server()->Start());
8985
8986 base::RunLoop run_until_request_blocked;
8987
8988 NotificationCallbackHandler notification_handler;
8989 notification_handler.SetRunLoop(&run_until_request_blocked);
8990 BlockingNetworkDelegate network_delegate(
8991 BlockingNetworkDelegate::USER_NOTIFY);
8992 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
8993 network_delegate.set_notification_callback(
8994 base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
8995 // Both objects are owned by this function, and
8996 // |*network_delegate| will be destroyed first, so
8997 // it's safe to pass it an unretained pointer.
8998 base::Unretained(&notification_handler)));
8999
9000 TestURLRequestContext context(true);
9001 context.set_network_delegate(&network_delegate);
9002 context.Init();
9003
9004 // Use different test URLs to make sure all three requests turn into
9005 // HttpNetworkTransacations. Use different URLRequest::Delegates so that
9006 // the requests may be waited on separately.
9007 TestDelegate d1;
rhalavatib7bd7c792017-04-27 05:25:169008 std::unique_ptr<URLRequest> req1(
9009 context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
9010 &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249011 notification_handler.AddURLRequestToBlockList(req1.get());
9012
9013 TestDelegate d2;
rhalavatib7bd7c792017-04-27 05:25:169014 std::unique_ptr<URLRequest> req2(
9015 context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
9016 &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249017 notification_handler.AddURLRequestToBlockList(req2.get());
9018
9019 TestDelegate d3;
rhalavatib7bd7c792017-04-27 05:25:169020 std::unique_ptr<URLRequest> req3(
9021 context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
9022 &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249023 req1->Start();
9024 req2->Start();
9025 req3->Start();
9026 run_until_request_blocked.Run();
9027 notification_handler.SetRunLoop(nullptr);
9028
9029 // The first two requests should be blocked based on the notification
9030 // callback, and their status should have blocked the third request
9031 // through throttling.
9032 EXPECT_TRUE(req1->status().is_io_pending());
9033 EXPECT_TRUE(req2->status().is_io_pending());
9034 EXPECT_TRUE(req3->status().is_io_pending());
9035
9036 std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
9037 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
9038 ASSERT_EQ(2u, blocked_callbacks.size());
9039 ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
9040 ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
9041
9042 // Confirm raising the priority of the third request allows it to complete.
9043
9044 // TODO(rdsmith): Find something to wait on other than the third
9045 // requests completion; if there's a bug in throttling, that will
9046 // result in this test hanging rather than failing quickly.
9047 d1.set_quit_on_complete(false);
9048 d2.set_quit_on_complete(false);
9049 d3.set_quit_on_complete(true);
9050 req3->SetPriority(IDLE);
9051 base::RunLoop().Run();
9052
9053 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
9054 EXPECT_EQ(0u, blocked_callbacks.size());
9055 EXPECT_TRUE(req1->status().is_io_pending());
9056 EXPECT_TRUE(req2->status().is_io_pending());
9057 EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
9058}
9059
ricea3a1c71f2016-06-17 10:05:269060TEST_F(URLRequestTestHTTP, RawBodyBytesNoContentEncoding) {
9061 ASSERT_TRUE(http_test_server()->Start());
9062
9063 TestDelegate d;
9064 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169065 http_test_server()->GetURL("/simple.html"), DEFAULT_PRIORITY, &d,
9066 TRAFFIC_ANNOTATION_FOR_TESTS));
ricea3a1c71f2016-06-17 10:05:269067 req->Start();
9068 base::RunLoop().Run();
9069
9070 EXPECT_EQ(5, req->GetRawBodyBytes());
9071}
9072
9073TEST_F(URLRequestTestHTTP, RawBodyBytesGzipEncoding) {
9074 ASSERT_TRUE(http_test_server()->Start());
9075
9076 TestDelegate d;
9077 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169078 http_test_server()->GetURL("/gzip-encoded"), DEFAULT_PRIORITY, &d,
9079 TRAFFIC_ANNOTATION_FOR_TESTS));
ricea3a1c71f2016-06-17 10:05:269080 req->Start();
9081 base::RunLoop().Run();
9082
9083 EXPECT_EQ(30, req->GetRawBodyBytes());
9084}
9085
jamd3f5a3c2016-10-27 18:52:029086// Check that if NetworkDelegate::OnBeforeStartTransaction returns an error,
9087// the delegate isn't called back synchronously.
9088TEST_F(URLRequestTestHTTP, TesBeforeStartTransactionFails) {
9089 ASSERT_TRUE(http_test_server()->Start());
9090 default_network_delegate_.set_before_start_transaction_fails();
9091
9092 TestDelegate d;
9093 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169094 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d,
9095 TRAFFIC_ANNOTATION_FOR_TESTS));
jamd3f5a3c2016-10-27 18:52:029096 req->Start();
9097 DCHECK(!d.response_completed());
9098 base::RunLoop().Run();
9099 DCHECK(d.response_completed());
9100 EXPECT_EQ(ERR_FAILED, d.request_status());
9101}
9102
bengr1bf8e942014-11-07 01:36:509103class URLRequestInterceptorTestHTTP : public URLRequestTestHTTP {
9104 public:
9105 // TODO(bengr): Merge this with the URLRequestInterceptorHTTPTest fixture,
9106 // ideally remove the dependency on URLRequestTestJob, and maybe move these
9107 // tests into the factory tests.
9108 URLRequestInterceptorTestHTTP() : URLRequestTestHTTP(), interceptor_(NULL) {
9109 }
9110
9111 void SetUpFactory() override {
9112 interceptor_ = new MockURLRequestInterceptor();
9113 job_factory_.reset(new URLRequestInterceptingJobFactory(
danakj8522a25b2016-04-16 00:17:369114 std::move(job_factory_), base::WrapUnique(interceptor_)));
bengr1bf8e942014-11-07 01:36:509115 }
9116
9117 MockURLRequestInterceptor* interceptor() const {
9118 return interceptor_;
9119 }
9120
9121 private:
9122 MockURLRequestInterceptor* interceptor_;
9123};
9124
9125TEST_F(URLRequestInterceptorTestHTTP,
9126 NetworkDelegateNotificationOnRedirectIntercept) {
9127 interceptor()->set_intercept_redirect(true);
9128 interceptor()->set_redirect_headers(MockURLRequestInterceptor::ok_headers());
9129 interceptor()->set_redirect_data(MockURLRequestInterceptor::ok_data());
9130
tommycli59a63432015-11-06 00:10:559131 ASSERT_TRUE(http_test_server()->Start());
bengr1bf8e942014-11-07 01:36:509132
9133 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369134 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169135 http_test_server()->GetURL("/redirect-test.html"), DEFAULT_PRIORITY, &d,
9136 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:509137 req->Start();
9138 base::RunLoop().Run();
9139
9140 EXPECT_TRUE(interceptor()->did_intercept_redirect());
9141 // Check we got one good response
maksim.sisovb53724b52016-09-16 05:30:509142 int status = d.request_status();
9143 EXPECT_EQ(OK, status);
9144 if (status == OK)
bengr1bf8e942014-11-07 01:36:509145 EXPECT_EQ(200, req->response_headers()->response_code());
9146
9147 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
9148 EXPECT_EQ(1, d.response_started_count());
9149 EXPECT_EQ(0, d.received_redirect_count());
9150
9151 EXPECT_EQ(1, default_network_delegate()->created_requests());
ryansturm2343cb62016-06-15 01:09:009152 EXPECT_EQ(1, default_network_delegate()->before_start_transaction_count());
bengr1bf8e942014-11-07 01:36:509153 EXPECT_EQ(1, default_network_delegate()->headers_received_count());
9154}
9155
9156TEST_F(URLRequestInterceptorTestHTTP,
9157 NetworkDelegateNotificationOnErrorIntercept) {
9158 // Intercept that error and respond with an OK response.
9159 interceptor()->set_intercept_final_response(true);
9160 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
9161 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
9162 default_network_delegate()->set_can_be_intercepted_on_error(true);
9163
tommycli59a63432015-11-06 00:10:559164 ASSERT_TRUE(http_test_server()->Start());
bengr1bf8e942014-11-07 01:36:509165
9166 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369167 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
tommycli59a63432015-11-06 00:10:559168 http_test_server()->GetURL("/two-content-lengths.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:169169 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:509170 req->set_method("GET");
9171 req->Start();
9172 base::RunLoop().Run();
9173
9174 EXPECT_TRUE(interceptor()->did_intercept_final());
9175
9176 // Check we received one good response.
maksim.sisovb53724b52016-09-16 05:30:509177 int status = d.request_status();
9178 EXPECT_EQ(OK, status);
9179 if (status == OK)
bengr1bf8e942014-11-07 01:36:509180 EXPECT_EQ(200, req->response_headers()->response_code());
9181 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
9182 EXPECT_EQ(1, d.response_started_count());
9183 EXPECT_EQ(0, d.received_redirect_count());
9184
9185 EXPECT_EQ(1, default_network_delegate()->created_requests());
ryansturm2343cb62016-06-15 01:09:009186 EXPECT_EQ(1, default_network_delegate()->before_start_transaction_count());
bengr1bf8e942014-11-07 01:36:509187 EXPECT_EQ(0, default_network_delegate()->headers_received_count());
9188}
9189
9190TEST_F(URLRequestInterceptorTestHTTP,
9191 NetworkDelegateNotificationOnResponseIntercept) {
9192 // Intercept that error and respond with an OK response.
9193 interceptor()->set_intercept_final_response(true);
9194
9195 // Intercept with a real URLRequestHttpJob.
9196 interceptor()->set_use_url_request_http_job(true);
9197
tommycli59a63432015-11-06 00:10:559198 ASSERT_TRUE(http_test_server()->Start());
bengr1bf8e942014-11-07 01:36:509199
9200 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369201 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169202 http_test_server()->GetURL("/simple.html"), DEFAULT_PRIORITY, &d,
9203 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:509204 req->set_method("GET");
9205 req->Start();
9206 base::RunLoop().Run();
9207
9208 EXPECT_TRUE(interceptor()->did_intercept_final());
9209
9210 // Check we received one good response.
maksim.sisovb53724b52016-09-16 05:30:509211 int status = d.request_status();
9212 EXPECT_EQ(OK, status);
9213 if (status == OK)
bengr1bf8e942014-11-07 01:36:509214 EXPECT_EQ(200, req->response_headers()->response_code());
9215 EXPECT_EQ("hello", d.data_received());
9216 EXPECT_EQ(1, d.response_started_count());
9217 EXPECT_EQ(0, d.received_redirect_count());
9218
9219 EXPECT_EQ(1, default_network_delegate()->created_requests());
ryansturm2343cb62016-06-15 01:09:009220 EXPECT_EQ(2, default_network_delegate()->before_start_transaction_count());
bengr1bf8e942014-11-07 01:36:509221 EXPECT_EQ(2, default_network_delegate()->headers_received_count());
9222}
9223
mkwst0c5eab872014-11-21 14:18:549224class URLRequestTestReferrerPolicy : public URLRequestTest {
9225 public:
Chris Watkins7a41d3552017-12-01 02:13:279226 URLRequestTestReferrerPolicy() = default;
mkwst0c5eab872014-11-21 14:18:549227
tommycli59a63432015-11-06 00:10:559228 void InstantiateSameOriginServers(net::EmbeddedTestServer::Type type) {
9229 origin_server_.reset(new EmbeddedTestServer(type));
9230 if (type == net::EmbeddedTestServer::TYPE_HTTPS) {
9231 origin_server_->AddDefaultHandlers(
9232 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
9233 } else {
9234 origin_server_->AddDefaultHandlers(base::FilePath(kTestFilePath));
9235 }
mkwst0c5eab872014-11-21 14:18:549236 ASSERT_TRUE(origin_server_->Start());
9237 }
9238
tommycli59a63432015-11-06 00:10:559239 void InstantiateCrossOriginServers(net::EmbeddedTestServer::Type origin_type,
9240 net::EmbeddedTestServer::Type dest_type) {
9241 origin_server_.reset(new EmbeddedTestServer(origin_type));
9242 if (origin_type == net::EmbeddedTestServer::TYPE_HTTPS) {
9243 origin_server_->AddDefaultHandlers(
9244 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
9245 } else {
9246 origin_server_->AddDefaultHandlers(base::FilePath(kTestFilePath));
9247 }
mkwst0c5eab872014-11-21 14:18:549248 ASSERT_TRUE(origin_server_->Start());
9249
tommycli59a63432015-11-06 00:10:559250 destination_server_.reset(new EmbeddedTestServer(dest_type));
9251 if (dest_type == net::EmbeddedTestServer::TYPE_HTTPS) {
9252 destination_server_->AddDefaultHandlers(
9253 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
9254 } else {
9255 destination_server_->AddDefaultHandlers(base::FilePath(kTestFilePath));
9256 }
mkwst0c5eab872014-11-21 14:18:549257 ASSERT_TRUE(destination_server_->Start());
9258 }
9259
9260 void VerifyReferrerAfterRedirect(URLRequest::ReferrerPolicy policy,
9261 const GURL& referrer,
9262 const GURL& expected) {
9263 // Create and execute the request: we'll only have a |destination_server_|
9264 // if the origins are meant to be distinct. Otherwise, we'll use the
9265 // |origin_server_| for both endpoints.
9266 GURL destination_url =
tommycli59a63432015-11-06 00:10:559267 destination_server_ ? destination_server_->GetURL("/echoheader?Referer")
9268 : origin_server_->GetURL("/echoheader?Referer");
mkwst0c5eab872014-11-21 14:18:549269 GURL origin_url =
tommycli59a63432015-11-06 00:10:559270 origin_server_->GetURL("/server-redirect?" + destination_url.spec());
mkwst0c5eab872014-11-21 14:18:549271
9272 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:169273 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
9274 origin_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
mkwst0c5eab872014-11-21 14:18:549275 req->set_referrer_policy(policy);
9276 req->SetReferrer(referrer.spec());
9277 req->Start();
9278 base::RunLoop().Run();
9279
9280 EXPECT_EQ(1, d.response_started_count());
9281 EXPECT_EQ(1, d.received_redirect_count());
9282 EXPECT_EQ(destination_url, req->url());
maksim.sisovb53724b52016-09-16 05:30:509283 EXPECT_EQ(OK, d.request_status());
mkwst0c5eab872014-11-21 14:18:549284 EXPECT_EQ(200, req->response_headers()->response_code());
9285
9286 EXPECT_EQ(expected.spec(), req->referrer());
9287 if (expected.is_empty())
9288 EXPECT_EQ("None", d.data_received());
9289 else
9290 EXPECT_EQ(expected.spec(), d.data_received());
9291 }
9292
tommycli59a63432015-11-06 00:10:559293 EmbeddedTestServer* origin_server() const { return origin_server_.get(); }
mkwst0c5eab872014-11-21 14:18:549294
9295 private:
danakj8522a25b2016-04-16 00:17:369296 std::unique_ptr<EmbeddedTestServer> origin_server_;
9297 std::unique_ptr<EmbeddedTestServer> destination_server_;
mkwst0c5eab872014-11-21 14:18:549298};
9299
9300TEST_F(URLRequestTestReferrerPolicy, HTTPToSameOriginHTTP) {
tommycli59a63432015-11-06 00:10:559301 InstantiateSameOriginServers(net::EmbeddedTestServer::TYPE_HTTP);
mkwst0c5eab872014-11-21 14:18:549302
estarkc8ccba82017-06-13 22:37:409303 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549304 VerifyReferrerAfterRedirect(
9305 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409306 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549307
9308 VerifyReferrerAfterRedirect(
9309 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409310 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549311
9312 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409313 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549314
estarkc8ccba82017-06-13 22:37:409315 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9316 referrer);
9317
9318 // The original referrer set on the request is expected to obey the referrer
9319 // policy and already be stripped to the origin; thus this test case just
9320 // checks that this policy doesn't cause the referrer to change when following
9321 // a redirect.
9322 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9323 referrer.GetOrigin());
9324
9325 VerifyReferrerAfterRedirect(
9326 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer,
9327 referrer);
9328
9329 // The original referrer set on the request is expected to obey the referrer
9330 // policy and already be stripped to the origin; thus this test case just
9331 // checks that this policy doesn't cause the referrer to change when following
9332 // a redirect.
9333 VerifyReferrerAfterRedirect(
9334 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9335 referrer.GetOrigin(), referrer.GetOrigin());
9336
9337 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549338}
9339
tommycli59a63432015-11-06 00:10:559340TEST_F(URLRequestTestReferrerPolicy, HTTPToCrossOriginHTTP) {
9341 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTP,
9342 net::EmbeddedTestServer::TYPE_HTTP);
estarkc8ccba82017-06-13 22:37:409343 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549344
9345 VerifyReferrerAfterRedirect(
9346 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409347 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549348
9349 VerifyReferrerAfterRedirect(
9350 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409351 referrer, referrer.GetOrigin());
mkwst0c5eab872014-11-21 14:18:549352
9353 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409354 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
9355 referrer.GetOrigin());
mkwst0c5eab872014-11-21 14:18:549356
estarkc8ccba82017-06-13 22:37:409357 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9358 referrer);
9359
9360 // The original referrer set on the request is expected to obey the referrer
9361 // policy and already be stripped to the origin; thus this test case just
9362 // checks that this policy doesn't cause the referrer to change when following
9363 // a redirect.
9364 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9365 referrer.GetOrigin());
9366
9367 VerifyReferrerAfterRedirect(
9368 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9369
9370 // The original referrer set on the request is expected to obey the referrer
9371 // policy and already be stripped to the origin; thus this test case just
9372 // checks that this policy doesn't cause the referrer to change when following
9373 // a redirect.
9374 VerifyReferrerAfterRedirect(
9375 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9376 referrer.GetOrigin(), referrer.GetOrigin());
9377
9378 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549379}
9380
9381TEST_F(URLRequestTestReferrerPolicy, HTTPSToSameOriginHTTPS) {
tommycli59a63432015-11-06 00:10:559382 InstantiateSameOriginServers(net::EmbeddedTestServer::TYPE_HTTPS);
estarkc8ccba82017-06-13 22:37:409383 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549384
9385 VerifyReferrerAfterRedirect(
9386 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409387 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549388
9389 VerifyReferrerAfterRedirect(
9390 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409391 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549392
9393 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409394 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549395
estarkc8ccba82017-06-13 22:37:409396 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9397 referrer);
9398
9399 // The original referrer set on the request is expected to obey the referrer
9400 // policy and already be stripped to the origin; thus this test case just
9401 // checks that this policy doesn't cause the referrer to change when following
9402 // a redirect.
9403 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9404 referrer.GetOrigin());
9405
9406 VerifyReferrerAfterRedirect(
9407 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer,
9408 referrer);
9409
9410 // The original referrer set on the request is expected to obey the referrer
9411 // policy and already be stripped to the origin; thus this test case just
9412 // checks that this policy doesn't cause the referrer to change when following
9413 // a redirect.
9414 VerifyReferrerAfterRedirect(
9415 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9416 referrer.GetOrigin(), referrer.GetOrigin());
9417
9418 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549419}
9420
tommycli59a63432015-11-06 00:10:559421TEST_F(URLRequestTestReferrerPolicy, HTTPSToCrossOriginHTTPS) {
9422 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTPS,
9423 net::EmbeddedTestServer::TYPE_HTTPS);
estarkc8ccba82017-06-13 22:37:409424 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549425
9426 VerifyReferrerAfterRedirect(
9427 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409428 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549429
9430 VerifyReferrerAfterRedirect(
9431 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409432 referrer, origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549433
9434 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409435 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
tommycli59a63432015-11-06 00:10:559436 origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549437
estarkc8ccba82017-06-13 22:37:409438 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9439 referrer);
9440
9441 // The original referrer set on the request is expected to obey the referrer
9442 // policy and already be stripped to the origin; thus this test case just
9443 // checks that this policy doesn't cause the referrer to change when following
9444 // a redirect.
9445 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9446 referrer.GetOrigin());
9447
9448 VerifyReferrerAfterRedirect(
9449 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9450
9451 // The original referrer set on the request is expected to obey the referrer
9452 // policy and already be stripped to the origin; thus this test case just
9453 // checks that this policy doesn't cause the referrer to change when following
9454 // a redirect.
9455 VerifyReferrerAfterRedirect(
9456 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9457 referrer.GetOrigin(), referrer.GetOrigin());
9458
9459 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549460}
9461
tommycli59a63432015-11-06 00:10:559462TEST_F(URLRequestTestReferrerPolicy, HTTPToHTTPS) {
9463 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTP,
9464 net::EmbeddedTestServer::TYPE_HTTPS);
estarkc8ccba82017-06-13 22:37:409465 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549466
9467 VerifyReferrerAfterRedirect(
9468 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409469 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549470
9471 VerifyReferrerAfterRedirect(
9472 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409473 referrer, origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549474
9475 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409476 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
tommycli59a63432015-11-06 00:10:559477 origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549478
estarkc8ccba82017-06-13 22:37:409479 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9480 referrer);
9481
9482 // The original referrer set on the request is expected to obey the referrer
9483 // policy and already be stripped to the origin; thus this test case just
9484 // checks that this policy doesn't cause the referrer to change when following
9485 // a redirect.
9486 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9487 referrer.GetOrigin());
9488
9489 VerifyReferrerAfterRedirect(
9490 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9491
9492 // The original referrer set on the request is expected to obey the referrer
9493 // policy and already be stripped to the origin; thus this test case just
9494 // checks that this policy doesn't cause the referrer to change when following
9495 // a redirect.
9496 VerifyReferrerAfterRedirect(
9497 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9498 referrer.GetOrigin(), referrer.GetOrigin());
9499
9500 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549501}
9502
tommycli59a63432015-11-06 00:10:559503TEST_F(URLRequestTestReferrerPolicy, HTTPSToHTTP) {
9504 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTPS,
9505 net::EmbeddedTestServer::TYPE_HTTP);
estarkc8ccba82017-06-13 22:37:409506 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549507
9508 VerifyReferrerAfterRedirect(
9509 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409510 referrer, GURL());
mkwst0c5eab872014-11-21 14:18:549511
9512 VerifyReferrerAfterRedirect(
9513 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409514 referrer, GURL());
mkwst0c5eab872014-11-21 14:18:549515
9516 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409517 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
tommycli59a63432015-11-06 00:10:559518 origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549519
estarkc8ccba82017-06-13 22:37:409520 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9521 referrer);
9522
9523 // The original referrer set on the request is expected to obey the referrer
9524 // policy and already be stripped to the origin; thus this test case just
9525 // checks that this policy doesn't cause the referrer to change when following
9526 // a redirect.
9527 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9528 referrer.GetOrigin());
9529
9530 VerifyReferrerAfterRedirect(
9531 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9532
9533 // The original referrer set on the request is expected to obey the referrer
9534 // policy and already be stripped to the origin, though it should be
9535 // subsequently cleared during the downgrading redirect.
9536 VerifyReferrerAfterRedirect(
9537 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9538 referrer.GetOrigin(), GURL());
9539
9540 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549541}
9542
[email protected]73e0bba2009-02-19 22:57:099543class HTTPSRequestTest : public testing::Test {
[email protected]87a09a92011-07-14 15:50:509544 public:
fdorayf33fede2017-05-11 21:18:109545 HTTPSRequestTest() : default_context_(true) {
[email protected]ef2bf422012-05-11 03:27:099546 default_context_.set_network_delegate(&default_network_delegate_);
9547 default_context_.Init();
[email protected]87a09a92011-07-14 15:50:509548 }
Martijn Croonenb1383da2017-10-11 11:56:359549 ~HTTPSRequestTest() override {
9550 SetTransportSecurityStateSourceForTesting(nullptr);
9551 }
[email protected]87a09a92011-07-14 15:50:509552
9553 protected:
[email protected]ceefd7fd2012-11-29 00:36:249554 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest.
[email protected]ef2bf422012-05-11 03:27:099555 TestURLRequestContext default_context_;
[email protected]ea224582008-12-07 20:25:469556};
9557
[email protected]c044616e2013-02-20 02:01:269558TEST_F(HTTPSRequestTest, HTTPSGetTest) {
tommycli59a63432015-11-06 00:10:559559 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9560 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229561 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]95409e12010-08-17 20:07:119562 ASSERT_TRUE(test_server.Start());
[email protected]ea224582008-12-07 20:25:469563
[email protected]ea224582008-12-07 20:25:469564 TestDelegate d;
9565 {
danakj8522a25b2016-04-16 00:17:369566 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169567 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9568 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:199569 r->Start();
9570 EXPECT_TRUE(r->is_pending());
[email protected]ea224582008-12-07 20:25:469571
[email protected]255620da2013-08-19 13:14:299572 base::RunLoop().Run();
[email protected]ea224582008-12-07 20:25:469573
9574 EXPECT_EQ(1, d.response_started_count());
9575 EXPECT_FALSE(d.received_data_before_response());
9576 EXPECT_NE(0, d.bytes_received());
[email protected]f7022f32014-08-21 16:32:199577 CheckSSLInfo(r->ssl_info());
[email protected]6d81b482011-02-22 19:47:199578 EXPECT_EQ(test_server.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:199579 r->GetSocketAddress().host());
[email protected]6d81b482011-02-22 19:47:199580 EXPECT_EQ(test_server.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:199581 r->GetSocketAddress().port());
[email protected]ea224582008-12-07 20:25:469582 }
[email protected]ea224582008-12-07 20:25:469583}
9584
[email protected]5774ada2010-07-15 06:30:549585TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) {
tommycli59a63432015-11-06 00:10:559586 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9587 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
9588 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229589 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]95409e12010-08-17 20:07:119590 ASSERT_TRUE(test_server.Start());
[email protected]bacff652009-03-31 17:50:339591
9592 bool err_allowed = true;
9593 for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
9594 TestDelegate d;
9595 {
9596 d.set_allow_certificate_errors(err_allowed);
danakj8522a25b2016-04-16 00:17:369597 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169598 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9599 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]bacff652009-03-31 17:50:339600
[email protected]f7022f32014-08-21 16:32:199601 r->Start();
9602 EXPECT_TRUE(r->is_pending());
[email protected]bacff652009-03-31 17:50:339603
[email protected]255620da2013-08-19 13:14:299604 base::RunLoop().Run();
[email protected]bacff652009-03-31 17:50:339605
9606 EXPECT_EQ(1, d.response_started_count());
9607 EXPECT_FALSE(d.received_data_before_response());
9608 EXPECT_TRUE(d.have_certificate_errors());
[email protected]96adadb2010-08-28 01:16:179609 if (err_allowed) {
[email protected]bacff652009-03-31 17:50:339610 EXPECT_NE(0, d.bytes_received());
[email protected]f7022f32014-08-21 16:32:199611 CheckSSLInfo(r->ssl_info());
[email protected]96adadb2010-08-28 01:16:179612 } else {
[email protected]bacff652009-03-31 17:50:339613 EXPECT_EQ(0, d.bytes_received());
[email protected]96adadb2010-08-28 01:16:179614 }
[email protected]bacff652009-03-31 17:50:339615 }
9616 }
9617}
9618
[email protected]5774ada2010-07-15 06:30:549619TEST_F(HTTPSRequestTest, HTTPSExpiredTest) {
tommycli59a63432015-11-06 00:10:559620 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9621 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
9622 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229623 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]95409e12010-08-17 20:07:119624 ASSERT_TRUE(test_server.Start());
[email protected]bacff652009-03-31 17:50:339625
9626 // Iterate from false to true, just so that we do the opposite of the
9627 // previous test in order to increase test coverage.
9628 bool err_allowed = false;
9629 for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
9630 TestDelegate d;
9631 {
9632 d.set_allow_certificate_errors(err_allowed);
danakj8522a25b2016-04-16 00:17:369633 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169634 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9635 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]bacff652009-03-31 17:50:339636
[email protected]f7022f32014-08-21 16:32:199637 r->Start();
9638 EXPECT_TRUE(r->is_pending());
[email protected]bacff652009-03-31 17:50:339639
[email protected]255620da2013-08-19 13:14:299640 base::RunLoop().Run();
[email protected]bacff652009-03-31 17:50:339641
9642 EXPECT_EQ(1, d.response_started_count());
9643 EXPECT_FALSE(d.received_data_before_response());
9644 EXPECT_TRUE(d.have_certificate_errors());
[email protected]96adadb2010-08-28 01:16:179645 if (err_allowed) {
[email protected]bacff652009-03-31 17:50:339646 EXPECT_NE(0, d.bytes_received());
[email protected]f7022f32014-08-21 16:32:199647 CheckSSLInfo(r->ssl_info());
[email protected]96adadb2010-08-28 01:16:179648 } else {
[email protected]bacff652009-03-31 17:50:339649 EXPECT_EQ(0, d.bytes_received());
[email protected]96adadb2010-08-28 01:16:179650 }
[email protected]bacff652009-03-31 17:50:339651 }
9652 }
9653}
[email protected]73e0bba2009-02-19 22:57:099654
tommycli59a63432015-11-06 00:10:559655// TODO(svaldez): iOS tests are flaky with EmbeddedTestServer and transport
9656// security state. (see http://crbug.com/550977).
9657#if !defined(OS_IOS)
Martijn Croonenb1383da2017-10-11 11:56:359658// This tests that a load of a domain with preloaded HSTS and HPKP with a
9659// certificate error sets the |certificate_errors_are_fatal| flag correctly.
9660// This flag will cause the interstitial to be fatal.
[email protected]316c1e5e2012-09-12 15:17:449661TEST_F(HTTPSRequestTest, HTTPSPreloadedHSTSTest) {
Martijn Croonenb1383da2017-10-11 11:56:359662 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
9663
tommycli59a63432015-11-06 00:10:559664 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9665 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
9666 test_server.ServeFilesFromSourceDirectory("net/data/ssl");
[email protected]316c1e5e2012-09-12 15:17:449667 ASSERT_TRUE(test_server.Start());
9668
Martijn Croonenb1383da2017-10-11 11:56:359669 // We require that the URL be hsts-hpkp-preloaded.test. This is a test domain
9670 // that has a preloaded HSTS+HPKP entry in the TransportSecurityState. This
9671 // means that we have to use a MockHostResolver in order to direct
9672 // hsts-hpkp-preloaded.test to the testserver. By default, MockHostResolver
9673 // maps all hosts to 127.0.0.1.
[email protected]316c1e5e2012-09-12 15:17:449674
9675 MockHostResolver host_resolver;
[email protected]ceefd7fd2012-11-29 00:36:249676 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:449677 TestURLRequestContext context(true);
9678 context.set_network_delegate(&network_delegate);
9679 context.set_host_resolver(&host_resolver);
9680 TransportSecurityState transport_security_state;
9681 context.set_transport_security_state(&transport_security_state);
9682 context.Init();
9683
9684 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369685 std::unique_ptr<URLRequest> r(context.CreateRequest(
Martijn Croonenb1383da2017-10-11 11:56:359686 GURL(base::StringPrintf("https://hsts-hpkp-preloaded.test:%d",
davidben151423e2015-03-23 18:48:369687 test_server.host_port_pair().port())),
rhalavatib7bd7c792017-04-27 05:25:169688 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449689
[email protected]f7022f32014-08-21 16:32:199690 r->Start();
9691 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:449692
[email protected]255620da2013-08-19 13:14:299693 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449694
9695 EXPECT_EQ(1, d.response_started_count());
9696 EXPECT_FALSE(d.received_data_before_response());
9697 EXPECT_TRUE(d.have_certificate_errors());
9698 EXPECT_TRUE(d.certificate_errors_are_fatal());
9699}
9700
9701// This tests that cached HTTPS page loads do not cause any updates to the
9702// TransportSecurityState.
9703TEST_F(HTTPSRequestTest, HTTPSErrorsNoClobberTSSTest) {
Martijn Croonenb1383da2017-10-11 11:56:359704 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
9705
[email protected]316c1e5e2012-09-12 15:17:449706 // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't
9707 // matter. It just has to be any error.
tommycli59a63432015-11-06 00:10:559708 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9709 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
9710 test_server.ServeFilesFromSourceDirectory("net/data/ssl");
[email protected]316c1e5e2012-09-12 15:17:449711 ASSERT_TRUE(test_server.Start());
9712
Martijn Croonenb1383da2017-10-11 11:56:359713 // We require that the URL be hsts-hpkp-preloaded.test. This is a test domain
9714 // that has a preloaded HSTS+HPKP entry in the TransportSecurityState. This
9715 // means that we have to use a MockHostResolver in order to direct
9716 // hsts-hpkp-preloaded.test to the testserver. By default, MockHostResolver
9717 // maps all hosts to 127.0.0.1.
[email protected]316c1e5e2012-09-12 15:17:449718
9719 MockHostResolver host_resolver;
[email protected]ceefd7fd2012-11-29 00:36:249720 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:449721 TestURLRequestContext context(true);
9722 context.set_network_delegate(&network_delegate);
9723 context.set_host_resolver(&host_resolver);
9724 TransportSecurityState transport_security_state;
[email protected]9e6968d2014-05-07 21:46:269725
martijnc0d6b622015-06-30 19:14:409726 TransportSecurityState::STSState static_sts_state;
9727 TransportSecurityState::PKPState static_pkp_state;
[email protected]9e6968d2014-05-07 21:46:269728 EXPECT_TRUE(transport_security_state.GetStaticDomainState(
Martijn Croonenb1383da2017-10-11 11:56:359729 "hsts-hpkp-preloaded.test", &static_sts_state, &static_pkp_state));
[email protected]316c1e5e2012-09-12 15:17:449730 context.set_transport_security_state(&transport_security_state);
9731 context.Init();
9732
martijnc0d6b622015-06-30 19:14:409733 TransportSecurityState::STSState dynamic_sts_state;
9734 TransportSecurityState::PKPState dynamic_pkp_state;
Martijn Croonenb1383da2017-10-11 11:56:359735 EXPECT_FALSE(transport_security_state.GetDynamicSTSState(
9736 "hsts-hpkp-preloaded.test", &dynamic_sts_state));
9737 EXPECT_FALSE(transport_security_state.GetDynamicPKPState(
9738 "hsts-hpkp-preloaded.test", &dynamic_pkp_state));
[email protected]9e6968d2014-05-07 21:46:269739
[email protected]316c1e5e2012-09-12 15:17:449740 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369741 std::unique_ptr<URLRequest> r(context.CreateRequest(
Martijn Croonenb1383da2017-10-11 11:56:359742 GURL(base::StringPrintf("https://hsts-hpkp-preloaded.test:%d",
davidben151423e2015-03-23 18:48:369743 test_server.host_port_pair().port())),
rhalavatib7bd7c792017-04-27 05:25:169744 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449745
[email protected]f7022f32014-08-21 16:32:199746 r->Start();
9747 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:449748
[email protected]255620da2013-08-19 13:14:299749 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449750
9751 EXPECT_EQ(1, d.response_started_count());
9752 EXPECT_FALSE(d.received_data_before_response());
9753 EXPECT_TRUE(d.have_certificate_errors());
9754 EXPECT_TRUE(d.certificate_errors_are_fatal());
9755
[email protected]9e6968d2014-05-07 21:46:269756 // Get a fresh copy of the states, and check that they haven't changed.
martijnc0d6b622015-06-30 19:14:409757 TransportSecurityState::STSState new_static_sts_state;
9758 TransportSecurityState::PKPState new_static_pkp_state;
[email protected]9e6968d2014-05-07 21:46:269759 EXPECT_TRUE(transport_security_state.GetStaticDomainState(
Martijn Croonenb1383da2017-10-11 11:56:359760 "hsts-hpkp-preloaded.test", &new_static_sts_state,
9761 &new_static_pkp_state));
martijnc0d6b622015-06-30 19:14:409762 TransportSecurityState::STSState new_dynamic_sts_state;
9763 TransportSecurityState::PKPState new_dynamic_pkp_state;
9764 EXPECT_FALSE(transport_security_state.GetDynamicSTSState(
Martijn Croonenb1383da2017-10-11 11:56:359765 "hsts-hpkp-preloaded.test", &new_dynamic_sts_state));
martijnc0d6b622015-06-30 19:14:409766 EXPECT_FALSE(transport_security_state.GetDynamicPKPState(
Martijn Croonenb1383da2017-10-11 11:56:359767 "hsts-hpkp-preloaded.test", &new_dynamic_pkp_state));
[email protected]9e6968d2014-05-07 21:46:269768
martijnc0d6b622015-06-30 19:14:409769 EXPECT_EQ(new_static_sts_state.upgrade_mode, static_sts_state.upgrade_mode);
9770 EXPECT_EQ(new_static_sts_state.include_subdomains,
9771 static_sts_state.include_subdomains);
9772 EXPECT_EQ(new_static_pkp_state.include_subdomains,
9773 static_pkp_state.include_subdomains);
rsleevi91d4c9c2016-05-14 20:28:489774 EXPECT_EQ(new_static_pkp_state.spki_hashes, static_pkp_state.spki_hashes);
9775 EXPECT_EQ(new_static_pkp_state.bad_spki_hashes,
9776 static_pkp_state.bad_spki_hashes);
[email protected]316c1e5e2012-09-12 15:17:449777}
9778
[email protected]8ccc69f2012-11-28 19:52:149779// Make sure HSTS preserves a POST request's method and body.
9780TEST_F(HTTPSRequestTest, HSTSPreservesPosts) {
9781 static const char kData[] = "hello world";
9782
tommycli59a63432015-11-06 00:10:559783 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9784 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229785 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]8ccc69f2012-11-28 19:52:149786 ASSERT_TRUE(test_server.Start());
9787
9788
9789 // Per spec, TransportSecurityState expects a domain name, rather than an IP
9790 // address, so a MockHostResolver is needed to redirect www.somewhere.com to
tommycli59a63432015-11-06 00:10:559791 // the EmbeddedTestServer. By default, MockHostResolver maps all hosts
[email protected]ce7d0cbc2013-05-03 18:57:229792 // to 127.0.0.1.
[email protected]8ccc69f2012-11-28 19:52:149793 MockHostResolver host_resolver;
[email protected]8ccc69f2012-11-28 19:52:149794
9795 // Force https for www.somewhere.com.
9796 TransportSecurityState transport_security_state;
[email protected]474f079e2013-03-02 19:11:209797 base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000);
9798 bool include_subdomains = false;
9799 transport_security_state.AddHSTS("www.somewhere.com", expiry,
9800 include_subdomains);
[email protected]8ccc69f2012-11-28 19:52:149801
9802 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
9803
9804 TestURLRequestContext context(true);
9805 context.set_host_resolver(&host_resolver);
9806 context.set_transport_security_state(&transport_security_state);
9807 context.set_network_delegate(&network_delegate);
9808 context.Init();
9809
9810 TestDelegate d;
9811 // Navigating to https://www.somewhere.com instead of https://127.0.0.1 will
9812 // cause a certificate error. Ignore the error.
9813 d.set_allow_certificate_errors(true);
9814
danakj8522a25b2016-04-16 00:17:369815 std::unique_ptr<URLRequest> req(context.CreateRequest(
[email protected]f7022f32014-08-21 16:32:199816 GURL(base::StringPrintf("http://www.somewhere.com:%d/echo",
davidben151423e2015-03-23 18:48:369817 test_server.host_port_pair().port())),
rhalavatib7bd7c792017-04-27 05:25:169818 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:199819 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:079820 req->set_upload(CreateSimpleUploadData(kData));
[email protected]8ccc69f2012-11-28 19:52:149821
[email protected]f7022f32014-08-21 16:32:199822 req->Start();
[email protected]255620da2013-08-19 13:14:299823 base::RunLoop().Run();
[email protected]8ccc69f2012-11-28 19:52:149824
[email protected]f7022f32014-08-21 16:32:199825 EXPECT_EQ("https", req->url().scheme());
9826 EXPECT_EQ("POST", req->method());
[email protected]8ccc69f2012-11-28 19:52:149827 EXPECT_EQ(kData, d.data_received());
[email protected]07d9bfd2013-06-27 14:16:409828
9829 LoadTimingInfo load_timing_info;
9830 network_delegate.GetLoadTimingInfoBeforeRedirect(&load_timing_info);
9831 // LoadTimingInfo of HSTS redirects is similar to that of network cache hits
9832 TestLoadTimingCacheHitNoNetwork(load_timing_info);
[email protected]8ccc69f2012-11-28 19:52:149833}
9834
rob4e0be1f2014-09-11 23:40:229835// Make sure that the CORS headers are added to cross-origin HSTS redirects.
9836TEST_F(HTTPSRequestTest, HSTSCrossOriginAddHeaders) {
9837 static const char kOriginHeaderValue[] = "http://www.example.com";
9838
tommycli59a63432015-11-06 00:10:559839 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9840 test_server.ServeFilesFromSourceDirectory("net/data/ssl");
rob4e0be1f2014-09-11 23:40:229841 ASSERT_TRUE(test_server.Start());
9842
9843 // Per spec, TransportSecurityState expects a domain name, rather than an IP
9844 // address, so a MockHostResolver is needed to redirect example.net to the
tommycli59a63432015-11-06 00:10:559845 // EmbeddedTestServer. MockHostResolver maps all hosts to 127.0.0.1 by
9846 // default.
rob4e0be1f2014-09-11 23:40:229847 MockHostResolver host_resolver;
9848
9849 TransportSecurityState transport_security_state;
9850 base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1);
9851 bool include_subdomains = false;
9852 transport_security_state.AddHSTS("example.net", expiry, include_subdomains);
9853
9854 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
9855
9856 MockCertVerifier cert_verifier;
9857 cert_verifier.set_default_result(OK);
9858
9859 TestURLRequestContext context(true);
9860 context.set_host_resolver(&host_resolver);
9861 context.set_transport_security_state(&transport_security_state);
9862 context.set_network_delegate(&network_delegate);
9863 context.set_cert_verifier(&cert_verifier);
9864 context.Init();
9865
9866 GURL hsts_http_url(base::StringPrintf("http://example.net:%d/somehstssite",
9867 test_server.host_port_pair().port()));
9868 url::Replacements<char> replacements;
9869 const char kNewScheme[] = "https";
9870 replacements.SetScheme(kNewScheme, url::Component(0, strlen(kNewScheme)));
9871 GURL hsts_https_url = hsts_http_url.ReplaceComponents(replacements);
9872
9873 TestDelegate d;
9874 // Quit on redirect to allow response header inspection upon redirect.
9875 d.set_quit_on_redirect(true);
9876
rhalavatib7bd7c792017-04-27 05:25:169877 std::unique_ptr<URLRequest> req(context.CreateRequest(
9878 hsts_http_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
rob4e0be1f2014-09-11 23:40:229879 // Set Origin header to simulate a cross-origin request.
9880 HttpRequestHeaders request_headers;
9881 request_headers.SetHeader("Origin", kOriginHeaderValue);
9882 req->SetExtraRequestHeaders(request_headers);
9883
9884 req->Start();
9885 base::RunLoop().Run();
9886
9887 EXPECT_EQ(1, d.received_redirect_count());
9888
9889 const HttpResponseHeaders* headers = req->response_headers();
9890 std::string redirect_location;
9891 EXPECT_TRUE(headers->EnumerateHeader(NULL, "Location", &redirect_location));
9892 EXPECT_EQ(hsts_https_url.spec(), redirect_location);
9893
9894 std::string received_cors_header;
9895 EXPECT_TRUE(headers->EnumerateHeader(NULL, "Access-Control-Allow-Origin",
9896 &received_cors_header));
9897 EXPECT_EQ(kOriginHeaderValue, received_cors_header);
9898}
9899
[email protected]316c1e5e2012-09-12 15:17:449900namespace {
9901
9902class SSLClientAuthTestDelegate : public TestDelegate {
9903 public:
9904 SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) {
9905 }
dchengb03027d2014-10-21 12:00:209906 void OnCertificateRequested(URLRequest* request,
9907 SSLCertRequestInfo* cert_request_info) override {
[email protected]316c1e5e2012-09-12 15:17:449908 on_certificate_requested_count_++;
Gabriel Charette53a9ef812017-07-26 12:36:239909 base::RunLoop::QuitCurrentWhenIdleDeprecated();
[email protected]316c1e5e2012-09-12 15:17:449910 }
9911 int on_certificate_requested_count() {
9912 return on_certificate_requested_count_;
9913 }
9914 private:
9915 int on_certificate_requested_count_;
9916};
9917
9918} // namespace
9919
9920// TODO(davidben): Test the rest of the code. Specifically,
9921// - Filtering which certificates to select.
9922// - Sending a certificate back.
9923// - Getting a certificate request in an SSL renegotiation sending the
9924// HTTP request.
9925TEST_F(HTTPSRequestTest, ClientAuthTest) {
tommycli59a63432015-11-06 00:10:559926 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9927 net::SSLServerConfig ssl_config;
ryanchung987b2ff2016-02-19 00:17:129928 ssl_config.client_cert_type =
9929 SSLServerConfig::ClientCertType::OPTIONAL_CLIENT_CERT;
tommycli59a63432015-11-06 00:10:559930 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config);
9931 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229932 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]316c1e5e2012-09-12 15:17:449933 ASSERT_TRUE(test_server.Start());
9934
9935 SSLClientAuthTestDelegate d;
9936 {
danakj8522a25b2016-04-16 00:17:369937 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169938 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9939 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449940
[email protected]f7022f32014-08-21 16:32:199941 r->Start();
9942 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:449943
[email protected]255620da2013-08-19 13:14:299944 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449945
9946 EXPECT_EQ(1, d.on_certificate_requested_count());
9947 EXPECT_FALSE(d.received_data_before_response());
9948 EXPECT_EQ(0, d.bytes_received());
9949
9950 // Send no certificate.
9951 // TODO(davidben): Get temporary client cert import (with keys) working on
9952 // all platforms so we can test sending a cert as well.
svaldez7872fd02015-11-19 21:10:549953 r->ContinueWithCertificate(nullptr, nullptr);
[email protected]316c1e5e2012-09-12 15:17:449954
[email protected]255620da2013-08-19 13:14:299955 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449956
9957 EXPECT_EQ(1, d.response_started_count());
9958 EXPECT_FALSE(d.received_data_before_response());
9959 EXPECT_NE(0, d.bytes_received());
9960 }
9961}
9962
9963TEST_F(HTTPSRequestTest, ResumeTest) {
9964 // Test that we attempt a session resume when making two connections to the
9965 // same host.
[email protected]ce7d0cbc2013-05-03 18:57:229966 SpawnedTestServer::SSLOptions ssl_options;
[email protected]316c1e5e2012-09-12 15:17:449967 ssl_options.record_resume = true;
[email protected]ce7d0cbc2013-05-03 18:57:229968 SpawnedTestServer test_server(
9969 SpawnedTestServer::TYPE_HTTPS,
9970 ssl_options,
9971 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]316c1e5e2012-09-12 15:17:449972 ASSERT_TRUE(test_server.Start());
9973
9974 SSLClientSocket::ClearSessionCache();
9975
9976 {
9977 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369978 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169979 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
9980 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449981
[email protected]f7022f32014-08-21 16:32:199982 r->Start();
9983 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:449984
[email protected]255620da2013-08-19 13:14:299985 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449986
9987 EXPECT_EQ(1, d.response_started_count());
9988 }
9989
9990 reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())->
9991 CloseAllConnections();
9992
9993 {
9994 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369995 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169996 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
9997 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449998
[email protected]f7022f32014-08-21 16:32:199999 r->Start();
10000 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410001
[email protected]255620da2013-08-19 13:14:2910002 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410003
10004 // The response will look like;
10005 // insert abc
10006 // lookup abc
10007 // insert xyz
10008 //
10009 // With a newline at the end which makes the split think that there are
10010 // four lines.
10011
10012 EXPECT_EQ(1, d.response_started_count());
brettw3a2c6902015-07-06 19:43:2910013 std::vector<std::string> lines = base::SplitString(
10014 d.data_received(), "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]316c1e5e2012-09-12 15:17:4410015 ASSERT_EQ(4u, lines.size()) << d.data_received();
10016
10017 std::string session_id;
10018
10019 for (size_t i = 0; i < 2; i++) {
brettw3a2c6902015-07-06 19:43:2910020 std::vector<std::string> parts = base::SplitString(
10021 lines[i], "\t", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]316c1e5e2012-09-12 15:17:4410022 ASSERT_EQ(2u, parts.size());
10023 if (i == 0) {
10024 EXPECT_EQ("insert", parts[0]);
10025 session_id = parts[1];
10026 } else {
10027 EXPECT_EQ("lookup", parts[0]);
10028 EXPECT_EQ(session_id, parts[1]);
10029 }
10030 }
10031 }
10032}
10033
Adam Langley32352ad2014-10-14 22:31:0010034// AssertTwoDistinctSessionsInserted checks that |session_info|, which must be
10035// the result of fetching "ssl-session-cache" from the test server, indicates
10036// that exactly two different sessions were inserted, with no lookups etc.
10037static void AssertTwoDistinctSessionsInserted(const string& session_info) {
brettw3a2c6902015-07-06 19:43:2910038 std::vector<std::string> lines = base::SplitString(
10039 session_info, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
Adam Langley32352ad2014-10-14 22:31:0010040 ASSERT_EQ(3u, lines.size()) << session_info;
10041
10042 std::string session_id;
10043 for (size_t i = 0; i < 2; i++) {
brettw3a2c6902015-07-06 19:43:2910044 std::vector<std::string> parts = base::SplitString(
10045 lines[i], "\t", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
Adam Langley32352ad2014-10-14 22:31:0010046 ASSERT_EQ(2u, parts.size());
10047 EXPECT_EQ("insert", parts[0]);
10048 if (i == 0) {
10049 session_id = parts[1];
10050 } else {
10051 EXPECT_NE(session_id, parts[1]);
10052 }
10053 }
10054}
10055
[email protected]316c1e5e2012-09-12 15:17:4410056TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) {
10057 // Test that sessions aren't resumed when the value of ssl_session_cache_shard
10058 // differs.
[email protected]ce7d0cbc2013-05-03 18:57:2210059 SpawnedTestServer::SSLOptions ssl_options;
[email protected]316c1e5e2012-09-12 15:17:4410060 ssl_options.record_resume = true;
[email protected]ce7d0cbc2013-05-03 18:57:2210061 SpawnedTestServer test_server(
10062 SpawnedTestServer::TYPE_HTTPS,
10063 ssl_options,
10064 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]316c1e5e2012-09-12 15:17:4410065 ASSERT_TRUE(test_server.Start());
10066
10067 SSLClientSocket::ClearSessionCache();
10068
10069 {
10070 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610071 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610072 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10073 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:4410074
[email protected]f7022f32014-08-21 16:32:1910075 r->Start();
10076 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410077
[email protected]255620da2013-08-19 13:14:2910078 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410079
10080 EXPECT_EQ(1, d.response_started_count());
10081 }
10082
10083 // Now create a new HttpCache with a different ssl_session_cache_shard value.
mmenke6ddfbea2017-05-31 21:48:4110084 HttpNetworkSession::Context session_context;
10085 session_context.host_resolver = default_context_.host_resolver();
10086 session_context.cert_verifier = default_context_.cert_verifier();
10087 session_context.transport_security_state =
10088 default_context_.transport_security_state();
10089 session_context.cert_transparency_verifier =
rsleevid6de8302016-06-21 01:33:2010090 default_context_.cert_transparency_verifier();
mmenke6ddfbea2017-05-31 21:48:4110091 session_context.ct_policy_enforcer = default_context_.ct_policy_enforcer();
10092 session_context.proxy_service = default_context_.proxy_service();
10093 session_context.ssl_config_service = default_context_.ssl_config_service();
10094 session_context.http_auth_handler_factory =
[email protected]316c1e5e2012-09-12 15:17:4410095 default_context_.http_auth_handler_factory();
mmenke6ddfbea2017-05-31 21:48:4110096 session_context.http_server_properties =
10097 default_context_.http_server_properties();
[email protected]316c1e5e2012-09-12 15:17:4410098
mmenke6ddfbea2017-05-31 21:48:4110099 HttpNetworkSession network_session(HttpNetworkSession::Params(),
10100 session_context);
zhongyi4928bd52017-02-08 02:16:2710101 std::unique_ptr<HttpCache> cache(
10102 new HttpCache(&network_session, HttpCache::DefaultBackend::InMemory(0),
10103 false /* is_main_cache */));
[email protected]316c1e5e2012-09-12 15:17:4410104
10105 default_context_.set_http_transaction_factory(cache.get());
10106
10107 {
10108 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610109 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610110 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10111 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:4410112
[email protected]f7022f32014-08-21 16:32:1910113 r->Start();
10114 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410115
[email protected]255620da2013-08-19 13:14:2910116 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410117
10118 // The response will look like;
10119 // insert abc
10120 // insert xyz
10121 //
10122 // With a newline at the end which makes the split think that there are
10123 // three lines.
10124
10125 EXPECT_EQ(1, d.response_started_count());
Adam Langley32352ad2014-10-14 22:31:0010126 AssertTwoDistinctSessionsInserted(d.data_received());
[email protected]316c1e5e2012-09-12 15:17:4410127 }
10128}
10129
[email protected]48d2b7c52014-06-27 01:16:5510130class HTTPSFallbackTest : public testing::Test {
10131 public:
fdorayf33fede2017-05-11 21:18:1010132 HTTPSFallbackTest() : context_(true) {
davidben095ebb52017-04-12 22:23:3410133 ssl_config_service_ = new TestSSLConfigService(
10134 true /* check for EV */, false /* online revocation checking */,
10135 false /* require rev. checking for local anchors */,
10136 false /* token binding enabled */);
10137 context_.set_ssl_config_service(ssl_config_service_.get());
10138 }
Chris Watkins7a41d3552017-12-01 02:13:2710139 ~HTTPSFallbackTest() override = default;
[email protected]48d2b7c52014-06-27 01:16:5510140
10141 protected:
davidben095ebb52017-04-12 22:23:3410142 TestSSLConfigService* ssl_config_service() {
10143 return ssl_config_service_.get();
10144 }
10145
[email protected]48d2b7c52014-06-27 01:16:5510146 void DoFallbackTest(const SpawnedTestServer::SSLOptions& ssl_options) {
10147 DCHECK(!request_);
Adam Langley32352ad2014-10-14 22:31:0010148 context_.Init();
10149 delegate_.set_allow_certificate_errors(true);
10150
[email protected]48d2b7c52014-06-27 01:16:5510151 SpawnedTestServer test_server(
10152 SpawnedTestServer::TYPE_HTTPS,
10153 ssl_options,
10154 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
10155 ASSERT_TRUE(test_server.Start());
10156
tommycli59a63432015-11-06 00:10:5510157 request_ = context_.CreateRequest(test_server.GetURL("/"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:1610158 &delegate_, TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]48d2b7c52014-06-27 01:16:5510159 request_->Start();
10160
10161 base::RunLoop().Run();
10162 }
10163
davidben095ebb52017-04-12 22:23:3410164 void ExpectConnection(int version) {
10165 EXPECT_EQ(1, delegate_.response_started_count());
10166 EXPECT_NE(0, delegate_.bytes_received());
10167 EXPECT_EQ(version, SSLConnectionStatusToVersion(
10168 request_->ssl_info().connection_status));
10169 }
10170
[email protected]48d2b7c52014-06-27 01:16:5510171 void ExpectFailure(int error) {
10172 EXPECT_EQ(1, delegate_.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:5010173 EXPECT_EQ(error, delegate_.request_status());
[email protected]48d2b7c52014-06-27 01:16:5510174 }
10175
10176 private:
10177 TestDelegate delegate_;
davidben5a312152016-06-27 22:11:4710178 TestURLRequestContext context_;
danakj8522a25b2016-04-16 00:17:3610179 std::unique_ptr<URLRequest> request_;
davidben095ebb52017-04-12 22:23:3410180 scoped_refptr<TestSSLConfigService> ssl_config_service_;
[email protected]48d2b7c52014-06-27 01:16:5510181};
10182
davidbenb127ca82015-06-15 19:05:4210183// Tests the TLS 1.0 fallback doesn't happen.
10184TEST_F(HTTPSFallbackTest, TLSv1NoFallback) {
[email protected]48d2b7c52014-06-27 01:16:5510185 SpawnedTestServer::SSLOptions ssl_options(
10186 SpawnedTestServer::SSLOptions::CERT_OK);
10187 ssl_options.tls_intolerant =
10188 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1;
10189
10190 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
davidben3b267512016-02-24 19:46:5510191 ExpectFailure(ERR_SSL_VERSION_OR_CIPHER_MISMATCH);
davidbenb127ca82015-06-15 19:05:4210192}
10193
davidben5a312152016-06-27 22:11:4710194// Tests the TLS 1.1 fallback doesn't happen.
davidben3b267512016-02-24 19:46:5510195TEST_F(HTTPSFallbackTest, TLSv1_1NoFallback) {
davidbenb127ca82015-06-15 19:05:4210196 SpawnedTestServer::SSLOptions ssl_options(
10197 SpawnedTestServer::SSLOptions::CERT_OK);
10198 ssl_options.tls_intolerant =
10199 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_2;
10200
10201 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
[email protected]48d2b7c52014-06-27 01:16:5510202 ExpectFailure(ERR_SSL_VERSION_OR_CIPHER_MISMATCH);
10203}
10204
davidben095ebb52017-04-12 22:23:3410205// Tests that TLS 1.3 interference results in a dedicated error code.
10206TEST_F(HTTPSFallbackTest, TLSv1_3Interference) {
10207 SpawnedTestServer::SSLOptions ssl_options(
10208 SpawnedTestServer::SSLOptions::CERT_OK);
10209 ssl_options.tls_intolerant =
10210 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_3;
10211 ssl_config_service()->set_max_version(SSL_PROTOCOL_VERSION_TLS1_3);
10212
10213 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
10214 ExpectFailure(ERR_SSL_VERSION_INTERFERENCE);
10215}
10216
10217// Tests that disabling TLS 1.3 leaves TLS 1.3 interference unnoticed.
10218TEST_F(HTTPSFallbackTest, TLSv1_3InterferenceDisableVersion) {
10219 SpawnedTestServer::SSLOptions ssl_options(
10220 SpawnedTestServer::SSLOptions::CERT_OK);
10221 ssl_options.tls_intolerant =
10222 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_3;
10223 ssl_config_service()->set_max_version(SSL_PROTOCOL_VERSION_TLS1_2);
10224
10225 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
10226 ExpectConnection(SSL_CONNECTION_VERSION_TLS1_2);
10227}
10228
[email protected]a8fed1742013-12-27 02:14:2410229class HTTPSSessionTest : public testing::Test {
10230 public:
fdorayf33fede2017-05-11 21:18:1010231 HTTPSSessionTest() : default_context_(true) {
[email protected]cba24642014-08-15 20:49:5910232 cert_verifier_.set_default_result(OK);
[email protected]a8fed1742013-12-27 02:14:2410233
10234 default_context_.set_network_delegate(&default_network_delegate_);
10235 default_context_.set_cert_verifier(&cert_verifier_);
10236 default_context_.Init();
10237 }
Chris Watkins7a41d3552017-12-01 02:13:2710238 ~HTTPSSessionTest() override = default;
[email protected]a8fed1742013-12-27 02:14:2410239
10240 protected:
10241 MockCertVerifier cert_verifier_;
10242 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest.
10243 TestURLRequestContext default_context_;
10244};
10245
10246// Tests that session resumption is not attempted if an invalid certificate
10247// is presented.
10248TEST_F(HTTPSSessionTest, DontResumeSessionsForInvalidCertificates) {
10249 SpawnedTestServer::SSLOptions ssl_options;
10250 ssl_options.record_resume = true;
10251 SpawnedTestServer test_server(
10252 SpawnedTestServer::TYPE_HTTPS,
10253 ssl_options,
10254 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
10255 ASSERT_TRUE(test_server.Start());
10256
10257 SSLClientSocket::ClearSessionCache();
10258
10259 // Simulate the certificate being expired and attempt a connection.
[email protected]cba24642014-08-15 20:49:5910260 cert_verifier_.set_default_result(ERR_CERT_DATE_INVALID);
[email protected]a8fed1742013-12-27 02:14:2410261 {
10262 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610263 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610264 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10265 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]a8fed1742013-12-27 02:14:2410266
[email protected]f7022f32014-08-21 16:32:1910267 r->Start();
10268 EXPECT_TRUE(r->is_pending());
[email protected]a8fed1742013-12-27 02:14:2410269
10270 base::RunLoop().Run();
10271
10272 EXPECT_EQ(1, d.response_started_count());
10273 }
10274
10275 reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())->
10276 CloseAllConnections();
10277
10278 // Now change the certificate to be acceptable (so that the response is
10279 // loaded), and ensure that no session id is presented to the peer.
[email protected]cba24642014-08-15 20:49:5910280 cert_verifier_.set_default_result(OK);
[email protected]a8fed1742013-12-27 02:14:2410281 {
10282 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610283 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610284 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10285 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]a8fed1742013-12-27 02:14:2410286
[email protected]f7022f32014-08-21 16:32:1910287 r->Start();
10288 EXPECT_TRUE(r->is_pending());
[email protected]a8fed1742013-12-27 02:14:2410289
10290 base::RunLoop().Run();
10291
10292 // The response will look like;
10293 // insert abc
10294 // insert xyz
10295 //
10296 // With a newline at the end which makes the split think that there are
10297 // three lines.
10298 //
10299 // If a session was presented (eg: a bug), then the response would look
10300 // like;
10301 // insert abc
10302 // lookup abc
10303 // insert xyz
10304
10305 EXPECT_EQ(1, d.response_started_count());
Adam Langley32352ad2014-10-14 22:31:0010306 AssertTwoDistinctSessionsInserted(d.data_received());
[email protected]a8fed1742013-12-27 02:14:2410307 }
10308}
10309
[email protected]dffe8242012-03-20 15:14:2710310// This the fingerprint of the "Testing CA" certificate used by the testserver.
10311// See net/data/ssl/certificates/ocsp-test-root.pem.
David Benjamin9cedc3a52017-08-20 21:30:5810312static const SHA256HashValue kOCSPTestCertFingerprint = {{
10313 0x0c, 0xa9, 0x05, 0x11, 0xb0, 0xa2, 0xc0, 0x1d, 0x40, 0x6a, 0x99,
10314 0x04, 0x21, 0x36, 0x45, 0x3f, 0x59, 0x12, 0x5c, 0x80, 0x64, 0x2d,
10315 0x46, 0x6a, 0x3b, 0x78, 0x9e, 0x84, 0xea, 0x54, 0x0f, 0x8b,
mattm3b4376f12016-10-03 21:07:1510316}};
[email protected]dffe8242012-03-20 15:14:2710317
[email protected]51523f52013-07-31 21:57:2810318// This is the SHA256, SPKI hash of the "Testing CA" certificate used by the
10319// testserver.
mattm0b12a6f2016-11-29 19:57:1610320static const SHA256HashValue kOCSPTestCertSPKI = {{
10321 0x05, 0xa8, 0xf6, 0xfd, 0x8e, 0x10, 0xfe, 0x92, 0x2f, 0x22, 0x75,
10322 0x46, 0x40, 0xf4, 0xc4, 0x57, 0x06, 0x0d, 0x95, 0xfd, 0x60, 0x31,
10323 0x3b, 0xf3, 0xfc, 0x12, 0x47, 0xe7, 0x66, 0x1a, 0x82, 0xa3,
10324}};
[email protected]51523f52013-07-31 21:57:2810325
[email protected]dffe8242012-03-20 15:14:2710326// This is the policy OID contained in the certificates that testserver
10327// generates.
10328static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1";
10329
10330class HTTPSOCSPTest : public HTTPSRequestTest {
10331 public:
10332 HTTPSOCSPTest()
[email protected]ef2bf422012-05-11 03:27:0910333 : context_(true),
[email protected]b6f2de32012-08-17 04:35:0810334 ev_test_policy_(
10335 new ScopedTestEVPolicy(EVRootCAMetadata::GetInstance(),
10336 kOCSPTestCertFingerprint,
10337 kOCSPTestCertPolicy)) {
[email protected]a13234c2012-03-20 21:45:0210338 }
10339
dcheng67be2b1f2014-10-27 21:47:2910340 void SetUp() override {
rsleevid6de8302016-06-21 01:33:2010341 context_.SetCTPolicyEnforcer(
Jeremy Roman0579ed62017-08-29 15:56:1910342 std::make_unique<AllowAnyCertCTPolicyEnforcer>());
rsleevid6de8302016-06-21 01:33:2010343 SetupContext();
[email protected]ef2bf422012-05-11 03:27:0910344 context_.Init();
[email protected]dffe8242012-03-20 15:14:2710345
[email protected]cba24642014-08-15 20:49:5910346 scoped_refptr<X509Certificate> root_cert =
[email protected]3a86a712013-07-30 07:16:2010347 ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem");
dchengc2e01e82014-08-27 00:24:4210348 CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert.get());
[email protected]90499482013-06-01 00:39:5010349 test_root_.reset(new ScopedTestRoot(root_cert.get()));
[email protected]dffe8242012-03-20 15:14:2710350
Eric Romanefddd0a2017-10-10 02:14:2510351#if defined(USE_BUILTIN_CERT_VERIFIER)
10352 SetGlobalCertNetFetcherForTesting(net::CreateCertNetFetcher(&context_));
10353#endif
10354
svaldez2135be52016-04-20 16:34:5310355#if defined(USE_NSS_CERTS)
[email protected]ef2bf422012-05-11 03:27:0910356 SetURLRequestContextForNSSHttpIO(&context_);
[email protected]dffe8242012-03-20 15:14:2710357 EnsureNSSHttpIOInit();
10358#endif
10359 }
10360
dadrian612337a2016-07-20 22:36:5810361 void DoConnectionWithDelegate(
10362 const SpawnedTestServer::SSLOptions& ssl_options,
10363 TestDelegate* delegate,
10364 SSLInfo* out_ssl_info) {
10365 // Always overwrite |out_ssl_info|.
10366 out_ssl_info->Reset();
10367
[email protected]ce7d0cbc2013-05-03 18:57:2210368 SpawnedTestServer test_server(
10369 SpawnedTestServer::TYPE_HTTPS,
10370 ssl_options,
10371 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]dffe8242012-03-20 15:14:2710372 ASSERT_TRUE(test_server.Start());
10373
dadrian612337a2016-07-20 22:36:5810374 delegate->set_allow_certificate_errors(true);
rhalavatib7bd7c792017-04-27 05:25:1610375 std::unique_ptr<URLRequest> r(
10376 context_.CreateRequest(test_server.GetURL("/"), DEFAULT_PRIORITY,
10377 delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1910378 r->Start();
[email protected]dffe8242012-03-20 15:14:2710379
[email protected]255620da2013-08-19 13:14:2910380 base::RunLoop().Run();
dadrian612337a2016-07-20 22:36:5810381 EXPECT_EQ(1, delegate->response_started_count());
[email protected]dffe8242012-03-20 15:14:2710382
dadrian612337a2016-07-20 22:36:5810383 *out_ssl_info = r->ssl_info();
10384 }
10385
10386 void DoConnection(const SpawnedTestServer::SSLOptions& ssl_options,
10387 CertStatus* out_cert_status) {
10388 // Always overwrite |out_cert_status|.
10389 *out_cert_status = 0;
10390
10391 TestDelegate d;
10392 SSLInfo ssl_info;
10393 ASSERT_NO_FATAL_FAILURE(
10394 DoConnectionWithDelegate(ssl_options, &d, &ssl_info));
10395
10396 *out_cert_status = ssl_info.cert_status;
[email protected]dffe8242012-03-20 15:14:2710397 }
10398
dcheng67be2b1f2014-10-27 21:47:2910399 ~HTTPSOCSPTest() override {
Eric Romanefddd0a2017-10-10 02:14:2510400#if defined(USE_BUILTIN_CERT_VERIFIER)
10401 ShutdownGlobalCertNetFetcher();
10402#endif
10403
svaldez2135be52016-04-20 16:34:5310404#if defined(USE_NSS_CERTS)
[email protected]dffe8242012-03-20 15:14:2710405 ShutdownNSSHttpIO();
10406#endif
10407 }
10408
[email protected]a13234c2012-03-20 21:45:0210409 protected:
rsleevid6de8302016-06-21 01:33:2010410 class AllowAnyCertCTPolicyEnforcer : public CTPolicyEnforcer {
10411 public:
10412 AllowAnyCertCTPolicyEnforcer() = default;
10413 ~AllowAnyCertCTPolicyEnforcer() override = default;
10414
Emily Stark627238f2017-11-29 03:29:5410415 ct::CTPolicyCompliance CheckCompliance(
rsleevid6de8302016-06-21 01:33:2010416 X509Certificate* cert,
10417 const SCTList& verified_scts,
tfarina42834112016-09-22 13:38:2010418 const NetLogWithSource& net_log) override {
Emily Stark627238f2017-11-29 03:29:5410419 return ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS;
rsleevid6de8302016-06-21 01:33:2010420 }
rsleevid6de8302016-06-21 01:33:2010421 };
[email protected]a13234c2012-03-20 21:45:0210422 // SetupContext configures the URLRequestContext that will be used for making
10423 // connetions to testserver. This can be overridden in test subclasses for
10424 // different behaviour.
rsleevid6de8302016-06-21 01:33:2010425 virtual void SetupContext() {
10426 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1410427 true /* check for EV */, true /* online revocation checking */,
10428 false /* require rev. checking for local
10429 anchors */,
10430 false /* token binding enabled */));
[email protected]a13234c2012-03-20 21:45:0210431 }
10432
danakj8522a25b2016-04-16 00:17:3610433 std::unique_ptr<ScopedTestRoot> test_root_;
[email protected]ef2bf422012-05-11 03:27:0910434 TestURLRequestContext context_;
danakj8522a25b2016-04-16 00:17:3610435 std::unique_ptr<ScopedTestEVPolicy> ev_test_policy_;
[email protected]dffe8242012-03-20 15:14:2710436};
10437
[email protected]a13234c2012-03-20 21:45:0210438static CertStatus ExpectedCertStatusForFailedOnlineRevocationCheck() {
mattmaf868e72016-09-23 23:25:2010439#if defined(OS_WIN) || defined(OS_MACOSX)
[email protected]a13234c2012-03-20 21:45:0210440 // Windows can return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION but we don't
10441 // have that ability on other platforms.
Eric Roman1b628daa2017-10-19 19:52:0410442 // TODO(eroman): Should this also be the return value for
10443 // CertVerifyProcBuiltin?
[email protected]a13234c2012-03-20 21:45:0210444 return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION;
10445#else
10446 return 0;
10447#endif
10448}
10449
[email protected]3a86a712013-07-30 07:16:2010450// SystemSupportsHardFailRevocationChecking returns true iff the current
10451// operating system supports revocation checking and can distinguish between
10452// situations where a given certificate lacks any revocation information (eg:
10453// no CRLDistributionPoints and no OCSP Responder AuthorityInfoAccess) and when
10454// revocation information cannot be obtained (eg: the CRL was unreachable).
10455// If it does not, then tests which rely on 'hard fail' behaviour should be
10456// skipped.
10457static bool SystemSupportsHardFailRevocationChecking() {
Eric Roman1b628daa2017-10-19 19:52:0410458#if defined(OS_WIN) || defined(USE_NSS_CERTS) || \
10459 defined(USE_BUILTIN_CERT_VERIFIER)
[email protected]3a86a712013-07-30 07:16:2010460 return true;
10461#else
10462 return false;
10463#endif
10464}
10465
[email protected]a13234c2012-03-20 21:45:0210466// SystemUsesChromiumEVMetadata returns true iff the current operating system
10467// uses Chromium's EV metadata (i.e. EVRootCAMetadata). If it does not, then
10468// several tests are effected because our testing EV certificate won't be
10469// recognised as EV.
10470static bool SystemUsesChromiumEVMetadata() {
Eric Roman5f8d9d22017-10-17 02:32:5210471#if defined(PLATFORM_USES_CHROMIUM_EV_METADATA)
[email protected]05454a432012-03-20 20:04:0110472 return true;
Eric Roman5f8d9d22017-10-17 02:32:5210473#else
10474 return false;
[email protected]05454a432012-03-20 20:04:0110475#endif
10476}
10477
mattmaf868e72016-09-23 23:25:2010478// Returns the expected CertStatus for tests that expect an online revocation
10479// check failure as a result of checking a test EV cert, which will not
10480// actually trigger an online revocation check on some platforms.
10481static CertStatus ExpectedCertStatusForFailedOnlineEVRevocationCheck() {
10482 if (SystemUsesChromiumEVMetadata()) {
10483 return ExpectedCertStatusForFailedOnlineRevocationCheck();
10484 } else {
10485 // If SystemUsesChromiumEVMetadata is false, revocation checking will not
10486 // be enabled, and thus there will not be a revocation check to fail.
10487 return 0u;
10488 }
10489}
10490
[email protected]b6f2de32012-08-17 04:35:0810491static bool SystemSupportsOCSP() {
Sergey Ulanov033501e52017-10-19 22:29:2110492#if defined(OS_ANDROID) || defined(OS_FUCHSIA)
[email protected]a13234c2012-03-20 21:45:0210493 // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported.
Sergey Ulanov033501e52017-10-19 22:29:2110494 // TODO(crbug.com/776575): OCSP tests currently fail on Fuchsia.
[email protected]a13234c2012-03-20 21:45:0210495 return false;
10496#else
10497 return true;
10498#endif
10499}
10500
davidbend1fb2f12014-11-08 02:51:0010501static bool SystemSupportsOCSPStapling() {
Eric Roman1b628daa2017-10-19 19:52:0410502#if defined(USE_NSS_CERTS) || defined(OS_WIN) || \
10503 defined(USE_BUILTIN_CERT_VERIFIER)
mathpc992e602015-10-21 20:34:0310504 return true;
mathpc992e602015-10-21 20:34:0310505#else
10506 return false;
10507#endif
davidbend1fb2f12014-11-08 02:51:0010508}
10509
[email protected]dffe8242012-03-20 15:14:2710510TEST_F(HTTPSOCSPTest, Valid) {
10511 if (!SystemSupportsOCSP()) {
10512 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
10513 return;
10514 }
10515
[email protected]ce7d0cbc2013-05-03 18:57:2210516 SpawnedTestServer::SSLOptions ssl_options(
10517 SpawnedTestServer::SSLOptions::CERT_AUTO);
10518 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
[email protected]dffe8242012-03-20 15:14:2710519
[email protected]924e9f92012-12-16 22:00:5310520 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1210521 DoConnection(ssl_options, &cert_status);
[email protected]dffe8242012-03-20 15:14:2710522
10523 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
10524
[email protected]a13234c2012-03-20 21:45:0210525 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
10526 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
[email protected]dffe8242012-03-20 15:14:2710527
10528 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10529}
10530
10531TEST_F(HTTPSOCSPTest, Revoked) {
10532 if (!SystemSupportsOCSP()) {
10533 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
10534 return;
10535 }
10536
[email protected]ce7d0cbc2013-05-03 18:57:2210537 SpawnedTestServer::SSLOptions ssl_options(
10538 SpawnedTestServer::SSLOptions::CERT_AUTO);
10539 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
[email protected]dffe8242012-03-20 15:14:2710540
10541 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1210542 DoConnection(ssl_options, &cert_status);
[email protected]dffe8242012-03-20 15:14:2710543
[email protected]dffe8242012-03-20 15:14:2710544 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
[email protected]dffe8242012-03-20 15:14:2710545 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
10546 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10547}
10548
10549TEST_F(HTTPSOCSPTest, Invalid) {
10550 if (!SystemSupportsOCSP()) {
10551 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
10552 return;
10553 }
10554
[email protected]ce7d0cbc2013-05-03 18:57:2210555 SpawnedTestServer::SSLOptions ssl_options(
10556 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5810557 ssl_options.ocsp_status =
10558 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
[email protected]dffe8242012-03-20 15:14:2710559
[email protected]924e9f92012-12-16 22:00:5310560 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1210561 DoConnection(ssl_options, &cert_status);
[email protected]dffe8242012-03-20 15:14:2710562
Eric Roman1b628daa2017-10-19 19:52:0410563#if defined(USE_BUILTIN_CERT_VERIFIER)
10564 // TODO(649017): This test uses soft-fail revocation checking, but returns an
10565 // invalid OCSP response (can't parse). CertVerifyProcBuiltin currently
10566 // doesn't consider this a candidate for soft-fail (only considers
10567 // network-level failures as skippable).
10568 EXPECT_EQ(CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
10569 cert_status & CERT_STATUS_UNABLE_TO_CHECK_REVOCATION);
10570#else
[email protected]a13234c2012-03-20 21:45:0210571 EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
[email protected]dffe8242012-03-20 15:14:2710572 cert_status & CERT_STATUS_ALL_ERRORS);
Eric Roman1b628daa2017-10-19 19:52:0410573#endif
[email protected]dffe8242012-03-20 15:14:2710574
10575 // Without a positive OCSP response, we shouldn't show the EV status.
10576 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
10577 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10578}
[email protected]a13234c2012-03-20 21:45:0210579
davidbend1fb2f12014-11-08 02:51:0010580TEST_F(HTTPSOCSPTest, ValidStapled) {
mathpc992e602015-10-21 20:34:0310581 if (!SystemSupportsOCSPStapling()) {
davidbend1fb2f12014-11-08 02:51:0010582 LOG(WARNING)
10583 << "Skipping test because system doesn't support OCSP stapling";
10584 return;
10585 }
10586
10587 SpawnedTestServer::SSLOptions ssl_options(
10588 SpawnedTestServer::SSLOptions::CERT_AUTO);
10589 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
10590 ssl_options.staple_ocsp_response = true;
10591 ssl_options.ocsp_server_unavailable = true;
10592
10593 CertStatus cert_status;
10594 DoConnection(ssl_options, &cert_status);
10595
10596 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
10597
10598 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
10599 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
10600
10601 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10602}
10603
davidben6c3191b2014-11-21 22:38:0410604// Disabled on NSS ports. See https://crbug.com/431716.
davidben71f35ff2015-04-17 20:54:4810605#if defined(USE_NSS_CERTS)
davidben6c3191b2014-11-21 22:38:0410606#define MAYBE_RevokedStapled DISABLED_RevokedStapled
10607#else
10608#define MAYBE_RevokedStapled RevokedStapled
10609#endif
10610TEST_F(HTTPSOCSPTest, MAYBE_RevokedStapled) {
mathpc992e602015-10-21 20:34:0310611 if (!SystemSupportsOCSPStapling()) {
davidbend1fb2f12014-11-08 02:51:0010612 LOG(WARNING)
10613 << "Skipping test because system doesn't support OCSP stapling";
10614 return;
10615 }
10616
10617 SpawnedTestServer::SSLOptions ssl_options(
10618 SpawnedTestServer::SSLOptions::CERT_AUTO);
10619 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
10620 ssl_options.staple_ocsp_response = true;
10621 ssl_options.ocsp_server_unavailable = true;
10622
10623 CertStatus cert_status;
10624 DoConnection(ssl_options, &cert_status);
10625
10626 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
10627 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
10628 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10629}
10630
dadriand476e652016-07-26 21:33:2410631TEST_F(HTTPSOCSPTest, ExpectStapleReportSentOnMissing) {
Martijn Croonenb1383da2017-10-11 11:56:3510632 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
10633
dadriand476e652016-07-26 21:33:2410634 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10635 https_test_server.SetSSLConfig(
10636 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10637 https_test_server.ServeFilesFromSourceDirectory(
10638 base::FilePath(kTestFilePath));
10639 ASSERT_TRUE(https_test_server.Start());
10640
10641 // Set up a MockCertVerifier to accept the certificate that the server sends,
10642 // but not provide any OCSP information.
10643 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10644 ASSERT_TRUE(cert);
10645 MockCertVerifier cert_verifier;
10646 CertVerifyResult verify_result;
10647 verify_result.verified_cert = cert;
10648 verify_result.is_issued_by_known_root = true;
10649 verify_result.ocsp_result.response_status = OCSPVerifyResult::MISSING;
10650 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
10651
10652 // Catch the Expect-Staple report.
10653 TransportSecurityState transport_security_state;
10654 MockCertificateReportSender mock_report_sender;
10655 transport_security_state.SetReportSender(&mock_report_sender);
10656
10657 // Use a MockHostResolver (which by default maps all hosts to 127.0.0.1) so
10658 // that the request can be sent to a site on the Expect-Staple preload list.
10659 MockHostResolver host_resolver;
10660 TestNetworkDelegate network_delegate;
10661 TestURLRequestContext context(true);
10662 context.set_host_resolver(&host_resolver);
10663 context.set_transport_security_state(&transport_security_state);
10664 context.set_network_delegate(&network_delegate);
10665 context.set_cert_verifier(&cert_verifier);
10666 context.Init();
10667
10668 // Now send a request to trigger the violation.
10669 TestDelegate d;
10670 GURL url = https_test_server.GetURL("/");
10671 GURL::Replacements replace_host;
10672 replace_host.SetHostStr(kExpectStapleStaticHostname);
10673 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610674 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
10675 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
dadriand476e652016-07-26 21:33:2410676 violating_request->Start();
10677 base::RunLoop().Run();
10678
10679 // Confirm a report was sent.
10680 EXPECT_FALSE(mock_report_sender.latest_report().empty());
10681 EXPECT_EQ(GURL(kExpectStapleReportURI),
10682 mock_report_sender.latest_report_uri());
10683}
10684
estark13e0b312016-12-22 23:52:3210685// Tests that Expect-Staple reports are not sent for connections on which there
10686// is a certificate error.
10687TEST_F(HTTPSOCSPTest, ExpectStapleReportNotSentOnMissingWithCertError) {
10688 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10689 https_test_server.SetSSLConfig(
10690 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10691 https_test_server.ServeFilesFromSourceDirectory(
10692 base::FilePath(kTestFilePath));
10693 ASSERT_TRUE(https_test_server.Start());
10694
10695 // Set up a MockCertVerifier to report an error for the certificate
10696 // and indicate that there was no stapled OCSP response.
10697 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10698 ASSERT_TRUE(cert);
10699 MockCertVerifier cert_verifier;
10700 CertVerifyResult verify_result;
10701 verify_result.cert_status = CERT_STATUS_DATE_INVALID;
10702 verify_result.verified_cert = cert;
10703 verify_result.is_issued_by_known_root = true;
10704 verify_result.ocsp_result.response_status = OCSPVerifyResult::MISSING;
10705 cert_verifier.AddResultForCert(cert.get(), verify_result,
10706 ERR_CERT_DATE_INVALID);
10707
10708 // Set up a mock report sender so that the test can check that an
10709 // Expect-Staple report is not sent.
10710 TransportSecurityState transport_security_state;
10711 MockCertificateReportSender mock_report_sender;
10712 transport_security_state.SetReportSender(&mock_report_sender);
10713
10714 TestNetworkDelegate network_delegate;
10715 TestURLRequestContext context(true);
10716
10717 // Force |kExpectStapleStaticHostname| to resolve to |https_test_server|.
10718 MockHostResolver host_resolver;
10719 context.set_host_resolver(&host_resolver);
10720
10721 context.set_transport_security_state(&transport_security_state);
10722 context.set_network_delegate(&network_delegate);
10723 context.set_cert_verifier(&cert_verifier);
10724 context.Init();
10725
10726 // Make a connection to |kExpectStapleStaticHostname|. Because the
10727 // |verify_result| used with the |cert_verifier| will indicate a certificate
10728 // error, an Expect-Staple report should not be sent.
10729 TestDelegate d;
10730 GURL url = https_test_server.GetURL("/");
10731 GURL::Replacements replace_host;
10732 replace_host.SetHostStr(kExpectStapleStaticHostname);
10733 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610734 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
10735 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark13e0b312016-12-22 23:52:3210736 violating_request->Start();
10737 base::RunLoop().Run();
10738
10739 // Confirm a report was not sent.
10740 EXPECT_TRUE(mock_report_sender.latest_report().empty());
10741 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
10742}
10743
dadriand476e652016-07-26 21:33:2410744TEST_F(HTTPSOCSPTest, ExpectStapleReportNotSentOnValid) {
10745 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10746 https_test_server.SetSSLConfig(
10747 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10748 https_test_server.ServeFilesFromSourceDirectory(
10749 base::FilePath(kTestFilePath));
10750 ASSERT_TRUE(https_test_server.Start());
10751
10752 // Set up a MockCertVerifier to accept the certificate that the server sends,
10753 // and provide GOOD revocation status.
10754 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10755 ASSERT_TRUE(cert);
10756 MockCertVerifier cert_verifier;
10757 CertVerifyResult verify_result;
10758 verify_result.verified_cert = cert;
10759 verify_result.is_issued_by_known_root = true;
10760 verify_result.ocsp_result.response_status = OCSPVerifyResult::PROVIDED;
10761 verify_result.ocsp_result.revocation_status = OCSPRevocationStatus::GOOD;
10762 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
10763
10764 // Catch the Expect-Staple report.
10765 TransportSecurityState transport_security_state;
10766 MockCertificateReportSender mock_report_sender;
10767 transport_security_state.SetReportSender(&mock_report_sender);
10768
10769 // Use a MockHostResolver (which by default maps all hosts to 127.0.0.1) so
10770 // that the request can be sent to a site on the Expect-Staple preload list.
10771 MockHostResolver host_resolver;
10772 TestNetworkDelegate network_delegate;
10773 TestURLRequestContext context(true);
10774 context.set_host_resolver(&host_resolver);
10775 context.set_transport_security_state(&transport_security_state);
10776 context.set_network_delegate(&network_delegate);
10777 context.set_cert_verifier(&cert_verifier);
10778 context.Init();
10779
10780 // This request should not not trigger an Expect-Staple violation.
10781 TestDelegate d;
10782 GURL url = https_test_server.GetURL("/");
10783 GURL::Replacements replace_host;
10784 replace_host.SetHostStr(kExpectStapleStaticHostname);
10785 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610786 std::unique_ptr<URLRequest> ok_request(context.CreateRequest(
10787 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
dadriand476e652016-07-26 21:33:2410788 ok_request->Start();
10789 base::RunLoop().Run();
10790
10791 // Check that no report was sent.
10792 EXPECT_TRUE(mock_report_sender.latest_report().empty());
10793 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
10794}
10795
estark13e0b312016-12-22 23:52:3210796// Tests that an Expect-Staple report is not sent when OCSP details are not
10797// checked on the connection.
10798TEST_F(HTTPSOCSPTest, ExpectStapleReportNotSentOnNotChecked) {
10799 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10800 https_test_server.SetSSLConfig(
10801 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10802 https_test_server.ServeFilesFromSourceDirectory(
10803 base::FilePath(kTestFilePath));
10804 ASSERT_TRUE(https_test_server.Start());
10805
10806 // Set up a MockCertVerifier to accept the certificate that the server sends,
10807 // and set |ocsp_result| to indicate that OCSP stapling details were not
10808 // checked on the connection.
10809 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10810 ASSERT_TRUE(cert);
10811 MockCertVerifier cert_verifier;
10812 CertVerifyResult verify_result;
10813 verify_result.verified_cert = cert;
10814 verify_result.is_issued_by_known_root = true;
10815 verify_result.ocsp_result.response_status = OCSPVerifyResult::NOT_CHECKED;
10816 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
10817
10818 // Set up a mock report sender so that the test can check that an
10819 // Expect-Staple report is not sent.
10820 TransportSecurityState transport_security_state;
10821 MockCertificateReportSender mock_report_sender;
10822 transport_security_state.SetReportSender(&mock_report_sender);
10823
10824 TestNetworkDelegate network_delegate;
10825 TestURLRequestContext context(true);
10826
10827 // Force |kExpectStapleStaticHostname| to resolve to |https_test_server|.
10828 MockHostResolver host_resolver;
10829 context.set_host_resolver(&host_resolver);
10830
10831 context.set_transport_security_state(&transport_security_state);
10832 context.set_network_delegate(&network_delegate);
10833 context.set_cert_verifier(&cert_verifier);
10834 context.Init();
10835
10836 // Make a connection to |kExpectStapleStaticHostname|. Because the
10837 // |verify_result| used with the |cert_verifier| will indicate that OCSP
10838 // stapling details were not checked on the connection, an Expect-Staple
10839 // report should not be sent.
10840 TestDelegate d;
10841 GURL url = https_test_server.GetURL("/");
10842 GURL::Replacements replace_host;
10843 replace_host.SetHostStr(kExpectStapleStaticHostname);
10844 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610845 std::unique_ptr<URLRequest> ok_request(context.CreateRequest(
10846 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark13e0b312016-12-22 23:52:3210847 ok_request->Start();
10848 base::RunLoop().Run();
10849
10850 // Check that no report was sent.
10851 EXPECT_TRUE(mock_report_sender.latest_report().empty());
10852 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
10853}
10854
dadrian612337a2016-07-20 22:36:5810855static const struct OCSPVerifyTestData {
10856 std::vector<SpawnedTestServer::SSLOptions::OCSPSingleResponse> ocsp_responses;
10857 SpawnedTestServer::SSLOptions::OCSPProduced ocsp_produced;
10858 OCSPVerifyResult::ResponseStatus response_status;
10859 bool has_revocation_status;
10860 OCSPRevocationStatus cert_status;
10861} kOCSPVerifyData[] = {
Eric Roman8673b812017-09-20 18:57:3110862 // 0
dadrian612337a2016-07-20 22:36:5810863 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10864 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10865 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10866 OCSPVerifyResult::PROVIDED,
10867 true,
10868 OCSPRevocationStatus::GOOD},
10869
Eric Roman8673b812017-09-20 18:57:3110870 // 1
dadrian612337a2016-07-20 22:36:5810871 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10872 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD}},
10873 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10874 OCSPVerifyResult::INVALID_DATE,
10875 false,
10876 OCSPRevocationStatus::UNKNOWN},
10877
Eric Roman8673b812017-09-20 18:57:3110878 // 2
dadrian612337a2016-07-20 22:36:5810879 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10880 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
10881 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10882 OCSPVerifyResult::INVALID_DATE,
10883 false,
10884 OCSPRevocationStatus::UNKNOWN},
10885
Eric Roman8673b812017-09-20 18:57:3110886 // 3
dadrian612337a2016-07-20 22:36:5810887 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10888 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
10889 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10890 OCSPVerifyResult::INVALID_DATE,
10891 false,
10892 OCSPRevocationStatus::UNKNOWN},
10893
Eric Roman8673b812017-09-20 18:57:3110894 // 4
dadrian612337a2016-07-20 22:36:5810895 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10896 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
10897 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10898 OCSPVerifyResult::INVALID_DATE,
10899 false,
10900 OCSPRevocationStatus::UNKNOWN},
10901
Eric Roman8673b812017-09-20 18:57:3110902 // 5
dadrian612337a2016-07-20 22:36:5810903 {{{SpawnedTestServer::SSLOptions::OCSP_TRY_LATER,
10904 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10905 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10906 OCSPVerifyResult::ERROR_RESPONSE,
10907 false,
10908 OCSPRevocationStatus::UNKNOWN},
10909
Eric Roman8673b812017-09-20 18:57:3110910 // 6
dadrian612337a2016-07-20 22:36:5810911 {{{SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE,
10912 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10913 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10914 OCSPVerifyResult::PARSE_RESPONSE_ERROR,
10915 false,
10916 OCSPRevocationStatus::UNKNOWN},
10917
Eric Roman8673b812017-09-20 18:57:3110918 // 7
dadrian612337a2016-07-20 22:36:5810919 {{{SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE_DATA,
10920 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10921 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10922 OCSPVerifyResult::PARSE_RESPONSE_DATA_ERROR,
10923 false,
10924 OCSPRevocationStatus::UNKNOWN},
10925
Eric Roman8673b812017-09-20 18:57:3110926 // 8
dadrian612337a2016-07-20 22:36:5810927 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
10928 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
10929 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10930 OCSPVerifyResult::INVALID_DATE,
10931 false,
10932 OCSPRevocationStatus::UNKNOWN},
10933
Eric Roman8673b812017-09-20 18:57:3110934 // 9
dadrian612337a2016-07-20 22:36:5810935 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
10936 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10937 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10938 OCSPVerifyResult::PROVIDED,
10939 true,
10940 OCSPRevocationStatus::UNKNOWN},
10941
Eric Roman8673b812017-09-20 18:57:3110942 // 10
dadrian612337a2016-07-20 22:36:5810943 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
10944 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD}},
10945 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10946 OCSPVerifyResult::INVALID_DATE,
10947 false,
10948 OCSPRevocationStatus::UNKNOWN},
10949
Eric Roman8673b812017-09-20 18:57:3110950 // 11
dadrian612337a2016-07-20 22:36:5810951 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
10952 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
10953 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10954 OCSPVerifyResult::INVALID_DATE,
10955 false,
10956 OCSPRevocationStatus::UNKNOWN},
10957
Eric Roman8673b812017-09-20 18:57:3110958 // 12
dadrian612337a2016-07-20 22:36:5810959 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10960 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10961 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_BEFORE_CERT,
10962 OCSPVerifyResult::BAD_PRODUCED_AT,
10963 false,
10964 OCSPRevocationStatus::UNKNOWN},
10965
Eric Roman8673b812017-09-20 18:57:3110966 // 13
dadrian612337a2016-07-20 22:36:5810967 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10968 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10969 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_AFTER_CERT,
10970 OCSPVerifyResult::BAD_PRODUCED_AT,
10971 false,
10972 OCSPRevocationStatus::UNKNOWN},
10973
Eric Roman8673b812017-09-20 18:57:3110974 // 14
dadrian612337a2016-07-20 22:36:5810975 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10976 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10977 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_AFTER_CERT,
10978 OCSPVerifyResult::BAD_PRODUCED_AT,
10979 false,
10980 OCSPRevocationStatus::UNKNOWN},
10981
Eric Roman8673b812017-09-20 18:57:3110982 // 15
dadrian612337a2016-07-20 22:36:5810983 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10984 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10985 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10986 OCSPVerifyResult::PROVIDED,
10987 true,
10988 OCSPRevocationStatus::GOOD},
10989
Eric Roman8673b812017-09-20 18:57:3110990 // 16
dadrian612337a2016-07-20 22:36:5810991 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10992 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD},
10993 {SpawnedTestServer::SSLOptions::OCSP_OK,
10994 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10995 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10996 OCSPVerifyResult::PROVIDED,
10997 true,
10998 OCSPRevocationStatus::GOOD},
10999
Eric Roman8673b812017-09-20 18:57:3111000 // 17
dadrian612337a2016-07-20 22:36:5811001 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11002 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY},
11003 {SpawnedTestServer::SSLOptions::OCSP_OK,
11004 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11005 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11006 OCSPVerifyResult::PROVIDED,
11007 true,
11008 OCSPRevocationStatus::GOOD},
11009
Eric Roman8673b812017-09-20 18:57:3111010 // 18
dadrian612337a2016-07-20 22:36:5811011 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11012 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG},
11013 {SpawnedTestServer::SSLOptions::OCSP_OK,
11014 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11015 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11016 OCSPVerifyResult::PROVIDED,
11017 true,
11018 OCSPRevocationStatus::GOOD},
11019
Eric Roman8673b812017-09-20 18:57:3111020 // 19
dadrian612337a2016-07-20 22:36:5811021 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11022 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY},
11023 {SpawnedTestServer::SSLOptions::OCSP_OK,
11024 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD},
11025 {SpawnedTestServer::SSLOptions::OCSP_OK,
11026 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
11027 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11028 OCSPVerifyResult::INVALID_DATE,
11029 false,
11030 OCSPRevocationStatus::UNKNOWN},
11031
Eric Roman8673b812017-09-20 18:57:3111032 // 20
dadrian612337a2016-07-20 22:36:5811033 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11034 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11035 {SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11036 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11037 {SpawnedTestServer::SSLOptions::OCSP_OK,
11038 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11039 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11040 OCSPVerifyResult::PROVIDED,
11041 true,
11042 OCSPRevocationStatus::REVOKED},
11043
Eric Roman8673b812017-09-20 18:57:3111044 // 21
dadrian612337a2016-07-20 22:36:5811045 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11046 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11047 {SpawnedTestServer::SSLOptions::OCSP_OK,
11048 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11049 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11050 OCSPVerifyResult::PROVIDED,
11051 true,
11052 OCSPRevocationStatus::UNKNOWN},
11053
Eric Roman8673b812017-09-20 18:57:3111054 // 22
dadrian612337a2016-07-20 22:36:5811055 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11056 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11057 {SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11058 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG},
11059 {SpawnedTestServer::SSLOptions::OCSP_OK,
11060 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11061 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11062 OCSPVerifyResult::PROVIDED,
11063 true,
11064 OCSPRevocationStatus::UNKNOWN},
11065
Eric Roman8673b812017-09-20 18:57:3111066 // 23
dadrian612337a2016-07-20 22:36:5811067 {{{SpawnedTestServer::SSLOptions::OCSP_MISMATCHED_SERIAL,
11068 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11069 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11070 OCSPVerifyResult::NO_MATCHING_RESPONSE,
11071 false,
11072 OCSPRevocationStatus::UNKNOWN},
11073
Eric Roman8673b812017-09-20 18:57:3111074 // 24
dadrian612337a2016-07-20 22:36:5811075 {{{SpawnedTestServer::SSLOptions::OCSP_MISMATCHED_SERIAL,
11076 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
11077 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11078 OCSPVerifyResult::NO_MATCHING_RESPONSE,
11079 false,
11080 OCSPRevocationStatus::UNKNOWN},
11081
Eric Roman8673b812017-09-20 18:57:3111082// These tests fail when using NSS for certificate verification, as NSS fails
11083// and doesn't return the partial path. As a result the OCSP checks being done
11084// at the CertVerifyProc layer cannot access the issuer certificate.
11085#if !defined(USE_NSS_CERTS)
11086 // 25
11087 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11088 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11089 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11090 OCSPVerifyResult::PROVIDED,
11091 true,
11092 OCSPRevocationStatus::REVOKED},
11093
11094 // 26
11095 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11096 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD}},
11097 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11098 OCSPVerifyResult::INVALID_DATE,
11099 false,
11100 OCSPRevocationStatus::UNKNOWN},
11101
11102 // 27
11103 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11104 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
11105 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11106 OCSPVerifyResult::INVALID_DATE,
11107 false,
11108 OCSPRevocationStatus::UNKNOWN},
11109#endif
dadrian612337a2016-07-20 22:36:5811110};
11111
11112class HTTPSOCSPVerifyTest
11113 : public HTTPSOCSPTest,
11114 public testing::WithParamInterface<OCSPVerifyTestData> {};
11115
11116TEST_P(HTTPSOCSPVerifyTest, VerifyResult) {
11117 SpawnedTestServer::SSLOptions ssl_options(
11118 SpawnedTestServer::SSLOptions::CERT_AUTO);
11119 OCSPVerifyTestData test = GetParam();
11120
11121 ssl_options.ocsp_responses = test.ocsp_responses;
11122 ssl_options.ocsp_produced = test.ocsp_produced;
11123 ssl_options.staple_ocsp_response = true;
11124
11125 SSLInfo ssl_info;
11126 OCSPErrorTestDelegate delegate;
11127 ASSERT_NO_FATAL_FAILURE(
11128 DoConnectionWithDelegate(ssl_options, &delegate, &ssl_info));
11129
11130 // The SSLInfo must be extracted from |delegate| on error, due to how
11131 // URLRequest caches certificate errors.
11132 if (delegate.have_certificate_errors()) {
11133 ASSERT_TRUE(delegate.on_ssl_certificate_error_called());
11134 ssl_info = delegate.ssl_info();
11135 }
11136
11137 EXPECT_EQ(test.response_status, ssl_info.ocsp_result.response_status);
11138
11139 if (test.has_revocation_status)
11140 EXPECT_EQ(test.cert_status, ssl_info.ocsp_result.revocation_status);
11141}
11142
11143INSTANTIATE_TEST_CASE_P(OCSPVerify,
11144 HTTPSOCSPVerifyTest,
11145 testing::ValuesIn(kOCSPVerifyData));
11146
mattm0b12a6f2016-11-29 19:57:1611147static bool SystemSupportsAIA() {
Eric Romanefddd0a2017-10-10 02:14:2511148#if defined(OS_ANDROID) || defined(USE_BUILTIN_CERT_VERIFIER)
Sergey Ulanov884169a02017-09-06 18:58:0211149 // TODO(crbug.com/762380): Enable on Fuchsia once it's implemented.
mattm0b12a6f2016-11-29 19:57:1611150 return false;
11151#else
11152 return true;
11153#endif
11154}
11155
11156class HTTPSAIATest : public HTTPSOCSPTest {
11157 public:
11158 void SetupContext() override {
11159 context_.set_ssl_config_service(new TestSSLConfigService(
11160 false /* check for EV */, false /* online revocation checking */,
11161 false /* require rev. checking for local anchors */,
11162 false /* token binding enabled */));
11163 }
11164};
11165
11166TEST_F(HTTPSAIATest, AIAFetching) {
11167 SpawnedTestServer::SSLOptions ssl_options(
11168 SpawnedTestServer::SSLOptions::CERT_AUTO_AIA_INTERMEDIATE);
11169 SpawnedTestServer test_server(
11170 SpawnedTestServer::TYPE_HTTPS, ssl_options,
11171 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
11172 ASSERT_TRUE(test_server.Start());
11173
11174 TestDelegate d;
11175 d.set_allow_certificate_errors(true);
11176 std::unique_ptr<URLRequest> r(context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611177 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
11178 TRAFFIC_ANNOTATION_FOR_TESTS));
mattm0b12a6f2016-11-29 19:57:1611179
11180 r->Start();
11181 EXPECT_TRUE(r->is_pending());
11182
11183 base::RunLoop().Run();
11184
11185 EXPECT_EQ(1, d.response_started_count());
11186
11187 CertStatus cert_status = r->ssl_info().cert_status;
11188 if (SystemSupportsAIA()) {
11189 EXPECT_EQ(OK, d.request_status());
11190 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11191 ASSERT_TRUE(r->ssl_info().cert);
11192 EXPECT_EQ(2u, r->ssl_info().cert->GetIntermediateCertificates().size());
11193 } else {
11194 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID,
11195 cert_status & CERT_STATUS_ALL_ERRORS);
11196 }
11197 ASSERT_TRUE(r->ssl_info().unverified_cert);
11198 EXPECT_EQ(
11199 0u, r->ssl_info().unverified_cert->GetIntermediateCertificates().size());
11200}
11201
[email protected]3a86a712013-07-30 07:16:2011202class HTTPSHardFailTest : public HTTPSOCSPTest {
11203 protected:
rsleevid6de8302016-06-21 01:33:2011204 void SetupContext() override {
11205 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1411206 false /* check for EV */, false /* online revocation checking */,
11207 true /* require rev. checking for local
11208 anchors */,
11209 false /* token binding enabled */));
[email protected]3a86a712013-07-30 07:16:2011210 }
11211};
11212
[email protected]3a86a712013-07-30 07:16:2011213TEST_F(HTTPSHardFailTest, FailsOnOCSPInvalid) {
11214 if (!SystemSupportsOCSP()) {
11215 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11216 return;
11217 }
11218
11219 if (!SystemSupportsHardFailRevocationChecking()) {
11220 LOG(WARNING) << "Skipping test because system doesn't support hard fail "
11221 << "revocation checking";
11222 return;
11223 }
11224
11225 SpawnedTestServer::SSLOptions ssl_options(
11226 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811227 ssl_options.ocsp_status =
11228 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
[email protected]3a86a712013-07-30 07:16:2011229
11230 CertStatus cert_status;
11231 DoConnection(ssl_options, &cert_status);
11232
Eric Roman1b628daa2017-10-19 19:52:0411233#if defined(USE_BUILTIN_CERT_VERIFIER)
11234 // TODO(crbug.com/649017): Should we consider invalid response as
11235 // affirmatively revoked?
11236 EXPECT_EQ(CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
11237 cert_status & CERT_STATUS_UNABLE_TO_CHECK_REVOCATION);
11238#else
11239 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_REVOKED);
11240#endif
[email protected]3a86a712013-07-30 07:16:2011241
11242 // Without a positive OCSP response, we shouldn't show the EV status.
Eric Roman1b628daa2017-10-19 19:52:0411243 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]3a86a712013-07-30 07:16:2011244 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
11245}
11246
[email protected]a13234c2012-03-20 21:45:0211247class HTTPSEVCRLSetTest : public HTTPSOCSPTest {
11248 protected:
rsleevid6de8302016-06-21 01:33:2011249 void SetupContext() override {
11250 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1411251 true /* check for EV */, false /* online revocation checking */,
11252 false /* require rev. checking for local
11253 anchors */,
11254 false /* token binding enabled */));
[email protected]a13234c2012-03-20 21:45:0211255 }
11256};
11257
Eric Romane2243cc62017-10-17 03:59:1311258// Helper class to set the global CRLSet, and on destruction restore the
11259// previously set one.
11260class ScopedSetCRLSet {
11261 public:
11262 ScopedSetCRLSet(scoped_refptr<CRLSet> crl_set) {
11263 prev_crl_set_ = SSLConfigService::GetCRLSet();
11264 SSLConfigService::SetCRLSetForTesting(std::move(crl_set));
11265 }
11266
11267 ~ScopedSetCRLSet() {
11268 SSLConfigService::SetCRLSetForTesting(std::move(prev_crl_set_));
11269 }
11270
11271 private:
11272 scoped_refptr<CRLSet> prev_crl_set_;
11273};
11274
[email protected]a13234c2012-03-20 21:45:0211275TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) {
11276 if (!SystemSupportsOCSP()) {
11277 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11278 return;
11279 }
11280
[email protected]ce7d0cbc2013-05-03 18:57:2211281 SpawnedTestServer::SSLOptions ssl_options(
11282 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811283 ssl_options.ocsp_status =
11284 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311285 ScopedSetCRLSet set_crlset(nullptr);
[email protected]a13234c2012-03-20 21:45:0211286
[email protected]924e9f92012-12-16 22:00:5311287 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211288 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211289
mattmaf868e72016-09-23 23:25:2011290 EXPECT_EQ(ExpectedCertStatusForFailedOnlineEVRevocationCheck(),
[email protected]a13234c2012-03-20 21:45:0211291 cert_status & CERT_STATUS_ALL_ERRORS);
11292
11293 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]b6f2de32012-08-17 04:35:0811294 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11295 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211296}
11297
[email protected]be0fff62013-08-29 23:37:4811298TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndRevokedOCSP) {
11299 if (!SystemSupportsOCSP()) {
11300 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11301 return;
11302 }
11303
11304 SpawnedTestServer::SSLOptions ssl_options(
11305 SpawnedTestServer::SSLOptions::CERT_AUTO);
11306 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
Eric Romane2243cc62017-10-17 03:59:1311307 ScopedSetCRLSet set_crlset(nullptr);
[email protected]be0fff62013-08-29 23:37:4811308
11309 CertStatus cert_status;
11310 DoConnection(ssl_options, &cert_status);
11311
mattm1a282f52016-11-10 21:49:4211312// Currently only works for Windows and OS X. When using NSS, it's not
11313// possible to determine whether the check failed because of actual
11314// revocation or because there was an OCSP failure.
11315#if defined(OS_WIN) || defined(OS_MACOSX)
[email protected]be0fff62013-08-29 23:37:4811316 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
11317#else
11318 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11319#endif
11320
11321 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11322 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11323 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
11324}
11325
[email protected]a13234c2012-03-20 21:45:0211326TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) {
11327 if (!SystemSupportsOCSP()) {
11328 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11329 return;
11330 }
11331
[email protected]ce7d0cbc2013-05-03 18:57:2211332 SpawnedTestServer::SSLOptions ssl_options(
11333 SpawnedTestServer::SSLOptions::CERT_AUTO);
11334 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
Eric Romane2243cc62017-10-17 03:59:1311335 ScopedSetCRLSet set_crlset(nullptr);
[email protected]a13234c2012-03-20 21:45:0211336
11337 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211338 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211339
11340 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11341
11342 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11343 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
[email protected]b6f2de32012-08-17 04:35:0811344 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11345 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211346}
11347
11348TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) {
11349 if (!SystemSupportsOCSP()) {
11350 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11351 return;
11352 }
11353
[email protected]ce7d0cbc2013-05-03 18:57:2211354 SpawnedTestServer::SSLOptions ssl_options(
11355 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811356 ssl_options.ocsp_status =
11357 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311358 ScopedSetCRLSet set_crlset(CRLSet::ExpiredCRLSetForTesting());
[email protected]a13234c2012-03-20 21:45:0211359
11360 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211361 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211362
mattmaf868e72016-09-23 23:25:2011363 EXPECT_EQ(ExpectedCertStatusForFailedOnlineEVRevocationCheck(),
[email protected]a13234c2012-03-20 21:45:0211364 cert_status & CERT_STATUS_ALL_ERRORS);
11365
11366 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]b6f2de32012-08-17 04:35:0811367 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11368 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211369}
11370
[email protected]51523f52013-07-31 21:57:2811371TEST_F(HTTPSEVCRLSetTest, FreshCRLSetCovered) {
11372 if (!SystemSupportsOCSP()) {
11373 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11374 return;
11375 }
11376
11377 SpawnedTestServer::SSLOptions ssl_options(
11378 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811379 ssl_options.ocsp_status =
11380 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Adam Langleyea6d6782017-12-05 23:57:3311381 ScopedSetCRLSet set_crlset(
11382 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(
Adam Langleyea6d6782017-12-05 23:57:3311488 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}
Adam Langleyea6d6782017-12-05 23:57:3311500
11501TEST_F(HTTPSCRLSetTest, CRLSetRevokedBySubject) {
11502#if defined(OS_ANDROID)
11503 LOG(WARNING) << "Skipping test because system doesn't support CRLSets";
11504 return;
11505#endif
11506
11507 SpawnedTestServer::SSLOptions ssl_options(
11508 SpawnedTestServer::SSLOptions::CERT_AUTO);
11509 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
11510 static const char kCommonName[] = "Test CN";
11511 ssl_options.cert_common_name = kCommonName;
11512
11513 {
11514 ScopedSetCRLSet set_crlset(
11515 CRLSet::ForTesting(false, nullptr, "", kCommonName, {}));
11516
11517 CertStatus cert_status = 0;
11518 DoConnection(ssl_options, &cert_status);
11519
11520 // If the certificate is recorded as revoked in the CRLSet, that should be
11521 // reflected without online revocation checking.
11522 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
11523 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11524 EXPECT_FALSE(
11525 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
11526 }
11527
11528 const uint8_t kTestServerSPKISHA256[32] = {
11529 0xb3, 0x91, 0xac, 0x73, 0x32, 0x54, 0x7f, 0x7b, 0x8a, 0x62, 0x77,
11530 0x73, 0x1d, 0x45, 0x7b, 0x23, 0x46, 0x69, 0xef, 0x6f, 0x05, 0x3d,
11531 0x07, 0x22, 0x15, 0x18, 0xd6, 0x10, 0x8b, 0xa1, 0x49, 0x33,
11532 };
11533 const std::string spki_hash(
11534 reinterpret_cast<const char*>(kTestServerSPKISHA256),
11535 sizeof(kTestServerSPKISHA256));
11536
11537 {
11538 ScopedSetCRLSet set_crlset(
11539 CRLSet::ForTesting(false, nullptr, "", kCommonName, {spki_hash}));
11540
11541 CertStatus cert_status = 0;
11542 DoConnection(ssl_options, &cert_status);
11543
11544 // When the correct SPKI hash is specified, the connection should succeed
11545 // even though the subject is listed in the CRLSet.
11546 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11547 }
11548}
[email protected]316c1e5e2012-09-12 15:17:4411549#endif // !defined(OS_IOS)
[email protected]dffe8242012-03-20 15:14:2711550
Sergey Ulanovc4580e72017-09-13 23:30:1111551#if !BUILDFLAG(DISABLE_FTP_SUPPORT) && !defined(OS_ANDROID) && \
11552 !defined(OS_FUCHSIA)
11553// FTP uses a second TCP connection with the port number allocated dynamically
11554// on the server side, so it would be hard to make RemoteTestServer proxy FTP
11555// connections reliably. FTP tests are disabled on platforms that use
11556// RemoteTestServer. See http://crbug.com/495220
[email protected]b89ca032009-08-31 21:41:3111557class URLRequestTestFTP : public URLRequestTest {
[email protected]95409e12010-08-17 20:07:1111558 public:
[email protected]d9fca99a2012-02-24 16:16:2011559 URLRequestTestFTP()
mmenkecd4c7532016-10-19 18:36:0511560 : ftp_test_server_(SpawnedTestServer::TYPE_FTP,
tommycli59a63432015-11-06 00:10:5511561 base::FilePath(kTestFilePath)) {
mmenke9f2ec60c2015-06-01 20:59:4711562 // Can't use |default_context_|'s HostResolver to set up the
11563 // FTPTransactionFactory because it hasn't been created yet.
11564 default_context_.set_host_resolver(&host_resolver_);
11565 }
11566
11567 // URLRequestTest interface:
11568 void SetUpFactory() override {
11569 // Add FTP support to the default URLRequestContext.
11570 job_factory_impl_->SetProtocolHandler(
mmenkecd4c7532016-10-19 18:36:0511571 "ftp", FtpProtocolHandler::Create(&host_resolver_));
mmenke9f2ec60c2015-06-01 20:59:4711572 }
11573
11574 std::string GetTestFileContents() {
11575 base::FilePath path;
11576 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &path));
11577 path = path.Append(kTestFilePath);
11578 path = path.AppendASCII(kFtpTestFile);
11579 std::string contents;
11580 EXPECT_TRUE(base::ReadFileToString(path, &contents));
11581 return contents;
[email protected]95409e12010-08-17 20:07:1111582 }
11583
[email protected]b89ca032009-08-31 21:41:3111584 protected:
mmenkecd4c7532016-10-19 18:36:0511585 // Note that this is destroyed before the FtpProtocolHandler that references
11586 // it, which is owned by the parent class. Since no requests are made during
11587 // teardown, this works, though it's not great.
mmenke9f2ec60c2015-06-01 20:59:4711588 MockHostResolver host_resolver_;
mmenke9f2ec60c2015-06-01 20:59:4711589
tommycli59a63432015-11-06 00:10:5511590 SpawnedTestServer ftp_test_server_;
[email protected]b89ca032009-08-31 21:41:3111591};
11592
[email protected]d2a133182012-08-05 16:44:0811593// Make sure an FTP request using an unsafe ports fails.
[email protected]f2f31b32013-01-16 23:24:0911594TEST_F(URLRequestTestFTP, UnsafePort) {
[email protected]d2a133182012-08-05 16:44:0811595 GURL url("ftp://127.0.0.1:7");
[email protected]d2a133182012-08-05 16:44:0811596
11597 TestDelegate d;
11598 {
rhalavatib7bd7c792017-04-27 05:25:1611599 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
11600 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911601 r->Start();
11602 EXPECT_TRUE(r->is_pending());
[email protected]d2a133182012-08-05 16:44:0811603
[email protected]255620da2013-08-19 13:14:2911604 base::RunLoop().Run();
[email protected]d2a133182012-08-05 16:44:0811605
[email protected]f7022f32014-08-21 16:32:1911606 EXPECT_FALSE(r->is_pending());
maksim.sisovb53724b52016-09-16 05:30:5011607 EXPECT_EQ(ERR_UNSAFE_PORT, d.request_status());
[email protected]d2a133182012-08-05 16:44:0811608 }
11609}
11610
mmenke9f2ec60c2015-06-01 20:59:4711611TEST_F(URLRequestTestFTP, FTPDirectoryListing) {
tommycli59a63432015-11-06 00:10:5511612 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111613
[email protected]a25e90e2009-09-09 17:05:3711614 TestDelegate d;
11615 {
danakj8522a25b2016-04-16 00:17:3611616 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611617 ftp_test_server_.GetURL("/"), DEFAULT_PRIORITY, &d,
11618 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911619 r->Start();
11620 EXPECT_TRUE(r->is_pending());
[email protected]a25e90e2009-09-09 17:05:3711621
[email protected]255620da2013-08-19 13:14:2911622 base::RunLoop().Run();
[email protected]a25e90e2009-09-09 17:05:3711623
[email protected]f7022f32014-08-21 16:32:1911624 EXPECT_FALSE(r->is_pending());
[email protected]a25e90e2009-09-09 17:05:3711625 EXPECT_EQ(1, d.response_started_count());
11626 EXPECT_FALSE(d.received_data_before_response());
11627 EXPECT_LT(0, d.bytes_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]a25e90e2009-09-09 17:05:3711632 }
11633}
11634
mmenke9f2ec60c2015-06-01 20:59:4711635TEST_F(URLRequestTestFTP, FTPGetTestAnonymous) {
tommycli59a63432015-11-06 00:10:5511636 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111637
[email protected]dd265012009-01-08 20:45:2711638 TestDelegate d;
11639 {
danakj8522a25b2016-04-16 00:17:3611640 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611641 ftp_test_server_.GetURL(kFtpTestFile), DEFAULT_PRIORITY, &d,
11642 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911643 r->Start();
11644 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711645
[email protected]255620da2013-08-19 13:14:2911646 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711647
[email protected]f7022f32014-08-21 16:32:1911648 EXPECT_FALSE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711649 EXPECT_EQ(1, d.response_started_count());
11650 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711651 EXPECT_EQ(GetTestFileContents(), d.data_received());
tommycli59a63432015-11-06 00:10:5511652 EXPECT_EQ(ftp_test_server_.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:1911653 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:5511654 EXPECT_EQ(ftp_test_server_.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:1911655 r->GetSocketAddress().port());
[email protected]dd265012009-01-08 20:45:2711656 }
11657}
11658
mmenke9f2ec60c2015-06-01 20:59:4711659TEST_F(URLRequestTestFTP, FTPGetTest) {
tommycli59a63432015-11-06 00:10:5511660 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111661
[email protected]dd265012009-01-08 20:45:2711662 TestDelegate d;
11663 {
danakj8522a25b2016-04-16 00:17:3611664 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511665 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11666 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611667 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911668 r->Start();
11669 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711670
[email protected]255620da2013-08-19 13:14:2911671 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711672
[email protected]f7022f32014-08-21 16:32:1911673 EXPECT_FALSE(r->is_pending());
mmenke9f2ec60c2015-06-01 20:59:4711674 EXPECT_EQ(1, d.response_started_count());
11675 EXPECT_FALSE(d.received_data_before_response());
11676 EXPECT_EQ(GetTestFileContents(), d.data_received());
tommycli59a63432015-11-06 00:10:5511677 EXPECT_EQ(ftp_test_server_.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:1911678 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:5511679 EXPECT_EQ(ftp_test_server_.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:1911680 r->GetSocketAddress().port());
[email protected]58e32bb2013-01-21 18:23:2511681
11682 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:1911683 r->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:2511684 TestLoadTimingNoHttpResponse(load_timing_info);
[email protected]dd265012009-01-08 20:45:2711685 }
11686}
11687
mmenke9f2ec60c2015-06-01 20:59:4711688TEST_F(URLRequestTestFTP, FTPCheckWrongPassword) {
tommycli59a63432015-11-06 00:10:5511689 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111690
[email protected]dd265012009-01-08 20:45:2711691 TestDelegate d;
11692 {
danakj8522a25b2016-04-16 00:17:3611693 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511694 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11695 "wrong_password"),
rhalavatib7bd7c792017-04-27 05:25:1611696 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911697 r->Start();
11698 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711699
[email protected]255620da2013-08-19 13:14:2911700 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711701
[email protected]f7022f32014-08-21 16:32:1911702 EXPECT_FALSE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711703 EXPECT_EQ(1, d.response_started_count());
11704 EXPECT_FALSE(d.received_data_before_response());
11705 EXPECT_EQ(d.bytes_received(), 0);
11706 }
11707}
11708
mmenke9f2ec60c2015-06-01 20:59:4711709TEST_F(URLRequestTestFTP, FTPCheckWrongPasswordRestart) {
tommycli59a63432015-11-06 00:10:5511710 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111711
[email protected]8b8a197d2009-08-26 15:57:5811712 TestDelegate d;
11713 // Set correct login credentials. The delegate will be asked for them when
11714 // the initial login with wrong credentials will fail.
[email protected]f3cf9802011-10-28 18:44:5811715 d.set_credentials(AuthCredentials(kChrome, kChrome));
[email protected]8b8a197d2009-08-26 15:57:5811716 {
danakj8522a25b2016-04-16 00:17:3611717 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511718 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11719 "wrong_password"),
rhalavatib7bd7c792017-04-27 05:25:1611720 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911721 r->Start();
11722 EXPECT_TRUE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811723
[email protected]255620da2013-08-19 13:14:2911724 base::RunLoop().Run();
[email protected]8b8a197d2009-08-26 15:57:5811725
[email protected]f7022f32014-08-21 16:32:1911726 EXPECT_FALSE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811727 EXPECT_EQ(1, d.response_started_count());
11728 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711729 EXPECT_EQ(GetTestFileContents(), d.data_received());
[email protected]8b8a197d2009-08-26 15:57:5811730 }
11731}
11732
mmenke9f2ec60c2015-06-01 20:59:4711733TEST_F(URLRequestTestFTP, FTPCheckWrongUser) {
tommycli59a63432015-11-06 00:10:5511734 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111735
[email protected]dd265012009-01-08 20:45:2711736 TestDelegate d;
11737 {
danakj8522a25b2016-04-16 00:17:3611738 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511739 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "wrong_user",
11740 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611741 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911742 r->Start();
11743 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711744
[email protected]255620da2013-08-19 13:14:2911745 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711746
[email protected]f7022f32014-08-21 16:32:1911747 EXPECT_FALSE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711748 EXPECT_EQ(1, d.response_started_count());
11749 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711750 EXPECT_EQ(0, d.bytes_received());
[email protected]dd265012009-01-08 20:45:2711751 }
11752}
[email protected]8b8a197d2009-08-26 15:57:5811753
mmenke9f2ec60c2015-06-01 20:59:4711754TEST_F(URLRequestTestFTP, FTPCheckWrongUserRestart) {
tommycli59a63432015-11-06 00:10:5511755 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111756
[email protected]8b8a197d2009-08-26 15:57:5811757 TestDelegate d;
11758 // Set correct login credentials. The delegate will be asked for them when
11759 // the initial login with wrong credentials will fail.
[email protected]f3cf9802011-10-28 18:44:5811760 d.set_credentials(AuthCredentials(kChrome, kChrome));
[email protected]8b8a197d2009-08-26 15:57:5811761 {
danakj8522a25b2016-04-16 00:17:3611762 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511763 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "wrong_user",
11764 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611765 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911766 r->Start();
11767 EXPECT_TRUE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811768
[email protected]255620da2013-08-19 13:14:2911769 base::RunLoop().Run();
[email protected]8b8a197d2009-08-26 15:57:5811770
[email protected]f7022f32014-08-21 16:32:1911771 EXPECT_FALSE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811772 EXPECT_EQ(1, d.response_started_count());
11773 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711774 EXPECT_EQ(GetTestFileContents(), d.data_received());
[email protected]8b8a197d2009-08-26 15:57:5811775 }
11776}
[email protected]60a3df52009-09-22 16:13:2411777
mmenke9f2ec60c2015-06-01 20:59:4711778TEST_F(URLRequestTestFTP, FTPCacheURLCredentials) {
tommycli59a63432015-11-06 00:10:5511779 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111780
danakj8522a25b2016-04-16 00:17:3611781 std::unique_ptr<TestDelegate> d(new TestDelegate);
[email protected]60a3df52009-09-22 16:13:2411782 {
11783 // Pass correct login identity in the URL.
danakj8522a25b2016-04-16 00:17:3611784 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511785 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11786 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611787 DEFAULT_PRIORITY, d.get(), TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911788 r->Start();
11789 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411790
[email protected]255620da2013-08-19 13:14:2911791 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411792
[email protected]f7022f32014-08-21 16:32:1911793 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411794 EXPECT_EQ(1, d->response_started_count());
11795 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711796 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411797 }
11798
11799 d.reset(new TestDelegate);
11800 {
11801 // This request should use cached identity from previous request.
danakj8522a25b2016-04-16 00:17:3611802 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611803 ftp_test_server_.GetURL(kFtpTestFile), DEFAULT_PRIORITY, d.get(),
11804 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911805 r->Start();
11806 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411807
[email protected]255620da2013-08-19 13:14:2911808 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411809
[email protected]f7022f32014-08-21 16:32:1911810 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411811 EXPECT_EQ(1, d->response_started_count());
11812 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711813 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411814 }
11815}
11816
mmenke9f2ec60c2015-06-01 20:59:4711817TEST_F(URLRequestTestFTP, FTPCacheLoginBoxCredentials) {
tommycli59a63432015-11-06 00:10:5511818 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111819
danakj8522a25b2016-04-16 00:17:3611820 std::unique_ptr<TestDelegate> d(new TestDelegate);
[email protected]60a3df52009-09-22 16:13:2411821 // Set correct login credentials. The delegate will be asked for them when
11822 // the initial login with wrong credentials will fail.
[email protected]f3cf9802011-10-28 18:44:5811823 d->set_credentials(AuthCredentials(kChrome, kChrome));
[email protected]60a3df52009-09-22 16:13:2411824 {
danakj8522a25b2016-04-16 00:17:3611825 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511826 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11827 "wrong_password"),
rhalavatib7bd7c792017-04-27 05:25:1611828 DEFAULT_PRIORITY, d.get(), TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911829 r->Start();
11830 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411831
[email protected]255620da2013-08-19 13:14:2911832 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411833
[email protected]f7022f32014-08-21 16:32:1911834 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411835 EXPECT_EQ(1, d->response_started_count());
11836 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711837 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411838 }
11839
11840 // Use a new delegate without explicit credentials. The cached ones should be
11841 // used.
11842 d.reset(new TestDelegate);
11843 {
11844 // Don't pass wrong credentials in the URL, they would override valid cached
11845 // ones.
danakj8522a25b2016-04-16 00:17:3611846 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611847 ftp_test_server_.GetURL(kFtpTestFile), DEFAULT_PRIORITY, d.get(),
11848 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911849 r->Start();
11850 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411851
[email protected]255620da2013-08-19 13:14:2911852 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411853
[email protected]f7022f32014-08-21 16:32:1911854 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411855 EXPECT_EQ(1, d->response_started_count());
11856 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711857 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411858 }
11859}
ricea3a1c71f2016-06-17 10:05:2611860
11861TEST_F(URLRequestTestFTP, RawBodyBytes) {
11862 ASSERT_TRUE(ftp_test_server_.Start());
11863
11864 TestDelegate d;
11865 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611866 ftp_test_server_.GetURL("simple.html"), DEFAULT_PRIORITY, &d,
11867 TRAFFIC_ANNOTATION_FOR_TESTS));
ricea3a1c71f2016-06-17 10:05:2611868 req->Start();
11869 base::RunLoop().Run();
11870
11871 EXPECT_EQ(6, req->GetRawBodyBytes());
11872}
11873
brettwa1228ebb2016-10-28 03:51:3411874#endif // !BUILDFLAG(DISABLE_FTP_SUPPORT)
[email protected]7461a402011-03-24 23:19:5111875
ttuttlec0c828492015-05-15 01:25:5511876TEST_F(URLRequestTest, NetworkAccessedClearOnDataRequest) {
11877 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:1611878 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
11879 GURL("data:,"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:5511880
11881 EXPECT_FALSE(req->response_info().network_accessed);
11882
11883 req->Start();
11884 base::RunLoop().Run();
11885
11886 EXPECT_EQ(1, default_network_delegate_.completed_requests());
11887 EXPECT_FALSE(req->response_info().network_accessed);
11888}
11889
11890TEST_F(URLRequestTest, NetworkAccessedSetOnHostResolutionFailure) {
11891 MockHostResolver host_resolver;
11892 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
11893 TestURLRequestContext context(true);
11894 context.set_network_delegate(&network_delegate);
11895 context.set_host_resolver(&host_resolver);
11896 host_resolver.rules()->AddSimulatedFailure("*");
11897 context.Init();
11898
11899 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:1611900 std::unique_ptr<URLRequest> req(
11901 context.CreateRequest(GURL("http://test_intercept/foo"), DEFAULT_PRIORITY,
11902 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:5511903
11904 EXPECT_FALSE(req->response_info().network_accessed);
11905
11906 req->Start();
11907 base::RunLoop().Run();
11908 EXPECT_TRUE(req->response_info().network_accessed);
11909}
11910
mmenkeed0498b2015-12-08 23:20:4211911// Test that URLRequest is canceled correctly.
alexanderkcd904b52015-07-24 18:57:2211912// See http://crbug.com/508900
mmenkeed0498b2015-12-08 23:20:4211913TEST_F(URLRequestTest, URLRequestRedirectJobCancelRequest) {
alexanderkcd904b52015-07-24 18:57:2211914 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3611915 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611916 GURL("http://not-a-real-domain/"), DEFAULT_PRIORITY, &d,
11917 TRAFFIC_ANNOTATION_FOR_TESTS));
alexanderkcd904b52015-07-24 18:57:2211918
danakj8522a25b2016-04-16 00:17:3611919 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
alexanderkcd904b52015-07-24 18:57:2211920 req.get(), &default_network_delegate_,
11921 GURL("http://this-should-never-be-navigated-to/"),
mmenkeed0498b2015-12-08 23:20:4211922 URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT, "Jumbo shrimp"));
11923 AddTestInterceptor()->set_main_intercept_job(std::move(job));
alexanderkcd904b52015-07-24 18:57:2211924
11925 req->Start();
11926 req->Cancel();
alexanderkcd904b52015-07-24 18:57:2211927 base::RunLoop().RunUntilIdle();
maksim.sisovb53724b52016-09-16 05:30:5011928 EXPECT_EQ(ERR_ABORTED, d.request_status());
alexanderkcd904b52015-07-24 18:57:2211929 EXPECT_EQ(0, d.received_redirect_count());
11930}
11931
Andrey Kosyakov2e893e62017-08-31 17:00:5211932TEST_F(URLRequestTestHTTP, HeadersCallbacks) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0411933 ASSERT_TRUE(http_test_server()->Start());
11934 TestURLRequestContext context;
11935 GURL url(http_test_server()->GetURL("/cachetime"));
11936 TestDelegate delegate;
11937 HttpRequestHeaders extra_headers;
11938 extra_headers.SetHeader("X-Foo", "bar");
11939
11940 {
Andrey Kosyakov2e893e62017-08-31 17:00:5211941 HttpRawRequestHeaders raw_req_headers;
11942 scoped_refptr<const HttpResponseHeaders> raw_resp_headers;
11943
Andrey Kosyakov83a6eee2017-08-14 19:20:0411944 std::unique_ptr<URLRequest> r(context.CreateRequest(
11945 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
11946 r->SetExtraRequestHeaders(extra_headers);
Andrey Kosyakov2e893e62017-08-31 17:00:5211947 r->SetRequestHeadersCallback(base::Bind(
11948 &HttpRawRequestHeaders::Assign, base::Unretained(&raw_req_headers)));
11949 r->SetResponseHeadersCallback(base::Bind(
11950 [](scoped_refptr<const HttpResponseHeaders>* left,
11951 scoped_refptr<const HttpResponseHeaders> right) { *left = right; },
11952 base::Unretained(&raw_resp_headers)));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411953 r->Start();
11954 while (!delegate.response_started_count())
11955 base::RunLoop().RunUntilIdle();
Andrey Kosyakov2e893e62017-08-31 17:00:5211956 EXPECT_FALSE(raw_req_headers.headers().empty());
Andrey Kosyakov83a6eee2017-08-14 19:20:0411957 std::string value;
Andrey Kosyakov2e893e62017-08-31 17:00:5211958 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411959 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5211960 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Accept-Encoding", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411961 EXPECT_EQ("gzip, deflate", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5211962 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Connection", &value));
11963 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Host", &value));
11964 EXPECT_EQ("GET /cachetime HTTP/1.1\r\n", raw_req_headers.request_line());
11965 EXPECT_EQ(raw_resp_headers.get(), r->response_headers());
Andrey Kosyakov83a6eee2017-08-14 19:20:0411966 }
11967 {
Andrey Kosyakov83a6eee2017-08-14 19:20:0411968 std::unique_ptr<URLRequest> r(context.CreateRequest(
11969 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
11970 r->SetExtraRequestHeaders(extra_headers);
Andrey Kosyakov2e893e62017-08-31 17:00:5211971 r->SetRequestHeadersCallback(base::Bind([](HttpRawRequestHeaders) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0411972 FAIL() << "Callback should not be called unless request is sent";
11973 }));
Andrey Kosyakov2e893e62017-08-31 17:00:5211974 r->SetResponseHeadersCallback(
11975 base::Bind([](scoped_refptr<const HttpResponseHeaders>) {
11976 FAIL() << "Callback should not be called unless request is sent";
11977 }));
Andrey Kosyakov83a6eee2017-08-14 19:20:0411978 r->Start();
11979 base::RunLoop().Run();
11980 EXPECT_TRUE(r->was_cached());
Andrey Kosyakov83a6eee2017-08-14 19:20:0411981 }
11982}
11983
Andrey Kosyakov2e893e62017-08-31 17:00:5211984TEST_F(URLRequestTestHTTP, HeadersCallbacksWithRedirect) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0411985 ASSERT_TRUE(http_test_server()->Start());
Andrey Kosyakov2e893e62017-08-31 17:00:5211986 HttpRawRequestHeaders raw_req_headers;
11987 scoped_refptr<const HttpResponseHeaders> raw_resp_headers;
11988
Andrey Kosyakov83a6eee2017-08-14 19:20:0411989 TestURLRequestContext context;
11990 TestDelegate delegate;
11991 HttpRequestHeaders extra_headers;
11992 extra_headers.SetHeader("X-Foo", "bar");
11993 delegate.set_quit_on_redirect(true);
11994 GURL url(http_test_server()->GetURL("/redirect-test.html"));
11995 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
11996 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
11997 r->SetExtraRequestHeaders(extra_headers);
11998 r->SetRequestHeadersCallback(base::Bind(&HttpRawRequestHeaders::Assign,
Andrey Kosyakov2e893e62017-08-31 17:00:5211999 base::Unretained(&raw_req_headers)));
12000 r->SetResponseHeadersCallback(base::Bind(
12001 [](scoped_refptr<const HttpResponseHeaders>* left,
12002 scoped_refptr<const HttpResponseHeaders> right) { *left = right; },
12003 base::Unretained(&raw_resp_headers)));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412004 r->Start();
12005 base::RunLoop().Run();
12006
12007 ASSERT_EQ(1, delegate.received_redirect_count());
12008 std::string value;
Andrey Kosyakov2e893e62017-08-31 17:00:5212009 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412010 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212011 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Accept-Encoding", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412012 EXPECT_EQ("gzip, deflate", value);
12013 EXPECT_EQ(1, delegate.received_redirect_count());
Andrey Kosyakov2e893e62017-08-31 17:00:5212014 EXPECT_EQ("GET /redirect-test.html HTTP/1.1\r\n",
12015 raw_req_headers.request_line());
12016 EXPECT_TRUE(raw_resp_headers->HasHeader("Location"));
12017 EXPECT_EQ(302, raw_resp_headers->response_code());
12018 EXPECT_EQ("Redirect", raw_resp_headers->GetStatusText());
Andrey Kosyakov83a6eee2017-08-14 19:20:0412019
Andrey Kosyakov2e893e62017-08-31 17:00:5212020 raw_req_headers = HttpRawRequestHeaders();
12021 raw_resp_headers = nullptr;
Andrey Kosyakov83a6eee2017-08-14 19:20:0412022 r->FollowDeferredRedirect();
12023 base::RunLoop().Run();
Andrey Kosyakov2e893e62017-08-31 17:00:5212024 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412025 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212026 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Accept-Encoding", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412027 EXPECT_EQ("gzip, deflate", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212028 EXPECT_EQ("GET /with-headers.html HTTP/1.1\r\n",
12029 raw_req_headers.request_line());
12030 EXPECT_EQ(r->response_headers(), raw_resp_headers.get());
Andrey Kosyakov83a6eee2017-08-14 19:20:0412031}
12032
Andrey Kosyakov2e893e62017-08-31 17:00:5212033TEST_F(URLRequestTest, HeadersCallbacksConnectFailed) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412034 TestDelegate request_delegate;
12035
12036 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
12037 GURL("http://127.0.0.1:9/"), DEFAULT_PRIORITY, &request_delegate,
12038 TRAFFIC_ANNOTATION_FOR_TESTS));
12039 r->SetRequestHeadersCallback(base::Bind([](net::HttpRawRequestHeaders) {
12040 FAIL() << "Callback should not be called unless request is sent";
12041 }));
Andrey Kosyakov2e893e62017-08-31 17:00:5212042 r->SetResponseHeadersCallback(
12043 base::Bind([](scoped_refptr<const net::HttpResponseHeaders>) {
12044 FAIL() << "Callback should not be called unless request is sent";
12045 }));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412046 r->Start();
12047 base::RunLoop().Run();
12048 EXPECT_FALSE(r->is_pending());
12049}
12050
Andrey Kosyakov2e893e62017-08-31 17:00:5212051TEST_F(URLRequestTestHTTP, HeadersCallbacksAuthRetry) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412052 ASSERT_TRUE(http_test_server()->Start());
12053 GURL url(http_test_server()->GetURL("/auth-basic"));
12054
12055 TestURLRequestContext context;
12056 TestDelegate delegate;
12057
12058 delegate.set_credentials(AuthCredentials(kUser, kSecret));
12059 HttpRequestHeaders extra_headers;
12060 extra_headers.SetHeader("X-Foo", "bar");
12061
Andrey Kosyakov2e893e62017-08-31 17:00:5212062 using ReqHeadersVector = std::vector<std::unique_ptr<HttpRawRequestHeaders>>;
12063 ReqHeadersVector raw_req_headers;
Andrey Kosyakov83a6eee2017-08-14 19:20:0412064
Andrey Kosyakov2e893e62017-08-31 17:00:5212065 using RespHeadersVector =
12066 std::vector<scoped_refptr<const HttpResponseHeaders>>;
12067 RespHeadersVector raw_resp_headers;
12068
12069 auto req_headers_callback = base::Bind(
12070 [](ReqHeadersVector* vec, HttpRawRequestHeaders headers) {
12071 vec->emplace_back(new HttpRawRequestHeaders(std::move(headers)));
12072 },
12073 &raw_req_headers);
12074 auto resp_headers_callback = base::Bind(
12075 [](RespHeadersVector* vec,
12076 scoped_refptr<const HttpResponseHeaders> headers) {
12077 vec->push_back(headers);
12078 },
12079 &raw_resp_headers);
Andrey Kosyakov83a6eee2017-08-14 19:20:0412080 std::unique_ptr<URLRequest> r(context.CreateRequest(
12081 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
12082 r->SetExtraRequestHeaders(extra_headers);
Andrey Kosyakov2e893e62017-08-31 17:00:5212083 r->SetRequestHeadersCallback(req_headers_callback);
12084 r->SetResponseHeadersCallback(resp_headers_callback);
Andrey Kosyakov83a6eee2017-08-14 19:20:0412085 r->Start();
12086 base::RunLoop().Run();
12087 EXPECT_FALSE(r->is_pending());
Andrey Kosyakov2e893e62017-08-31 17:00:5212088 ASSERT_EQ(raw_req_headers.size(), 2u);
12089 ASSERT_EQ(raw_resp_headers.size(), 2u);
Andrey Kosyakov83a6eee2017-08-14 19:20:0412090 std::string value;
Andrey Kosyakov2e893e62017-08-31 17:00:5212091 EXPECT_FALSE(raw_req_headers[0]->FindHeaderForTest("Authorization", &value));
12092 EXPECT_TRUE(raw_req_headers[0]->FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412093 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212094 EXPECT_TRUE(raw_req_headers[1]->FindHeaderForTest("Authorization", &value));
12095 EXPECT_TRUE(raw_req_headers[1]->FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412096 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212097 EXPECT_EQ(raw_resp_headers[1], r->response_headers());
12098 EXPECT_NE(raw_resp_headers[0], raw_resp_headers[1]);
12099 EXPECT_EQ(401, raw_resp_headers[0]->response_code());
12100 EXPECT_EQ("Unauthorized", raw_resp_headers[0]->GetStatusText());
12101
12102 std::unique_ptr<URLRequest> r2(context.CreateRequest(
12103 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
12104 r2->SetExtraRequestHeaders(extra_headers);
12105 r2->SetRequestHeadersCallback(req_headers_callback);
12106 r2->SetResponseHeadersCallback(resp_headers_callback);
12107 r2->SetLoadFlags(LOAD_VALIDATE_CACHE);
12108 r2->Start();
12109 base::RunLoop().Run();
12110 EXPECT_FALSE(r2->is_pending());
12111 ASSERT_EQ(raw_req_headers.size(), 3u);
12112 ASSERT_EQ(raw_resp_headers.size(), 3u);
12113 EXPECT_TRUE(raw_req_headers[2]->FindHeaderForTest("If-None-Match", &value));
12114 EXPECT_NE(raw_resp_headers[2].get(), r2->response_headers());
12115 EXPECT_EQ(304, raw_resp_headers[2]->response_code());
12116 EXPECT_EQ("Not Modified", raw_resp_headers[2]->GetStatusText());
Andrey Kosyakov83a6eee2017-08-14 19:20:0412117}
12118
Andrey Kosyakov2e893e62017-08-31 17:00:5212119TEST_F(URLRequestTest, HeadersCallbacksNonHTTP) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412120 GURL data_url("data:text/html,<html><body>Hello!</body></html>");
12121 TestDelegate d;
12122 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
12123 data_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
12124 r->SetRequestHeadersCallback(base::Bind([](net::HttpRawRequestHeaders) {
Andrey Kosyakov2e893e62017-08-31 17:00:5212125 FAIL() << "Callback should not be called for non-HTTP schemes";
Andrey Kosyakov83a6eee2017-08-14 19:20:0412126 }));
Andrey Kosyakov2e893e62017-08-31 17:00:5212127 r->SetResponseHeadersCallback(
12128 base::Bind([](scoped_refptr<const net::HttpResponseHeaders>) {
12129 FAIL() << "Callback should not be called for non-HTTP schemes";
12130 }));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412131 r->Start();
12132 base::RunLoop().Run();
12133 EXPECT_FALSE(r->is_pending());
12134}
12135
[email protected]7461a402011-03-24 23:19:5112136} // namespace net