blob: 737dda3ce77372326c9298dfe4aab3a06f11de38 [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>
Gyuyoung Kimb480aba2018-01-27 07:00:0420#include <memory>
avibf0746c2015-12-09 19:53:1421#include <limits>
initial.commit586acc5fe2008-07-26 22:42:5222
nharperb7441ef2016-01-25 23:54:1423#include "base/base64url.h"
[email protected]218aa6a12011-09-13 17:38:3824#include "base/bind.h"
[email protected]8523ba52011-05-22 19:00:5825#include "base/compiler_specific.h"
mmenke9f2ec60c2015-06-01 20:59:4726#include "base/files/file_path.h"
thestigd8df0332014-09-04 06:33:2927#include "base/files/file_util.h"
[email protected]3ca8b362013-11-11 22:18:0728#include "base/files/scoped_temp_dir.h"
[email protected]34b2b002009-11-20 06:53:2829#include "base/format_macros.h"
estark06e0dac2015-08-07 21:56:0130#include "base/json/json_reader.h"
skyostil4891b25b2015-06-11 11:43:4531#include "base/location.h"
Avi Drissman13fc8932015-12-20 04:40:4632#include "base/macros.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"
Lily Houghton582d4622018-01-22 22:43:4059#include "net/base/proxy_server.h"
[email protected]2ca01e52013-10-31 22:05:1960#include "net/base/request_priority.h"
zhongyi18ddddd2017-02-03 19:06:3661#include "net/base/test_completion_callback.h"
[email protected]f288ef02012-12-15 20:28:2862#include "net/base/upload_bytes_element_reader.h"
63#include "net/base/upload_data_stream.h"
64#include "net/base/upload_file_element_reader.h"
tfarina7a4a7fd2016-01-20 14:23:4465#include "net/base/url_util.h"
rsleevid6de8302016-06-21 01:33:2066#include "net/cert/ct_policy_enforcer.h"
estark1614475f2016-03-10 03:46:4767#include "net/cert/ct_policy_status.h"
rsleevi22cae1672016-12-28 01:53:3668#include "net/cert/do_nothing_ct_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1169#include "net/cert/ev_root_ca_metadata.h"
[email protected]a8fed1742013-12-27 02:14:2470#include "net/cert/mock_cert_verifier.h"
zhongyi18ddddd2017-02-03 19:06:3671#include "net/cert/multi_log_ct_verifier.h"
eranmdcec9632016-10-10 14:16:1072#include "net/cert/signed_certificate_timestamp_and_status.h"
[email protected]6e7845ae2013-03-29 21:48:1173#include "net/cert/test_root_certs.h"
[email protected]aa84a7e2012-03-15 21:29:0674#include "net/cookies/cookie_monster.h"
75#include "net/cookies/cookie_store_test_helpers.h"
initial.commit586acc5fe2008-07-26 22:42:5276#include "net/disk_cache/disk_cache.h"
[email protected]f2cb3cf2013-03-21 01:40:5377#include "net/dns/mock_host_resolver.h"
[email protected]b7572ea2013-11-26 20:16:3878#include "net/http/http_byte_range.h"
initial.commit586acc5fe2008-07-26 22:42:5279#include "net/http/http_cache.h"
80#include "net/http/http_network_layer.h"
[email protected]c3456bb2011-12-12 22:22:1981#include "net/http/http_network_session.h"
[email protected]88e6b6f32010-05-07 23:14:2582#include "net/http/http_request_headers.h"
[email protected]319d9e6f2009-02-18 19:47:2183#include "net/http/http_response_headers.h"
zhongyi18ddddd2017-02-03 19:06:3684#include "net/http/http_server_properties_impl.h"
[email protected]e50efea2014-03-24 18:41:0085#include "net/http/http_util.h"
mikecirone8b85c432016-09-08 19:11:0086#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1987#include "net/log/net_log_source.h"
vishal.b62985ca92015-04-17 08:45:5188#include "net/log/test_net_log.h"
mmenke43758e62015-05-04 21:09:4689#include "net/log/test_net_log_entry.h"
90#include "net/log/test_net_log_util.h"
brettwa1228ebb2016-10-28 03:51:3491#include "net/net_features.h"
Lily Houghton582d4622018-01-22 22:43:4092#include "net/proxy_resolution/proxy_service.h"
zhongyi18ddddd2017-02-03 19:06:3693#include "net/quic/chromium/mock_crypto_client_stream_factory.h"
94#include "net/quic/chromium/quic_server_info.h"
95#include "net/socket/socket_test_util.h"
[email protected]c3456bb2011-12-12 22:22:1996#include "net/socket/ssl_client_socket.h"
nharperb7441ef2016-01-25 23:54:1497#include "net/ssl/channel_id_service.h"
98#include "net/ssl/default_channel_id_store.h"
[email protected]536fd0b2013-03-14 17:41:5799#include "net/ssl/ssl_connection_status_flags.h"
tommycli59a63432015-11-06 00:10:55100#include "net/ssl/ssl_server_config.h"
nharperb7441ef2016-01-25 23:54:14101#include "net/ssl/token_binding.h"
[email protected]6e7845ae2013-03-29 21:48:11102#include "net/test/cert_test_util.h"
estarkcd39c11f2015-10-19 19:46:36103#include "net/test/embedded_test_server/embedded_test_server.h"
104#include "net/test/embedded_test_server/http_request.h"
105#include "net/test/embedded_test_server/http_response.h"
robpercival214763f2016-07-01 23:27:01106#include "net/test/gtest_util.h"
[email protected]89b32522013-05-07 20:04:21107#include "net/test/spawned_test_server/spawned_test_server.h"
rsleevia69c79a2016-06-22 03:28:43108#include "net/test/test_data_directory.h"
mmenkefb18c772015-09-30 22:22:50109#include "net/test/url_request/url_request_failed_job.h"
rhalavatib7bd7c792017-04-27 05:25:16110#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
[email protected]e0f35c92013-05-08 16:04:34111#include "net/url_request/data_protocol_handler.h"
[email protected]ee4c30d2012-11-07 15:08:43112#include "net/url_request/static_http_user_agent_settings.h"
initial.commit586acc5fe2008-07-26 22:42:52113#include "net/url_request/url_request.h"
mmenkefb18c772015-09-30 22:22:50114#include "net/url_request/url_request_filter.h"
[email protected]bcb84f8b2009-08-31 16:20:14115#include "net/url_request/url_request_http_job.h"
bengr1bf8e942014-11-07 01:36:50116#include "net/url_request/url_request_intercepting_job_factory.h"
117#include "net/url_request/url_request_interceptor.h"
[email protected]9d5730b2012-08-24 17:42:49118#include "net/url_request/url_request_job_factory_impl.h"
[email protected]3c5ca8c2011-09-29 01:14:51119#include "net/url_request/url_request_redirect_job.h"
[email protected]a5c713f2009-04-16 21:05:47120#include "net/url_request/url_request_test_job.h"
[email protected]d2db0292011-01-26 20:23:44121#include "net/url_request/url_request_test_util.h"
robpercival214763f2016-07-01 23:27:01122#include "testing/gmock/include/gmock/gmock.h"
initial.commit586acc5fe2008-07-26 22:42:52123#include "testing/gtest/include/gtest/gtest.h"
[email protected]23887f04f2008-12-02 19:20:15124#include "testing/platform_test.h"
initial.commit586acc5fe2008-07-26 22:42:52125
Eric Romanefddd0a2017-10-10 02:14:25126#if defined(OS_FUCHSIA)
127#define USE_BUILTIN_CERT_VERIFIER
128#endif
129
brettwa1228ebb2016-10-28 03:51:34130#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]5ecf7cb282014-05-11 01:49:55131#include "net/base/filename_util.h"
[email protected]02494ec2014-05-07 15:05:29132#include "net/url_request/file_protocol_handler.h"
133#include "net/url_request/url_request_file_dir_job.h"
134#endif
135
brettwa1228ebb2016-10-28 03:51:34136#if !BUILDFLAG(DISABLE_FTP_SUPPORT) && !defined(OS_ANDROID)
mmenke9f2ec60c2015-06-01 20:59:47137#include "net/ftp/ftp_network_layer.h"
[email protected]02494ec2014-05-07 15:05:29138#include "net/url_request/ftp_protocol_handler.h"
139#endif
140
[email protected]dffe8242012-03-20 15:14:27141#if defined(OS_WIN)
[email protected]451fd902012-10-03 17:14:48142#include "base/win/scoped_com_initializer.h"
[email protected]dffe8242012-03-20 15:14:27143#endif
144
mmenkefd9d15c2017-06-29 13:45:54145#if BUILDFLAG(ENABLE_REPORTING)
Julia Tuttlecba7d222018-02-23 19:37:27146#include "net/network_error_logging/network_error_logging_service.h"
Julia Tuttle91a655d2018-01-26 18:03:03147#include "net/reporting/reporting_policy.h"
mmenkefd9d15c2017-06-29 13:45:54148#include "net/reporting/reporting_service.h"
149#endif // BUILDFLAG(ENABLE_REPORTING)
150
Matt Muellerfb271992018-01-30 18:10:48151#if defined(OS_ANDROID) || defined(USE_BUILTIN_CERT_VERIFIER)
Eric Romanefddd0a2017-10-10 02:14:25152#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) {
Lily Houghton8c2f97d2018-01-22 05:06:59735 context_storage_.set_proxy_resolution_service(
736 ProxyResolutionService::CreateFixed(proxy));
[email protected]d5a4dd62012-05-23 01:41:04737 set_network_delegate(delegate);
738 Init();
739 }
Chris Watkins7a41d3552017-12-01 02:13:27740 ~TestURLRequestContextWithProxy() override = default;
[email protected]d5a4dd62012-05-23 01:41:04741};
742
stefanocsbd5be5202016-06-10 03:37:55743// A mock ReportSenderInterface that just remembers the latest report
estark06e0dac2015-08-07 21:56:01744// URI and report to be sent.
745class MockCertificateReportSender
stefanocsbd5be5202016-06-10 03:37:55746 : public TransportSecurityState::ReportSenderInterface {
estark06e0dac2015-08-07 21:56:01747 public:
Chris Watkins7a41d3552017-12-01 02:13:27748 MockCertificateReportSender() = default;
749 ~MockCertificateReportSender() override = default;
estark06e0dac2015-08-07 21:56:01750
meacer5d4dc5a2017-04-27 20:37:48751 void Send(const GURL& report_uri,
752 base::StringPiece content_type,
753 base::StringPiece report,
754 const base::Callback<void()>& success_callback,
755 const base::Callback<void(const GURL&, int, int)>& error_callback)
756 override {
estark06e0dac2015-08-07 21:56:01757 latest_report_uri_ = report_uri;
estarkb1716e22016-09-28 06:03:44758 report.CopyToString(&latest_report_);
759 content_type.CopyToString(&latest_content_type_);
estark06e0dac2015-08-07 21:56:01760 }
estark06e0dac2015-08-07 21:56:01761 const GURL& latest_report_uri() { return latest_report_uri_; }
762 const std::string& latest_report() { return latest_report_; }
estarkb1716e22016-09-28 06:03:44763 const std::string& latest_content_type() { return latest_content_type_; }
estark06e0dac2015-08-07 21:56:01764
765 private:
766 GURL latest_report_uri_;
767 std::string latest_report_;
estarkb1716e22016-09-28 06:03:44768 std::string latest_content_type_;
estark06e0dac2015-08-07 21:56:01769};
770
estarkcd39c11f2015-10-19 19:46:36771class TestExperimentalFeaturesNetworkDelegate : public TestNetworkDelegate {
772 public:
773 bool OnAreExperimentalCookieFeaturesEnabled() const override { return true; }
774};
775
dadrian612337a2016-07-20 22:36:58776// OCSPErrorTestDelegate caches the SSLInfo passed to OnSSLCertificateError.
777// This is needed because after the certificate failure, the URLRequest will
778// retry the connection, and return a partial SSLInfo with a cached cert status.
779// The partial SSLInfo does not have the OCSP information filled out.
780class OCSPErrorTestDelegate : public TestDelegate {
781 public:
782 void OnSSLCertificateError(URLRequest* request,
783 const SSLInfo& ssl_info,
784 bool fatal) override {
785 ssl_info_ = ssl_info;
786 on_ssl_certificate_error_called_ = true;
787 TestDelegate::OnSSLCertificateError(request, ssl_info, fatal);
788 }
789
790 bool on_ssl_certificate_error_called() {
791 return on_ssl_certificate_error_called_;
792 }
793
794 SSLInfo ssl_info() { return ssl_info_; }
795
796 private:
797 bool on_ssl_certificate_error_called_ = false;
798 SSLInfo ssl_info_;
799};
800
[email protected]d5a4dd62012-05-23 01:41:04801} // namespace
802
[email protected]a592c0432012-12-01 18:10:29803// Inherit PlatformTest since we require the autorelease pool on Mac OS X.
[email protected]7a0bb4bf2008-11-19 21:41:48804class URLRequestTest : public PlatformTest {
[email protected]abb26092010-11-11 22:19:00805 public:
fdorayf33fede2017-05-11 21:18:10806 URLRequestTest() : default_context_(true) {
[email protected]ef2bf422012-05-11 03:27:09807 default_context_.set_network_delegate(&default_network_delegate_);
[email protected]58e32bb2013-01-21 18:23:25808 default_context_.set_net_log(&net_log_);
bengr1bf8e942014-11-07 01:36:50809 job_factory_impl_ = new URLRequestJobFactoryImpl();
810 job_factory_.reset(job_factory_impl_);
[email protected]87a09a92011-07-14 15:50:50811 }
bengr1bf8e942014-11-07 01:36:50812
dcheng67be2b1f2014-10-27 21:47:29813 ~URLRequestTest() override {
[email protected]e4034ad2013-09-20 08:36:18814 // URLRequestJobs may post clean-up tasks on destruction.
815 base::RunLoop().RunUntilIdle();
Martijn Croonenb1383da2017-10-11 11:56:35816
817 SetTransportSecurityStateSourceForTesting(nullptr);
[email protected]e4034ad2013-09-20 08:36:18818 }
[email protected]87a09a92011-07-14 15:50:50819
dcheng2339883c2014-12-23 00:23:05820 void SetUp() override {
bengr1bf8e942014-11-07 01:36:50821 SetUpFactory();
822 default_context_.set_job_factory(job_factory_.get());
823 default_context_.Init();
824 PlatformTest::SetUp();
825 }
826
827 virtual void SetUpFactory() {
svaldez5d58c9e2015-08-24 21:36:20828 job_factory_impl_->SetProtocolHandler(
Bence Béky8f9d7d3952017-10-09 19:58:04829 "data", std::make_unique<DataProtocolHandler>());
brettwa1228ebb2016-10-28 03:51:34830#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
bengr1bf8e942014-11-07 01:36:50831 job_factory_impl_->SetProtocolHandler(
Jeremy Roman0579ed62017-08-29 15:56:19832 "file", std::make_unique<FileProtocolHandler>(
ricea2deef682016-09-09 08:04:07833 base::ThreadTaskRunnerHandle::Get()));
bengr1bf8e942014-11-07 01:36:50834#endif
835 }
836
837 TestNetworkDelegate* default_network_delegate() {
838 return &default_network_delegate_;
839 }
840
841 const TestURLRequestContext& default_context() const {
842 return default_context_;
843 }
844
845
[email protected]3c5ca8c2011-09-29 01:14:51846 // Adds the TestJobInterceptor to the default context.
847 TestJobInterceptor* AddTestInterceptor() {
[email protected]f53b4802012-12-20 17:04:23848 TestJobInterceptor* protocol_handler_ = new TestJobInterceptor();
svaldez5d58c9e2015-08-24 21:36:20849 job_factory_impl_->SetProtocolHandler("http", nullptr);
850 job_factory_impl_->SetProtocolHandler("http",
danakj8522a25b2016-04-16 00:17:36851 base::WrapUnique(protocol_handler_));
[email protected]f53b4802012-12-20 17:04:23852 return protocol_handler_;
[email protected]3c5ca8c2011-09-29 01:14:51853 }
854
Sergey Ulanov2e49f492017-09-14 19:37:51855 // Creates a temp test file and writes |data| to the file. The file will be
856 // deleted after the test completes.
857 void CreateTestFile(const char* data,
858 size_t data_size,
859 base::FilePath* test_file) {
860 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
861 // Get an absolute path since |temp_dir| can contain a symbolic link. As of
862 // now, Mac and Android bots return a path with a symbolic link.
863 base::FilePath absolute_temp_dir =
864 base::MakeAbsoluteFilePath(temp_dir_.GetPath());
865
866 ASSERT_TRUE(base::CreateTemporaryFileInDir(absolute_temp_dir, test_file));
867 ASSERT_EQ(static_cast<int>(data_size),
868 base::WriteFile(*test_file, data, data_size));
869 }
870
[email protected]87a09a92011-07-14 15:50:50871 protected:
vishal.b62985ca92015-04-17 08:45:51872 TestNetLog net_log_;
[email protected]ceefd7fd2012-11-29 00:36:24873 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest.
bengr1bf8e942014-11-07 01:36:50874 URLRequestJobFactoryImpl* job_factory_impl_;
danakj8522a25b2016-04-16 00:17:36875 std::unique_ptr<URLRequestJobFactory> job_factory_;
[email protected]ef2bf422012-05-11 03:27:09876 TestURLRequestContext default_context_;
Sergey Ulanov2e49f492017-09-14 19:37:51877 base::ScopedTempDir temp_dir_;
[email protected]7a0bb4bf2008-11-19 21:41:48878};
879
satoruxddac0442017-05-29 06:06:18880// This NetworkDelegate is picky about what files are accessible. Only
881// whitelisted files are allowed.
882class CookieBlockingNetworkDelegate : public TestNetworkDelegate {
883 public:
Chris Watkins7a41d3552017-12-01 02:13:27884 CookieBlockingNetworkDelegate() = default;
885 ;
satoruxddac0442017-05-29 06:06:18886
887 // Adds |directory| to the access white list.
888 void AddToWhitelist(const base::FilePath& directory) {
889 whitelist_.insert(directory);
890 }
891
892 private:
893 // Returns true if |path| matches the white list.
894 bool OnCanAccessFileInternal(const base::FilePath& path) const {
895 for (const auto& directory : whitelist_) {
896 if (directory == path || directory.IsParent(path))
897 return true;
898 }
899 return false;
900 }
901
902 // Returns true only if both |original_path| and |absolute_path| match the
903 // white list.
904 bool OnCanAccessFile(const URLRequest& request,
905 const base::FilePath& original_path,
906 const base::FilePath& absolute_path) const override {
907 return (OnCanAccessFileInternal(original_path) &&
908 OnCanAccessFileInternal(absolute_path));
909 }
910
911 std::set<base::FilePath> whitelist_;
912
913 DISALLOW_COPY_AND_ASSIGN(CookieBlockingNetworkDelegate);
914};
915
[email protected]316c1e5e2012-09-12 15:17:44916TEST_F(URLRequestTest, AboutBlankTest) {
917 TestDelegate d;
918 {
rhalavatib7bd7c792017-04-27 05:25:16919 std::unique_ptr<URLRequest> r(
920 default_context_.CreateRequest(GURL("about:blank"), DEFAULT_PRIORITY,
921 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:44922
[email protected]f7022f32014-08-21 16:32:19923 r->Start();
924 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44925
[email protected]255620da2013-08-19 13:14:29926 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:44927
[email protected]f7022f32014-08-21 16:32:19928 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44929 EXPECT_FALSE(d.received_data_before_response());
930 EXPECT_EQ(d.bytes_received(), 0);
[email protected]f7022f32014-08-21 16:32:19931 EXPECT_EQ("", r->GetSocketAddress().host());
932 EXPECT_EQ(0, r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:04933
934 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:19935 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]316c1e5e2012-09-12 15:17:44936 }
937}
938
939TEST_F(URLRequestTest, DataURLImageTest) {
940 TestDelegate d;
941 {
942 // Use our nice little Chrome logo.
danakj8522a25b2016-04-16 00:17:36943 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
944 GURL("data:image/png;base64,"
945 "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADVklEQVQ4jX2TfUwUB"
946 "BjG3w1y+HGcd9dxhXR8T4awOccJGgOSWclHImznLkTlSw0DDQXkrmgYgbUYnlQTqQ"
947 "xIEVxitD5UMCATRA1CEEg+Qjw3bWDxIauJv/5oumqs39/P827vnucRmYN0gyF01GI"
948 "5MpCVdW0gO7tvNC+vqSEtbZefk5NuLv1jdJ46p/zw0HeH4+PHr3h7c1mjoV2t5rKz"
949 "Mx1+fg9bAgK6zHq9cU5z+LpA3xOtx34+vTeT21onRuzssC3zxbbSwC13d/pFuC7Ck"
950 "IMDxQpF7r/MWq12UctI1dWWm99ypqSYmRUBdKem8MkrO/kgaTt1O7YzlpzE5GIVd0"
951 "WYUqt57yWf2McHTObYPbVD+ZwbtlLTVMZ3BW+TnLyXLaWtmEq6WJVbT3HBh3Svj2H"
952 "QQcm43XwmtoYM6vVKleh0uoWvnzW3v3MpidruPTQPf0bia7sJOtBM0ufTWNvus/nk"
953 "DFHF9ZS+uYVjRUasMeHUmyLYtcklTvzWGFZnNOXczThvpKIzjcahSqIzkvDLayDq6"
954 "D3eOjtBbNUEIZYyqsvj4V4wY92eNJ4IoyhTbxXX1T5xsV9tm9r4TQwHLiZw/pdDZJ"
955 "ea8TKmsmR/K0uLh/GwnCHghTja6lPhphezPfO5/5MrVvMzNaI3+ERHfrFzPKQukrQ"
956 "GI4d/3EFD/3E2mVNYvi4at7CXWREaxZGD+3hg28zD3gVMd6q5c8GdosynKmSeRuGz"
957 "pjyl1/9UDGtPR5HeaKT8Wjo17WXk579BXVUhN64ehF9fhRtq/uxxZKzNiZFGD0wRC"
958 "3NFROZ5mwIPL/96K/rKMMLrIzF9uhHr+/sYH7DAbwlgC4J+R2Z7FUx1qLnV7MGF40"
959 "smVSoJ/jvHRfYhQeUJd/SnYtGWhPHR0Sz+GE2F2yth0B36Vcz2KpnufBJbsysjjW4"
960 "kblBUiIjiURUWqJY65zxbnTy57GQyH58zgy0QBtTQv5gH15XMdKkYu+TGaJMnlm2O"
961 "34uI4b9tflqp1+QEFGzoW/ulmcofcpkZCYJhDfSpme7QcrHa+Xfji8paEQkTkSfmm"
962 "oRWRNZr/F1KfVMjW+IKEnv2FwZfKdzt0BQR6lClcZR0EfEXEfv/G6W9iLiIyCoReV"
963 "5EnhORIBHx+ufPj/gLB/zGI/G4Bk0AAAAASUVORK5CYII="),
rhalavatib7bd7c792017-04-27 05:25:16964 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:44965
[email protected]f7022f32014-08-21 16:32:19966 r->Start();
967 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44968
[email protected]255620da2013-08-19 13:14:29969 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:44970
[email protected]f7022f32014-08-21 16:32:19971 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44972 EXPECT_FALSE(d.received_data_before_response());
973 EXPECT_EQ(d.bytes_received(), 911);
[email protected]f7022f32014-08-21 16:32:19974 EXPECT_EQ("", r->GetSocketAddress().host());
975 EXPECT_EQ(0, r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:04976
977 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:19978 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]316c1e5e2012-09-12 15:17:44979 }
980}
981
brettwa1228ebb2016-10-28 03:51:34982#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]316c1e5e2012-09-12 15:17:44983TEST_F(URLRequestTest, FileTest) {
Sergey Ulanov2e49f492017-09-14 19:37:51984 const char kTestFileContent[] = "Hello";
985 base::FilePath test_file;
986 ASSERT_NO_FATAL_FAILURE(
987 CreateTestFile(kTestFileContent, sizeof(kTestFileContent), &test_file));
kraush5a645822016-04-07 18:35:04988
Sergey Ulanov2e49f492017-09-14 19:37:51989 GURL test_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:44990
991 TestDelegate d;
992 {
rhalavatib7bd7c792017-04-27 05:25:16993 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
Sergey Ulanov2e49f492017-09-14 19:37:51994 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:44995
[email protected]f7022f32014-08-21 16:32:19996 r->Start();
997 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:44998
[email protected]255620da2013-08-19 13:14:29999 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441000
[email protected]f7022f32014-08-21 16:32:191001 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441002 EXPECT_EQ(1, d.response_started_count());
1003 EXPECT_FALSE(d.received_data_before_response());
Sergey Ulanov2e49f492017-09-14 19:37:511004 EXPECT_EQ(d.bytes_received(), static_cast<int>(sizeof(kTestFileContent)));
[email protected]f7022f32014-08-21 16:32:191005 EXPECT_EQ("", r->GetSocketAddress().host());
1006 EXPECT_EQ(0, r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:041007
1008 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:191009 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]316c1e5e2012-09-12 15:17:441010 }
1011}
1012
[email protected]ba40bb762012-12-17 07:11:041013TEST_F(URLRequestTest, FileTestCancel) {
Sergey Ulanov2e49f492017-09-14 19:37:511014 const char kTestFileContent[] = "Hello";
1015 base::FilePath test_file;
1016 ASSERT_NO_FATAL_FAILURE(
1017 CreateTestFile(kTestFileContent, sizeof(kTestFileContent), &test_file));
1018
1019 GURL test_url = FilePathToFileURL(test_file);
[email protected]ba40bb762012-12-17 07:11:041020
1021 TestDelegate d;
1022 {
rhalavatib7bd7c792017-04-27 05:25:161023 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
Sergey Ulanov2e49f492017-09-14 19:37:511024 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]ba40bb762012-12-17 07:11:041025
[email protected]f7022f32014-08-21 16:32:191026 r->Start();
1027 EXPECT_TRUE(r->is_pending());
1028 r->Cancel();
[email protected]ba40bb762012-12-17 07:11:041029 }
[email protected]79e1fd62013-06-20 06:50:041030 // Async cancellation should be safe even when URLRequest has been already
[email protected]ba40bb762012-12-17 07:11:041031 // destroyed.
[email protected]255620da2013-08-19 13:14:291032 base::RunLoop().RunUntilIdle();
[email protected]ba40bb762012-12-17 07:11:041033}
1034
[email protected]316c1e5e2012-09-12 15:17:441035TEST_F(URLRequestTest, FileTestFullSpecifiedRange) {
1036 const size_t buffer_size = 4000;
danakj8522a25b2016-04-16 00:17:361037 std::unique_ptr<char[]> buffer(new char[buffer_size]);
[email protected]316c1e5e2012-09-12 15:17:441038 FillBuffer(buffer.get(), buffer_size);
1039
Sergey Ulanov2e49f492017-09-14 19:37:511040 base::FilePath test_file;
1041 ASSERT_NO_FATAL_FAILURE(
1042 CreateTestFile(buffer.get(), buffer_size, &test_file));
1043 GURL temp_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:441044
1045 const size_t first_byte_position = 500;
1046 const size_t last_byte_position = buffer_size - first_byte_position;
1047 const size_t content_length = last_byte_position - first_byte_position + 1;
1048 std::string partial_buffer_string(buffer.get() + first_byte_position,
1049 buffer.get() + last_byte_position + 1);
1050
1051 TestDelegate d;
1052 {
rhalavatib7bd7c792017-04-27 05:25:161053 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1054 temp_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:441055
1056 HttpRequestHeaders headers;
[email protected]b7572ea2013-11-26 20:16:381057 headers.SetHeader(
1058 HttpRequestHeaders::kRange,
[email protected]cba24642014-08-15 20:49:591059 HttpByteRange::Bounded(
[email protected]b7572ea2013-11-26 20:16:381060 first_byte_position, last_byte_position).GetHeaderValue());
[email protected]f7022f32014-08-21 16:32:191061 r->SetExtraRequestHeaders(headers);
1062 r->Start();
1063 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441064
[email protected]255620da2013-08-19 13:14:291065 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:191066 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441067 EXPECT_EQ(1, d.response_started_count());
1068 EXPECT_FALSE(d.received_data_before_response());
1069 EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
1070 // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
1071 EXPECT_TRUE(partial_buffer_string == d.data_received());
1072 }
[email protected]316c1e5e2012-09-12 15:17:441073}
1074
1075TEST_F(URLRequestTest, FileTestHalfSpecifiedRange) {
1076 const size_t buffer_size = 4000;
danakj8522a25b2016-04-16 00:17:361077 std::unique_ptr<char[]> buffer(new char[buffer_size]);
[email protected]316c1e5e2012-09-12 15:17:441078 FillBuffer(buffer.get(), buffer_size);
1079
Sergey Ulanov2e49f492017-09-14 19:37:511080 base::FilePath test_file;
1081 ASSERT_NO_FATAL_FAILURE(
1082 CreateTestFile(buffer.get(), buffer_size, &test_file));
1083 GURL temp_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:441084
1085 const size_t first_byte_position = 500;
1086 const size_t last_byte_position = buffer_size - 1;
1087 const size_t content_length = last_byte_position - first_byte_position + 1;
1088 std::string partial_buffer_string(buffer.get() + first_byte_position,
1089 buffer.get() + last_byte_position + 1);
1090
1091 TestDelegate d;
1092 {
rhalavatib7bd7c792017-04-27 05:25:161093 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1094 temp_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:441095
1096 HttpRequestHeaders headers;
1097 headers.SetHeader(HttpRequestHeaders::kRange,
[email protected]cba24642014-08-15 20:49:591098 HttpByteRange::RightUnbounded(
[email protected]b7572ea2013-11-26 20:16:381099 first_byte_position).GetHeaderValue());
[email protected]f7022f32014-08-21 16:32:191100 r->SetExtraRequestHeaders(headers);
1101 r->Start();
1102 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441103
[email protected]255620da2013-08-19 13:14:291104 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:191105 EXPECT_TRUE(!r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441106 EXPECT_EQ(1, d.response_started_count());
1107 EXPECT_FALSE(d.received_data_before_response());
1108 EXPECT_EQ(static_cast<int>(content_length), d.bytes_received());
1109 // Don't use EXPECT_EQ, it will print out a lot of garbage if check failed.
1110 EXPECT_TRUE(partial_buffer_string == d.data_received());
1111 }
[email protected]316c1e5e2012-09-12 15:17:441112}
1113
1114TEST_F(URLRequestTest, FileTestMultipleRanges) {
1115 const size_t buffer_size = 400000;
danakj8522a25b2016-04-16 00:17:361116 std::unique_ptr<char[]> buffer(new char[buffer_size]);
[email protected]316c1e5e2012-09-12 15:17:441117 FillBuffer(buffer.get(), buffer_size);
1118
Sergey Ulanov2e49f492017-09-14 19:37:511119 base::FilePath test_file;
1120 ASSERT_NO_FATAL_FAILURE(
1121 CreateTestFile(buffer.get(), buffer_size, &test_file));
1122 GURL temp_url = FilePathToFileURL(test_file);
[email protected]316c1e5e2012-09-12 15:17:441123
1124 TestDelegate d;
1125 {
rhalavatib7bd7c792017-04-27 05:25:161126 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1127 temp_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:441128
1129 HttpRequestHeaders headers;
[email protected]b7572ea2013-11-26 20:16:381130 headers.SetHeader(HttpRequestHeaders::kRange, "bytes=0-0,10-200,200-300");
[email protected]f7022f32014-08-21 16:32:191131 r->SetExtraRequestHeaders(headers);
1132 r->Start();
1133 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441134
[email protected]255620da2013-08-19 13:14:291135 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441136 EXPECT_TRUE(d.request_failed());
1137 }
[email protected]316c1e5e2012-09-12 15:17:441138}
1139
[email protected]3ca8b362013-11-11 22:18:071140TEST_F(URLRequestTest, AllowFileURLs) {
Sergey Ulanov2e49f492017-09-14 19:37:511141 std::string test_data("monkey");
[email protected]3ca8b362013-11-11 22:18:071142 base::FilePath test_file;
Sergey Ulanov2e49f492017-09-14 19:37:511143 ASSERT_NO_FATAL_FAILURE(
1144 CreateTestFile(test_data.data(), test_data.size(), &test_file));
1145
satoruxddac0442017-05-29 06:06:181146 // The directory part of the path returned from CreateTemporaryFileInDir()
1147 // can be slightly different from |absolute_temp_dir| on Windows.
1148 // Example: C:\\Users\\CHROME~2 -> C:\\Users\\chrome-bot
1149 // Hence the test should use the directory name of |test_file|, rather than
1150 // |absolute_temp_dir|, for whitelisting.
1151 base::FilePath real_temp_dir = test_file.DirName();
[email protected]cba24642014-08-15 20:49:591152 GURL test_file_url = FilePathToFileURL(test_file);
[email protected]3ca8b362013-11-11 22:18:071153 {
1154 TestDelegate d;
satoruxddac0442017-05-29 06:06:181155 CookieBlockingNetworkDelegate network_delegate;
1156 network_delegate.AddToWhitelist(real_temp_dir);
[email protected]3ca8b362013-11-11 22:18:071157 default_context_.set_network_delegate(&network_delegate);
rhalavatib7bd7c792017-04-27 05:25:161158 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1159 test_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191160 r->Start();
[email protected]3ca8b362013-11-11 22:18:071161 base::RunLoop().Run();
satoruxddac0442017-05-29 06:06:181162 // This should be allowed as the file path is whitelisted.
[email protected]3ca8b362013-11-11 22:18:071163 EXPECT_FALSE(d.request_failed());
1164 EXPECT_EQ(test_data, d.data_received());
1165 }
1166
1167 {
1168 TestDelegate d;
satoruxddac0442017-05-29 06:06:181169 CookieBlockingNetworkDelegate network_delegate;
[email protected]3ca8b362013-11-11 22:18:071170 default_context_.set_network_delegate(&network_delegate);
rhalavatib7bd7c792017-04-27 05:25:161171 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1172 test_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191173 r->Start();
[email protected]3ca8b362013-11-11 22:18:071174 base::RunLoop().Run();
satoruxddac0442017-05-29 06:06:181175 // This should be rejected as the file path is not whitelisted.
[email protected]3ca8b362013-11-11 22:18:071176 EXPECT_TRUE(d.request_failed());
1177 EXPECT_EQ("", d.data_received());
satoruxddac0442017-05-29 06:06:181178 EXPECT_EQ(ERR_ACCESS_DENIED, d.request_status());
[email protected]3ca8b362013-11-11 22:18:071179 }
1180}
1181
Kevin Marshalla9f05ec2017-07-14 02:10:051182#if defined(OS_POSIX) && !defined(OS_FUCHSIA) // Because of symbolic links.
satoruxddac0442017-05-29 06:06:181183
1184TEST_F(URLRequestTest, SymlinksToFiles) {
Sergey Ulanov2e49f492017-09-14 19:37:511185 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
satoruxddac0442017-05-29 06:06:181186 // Get an absolute path since temp_dir can contain a symbolic link.
1187 base::FilePath absolute_temp_dir =
Sergey Ulanov2e49f492017-09-14 19:37:511188 base::MakeAbsoluteFilePath(temp_dir_.GetPath());
satoruxddac0442017-05-29 06:06:181189
1190 // Create a good directory (will be whitelisted) and a good file.
1191 base::FilePath good_dir = absolute_temp_dir.AppendASCII("good");
1192 ASSERT_TRUE(base::CreateDirectory(good_dir));
1193 base::FilePath good_file;
1194 ASSERT_TRUE(base::CreateTemporaryFileInDir(good_dir, &good_file));
1195 std::string good_data("good");
1196 base::WriteFile(good_file, good_data.data(), good_data.size());
1197 // See the comment in AllowFileURLs() for why this is done.
1198 base::FilePath real_good_dir = good_file.DirName();
1199
1200 // Create a bad directory (will not be whitelisted) and a bad file.
1201 base::FilePath bad_dir = absolute_temp_dir.AppendASCII("bad");
1202 ASSERT_TRUE(base::CreateDirectory(bad_dir));
1203 base::FilePath bad_file;
1204 ASSERT_TRUE(base::CreateTemporaryFileInDir(bad_dir, &bad_file));
1205 std::string bad_data("bad");
1206 base::WriteFile(bad_file, bad_data.data(), bad_data.size());
1207
1208 // This symlink will point to the good file. Access to the symlink will be
1209 // allowed as both the symlink and the destination file are in the same
1210 // good directory.
1211 base::FilePath good_symlink = good_dir.AppendASCII("good_symlink");
1212 ASSERT_TRUE(base::CreateSymbolicLink(good_file, good_symlink));
1213 GURL good_file_url = FilePathToFileURL(good_symlink);
1214 // This symlink will point to the bad file. Even though the symlink is in
1215 // the good directory, access to the symlink will be rejected since it
1216 // points to the bad file.
1217 base::FilePath bad_symlink = good_dir.AppendASCII("bad_symlink");
1218 ASSERT_TRUE(base::CreateSymbolicLink(bad_file, bad_symlink));
1219 GURL bad_file_url = FilePathToFileURL(bad_symlink);
1220
1221 CookieBlockingNetworkDelegate network_delegate;
1222 network_delegate.AddToWhitelist(real_good_dir);
1223 {
1224 TestDelegate d;
1225 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371226 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1227 good_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181228 r->Start();
1229 base::RunLoop().Run();
1230 // good_file_url should be allowed.
1231 EXPECT_FALSE(d.request_failed());
1232 EXPECT_EQ(good_data, d.data_received());
1233 }
1234
1235 {
1236 TestDelegate d;
1237 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371238 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1239 bad_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181240 r->Start();
1241 base::RunLoop().Run();
1242 // bad_file_url should be rejected.
1243 EXPECT_TRUE(d.request_failed());
1244 EXPECT_EQ("", d.data_received());
1245 EXPECT_EQ(ERR_ACCESS_DENIED, d.request_status());
1246 }
1247}
1248
1249TEST_F(URLRequestTest, SymlinksToDirs) {
Sergey Ulanov2e49f492017-09-14 19:37:511250 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
satoruxddac0442017-05-29 06:06:181251 // Get an absolute path since temp_dir can contain a symbolic link.
1252 base::FilePath absolute_temp_dir =
Sergey Ulanov2e49f492017-09-14 19:37:511253 base::MakeAbsoluteFilePath(temp_dir_.GetPath());
satoruxddac0442017-05-29 06:06:181254
1255 // Create a good directory (will be whitelisted).
1256 base::FilePath good_dir = absolute_temp_dir.AppendASCII("good");
1257 ASSERT_TRUE(base::CreateDirectory(good_dir));
1258
1259 // Create a bad directory (will not be whitelisted).
1260 base::FilePath bad_dir = absolute_temp_dir.AppendASCII("bad");
1261 ASSERT_TRUE(base::CreateDirectory(bad_dir));
1262
1263 // This symlink will point to the good directory. Access to the symlink
1264 // will be allowed as the symlink is in the good dir that'll be white
1265 // listed.
1266 base::FilePath good_symlink = good_dir.AppendASCII("good_symlink");
1267 ASSERT_TRUE(base::CreateSymbolicLink(good_dir, good_symlink));
1268 GURL good_file_url = FilePathToFileURL(good_symlink);
1269 // This symlink will point to the bad directory. Even though the symlink is
1270 // in the good directory, access to the symlink will be rejected since it
1271 // points to the bad directory.
1272 base::FilePath bad_symlink = good_dir.AppendASCII("bad_symlink");
1273 ASSERT_TRUE(base::CreateSymbolicLink(bad_dir, bad_symlink));
1274 GURL bad_file_url = FilePathToFileURL(bad_symlink);
1275
1276 CookieBlockingNetworkDelegate network_delegate;
1277 network_delegate.AddToWhitelist(good_dir);
1278 {
1279 TestDelegate d;
1280 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371281 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1282 good_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181283 r->Start();
1284 base::RunLoop().Run();
1285 // good_file_url should be allowed.
1286 EXPECT_FALSE(d.request_failed());
1287 ASSERT_NE(d.data_received().find("good_symlink"), std::string::npos);
1288 }
1289
1290 {
1291 TestDelegate d;
1292 default_context_.set_network_delegate(&network_delegate);
Ramin Halavati91cbba342017-07-19 13:13:371293 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
1294 bad_file_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
satoruxddac0442017-05-29 06:06:181295 r->Start();
1296 base::RunLoop().Run();
1297 // bad_file_url should be rejected.
1298 EXPECT_TRUE(d.request_failed());
1299 EXPECT_EQ("", d.data_received());
1300 EXPECT_EQ(ERR_ACCESS_DENIED, d.request_status());
1301 }
1302}
1303
Kevin Marshalla9f05ec2017-07-14 02:10:051304#endif // defined(OS_POSIX) && !defined(OS_FUCHSIA)
[email protected]316c1e5e2012-09-12 15:17:441305
1306TEST_F(URLRequestTest, FileDirCancelTest) {
1307 // Put in mock resource provider.
1308 NetModule::SetResourceProvider(TestNetResourceProvider);
1309
1310 TestDelegate d;
1311 {
[email protected]6cdfd7f2013-02-08 20:40:151312 base::FilePath file_path;
[email protected]316c1e5e2012-09-12 15:17:441313 PathService::Get(base::DIR_SOURCE_ROOT, &file_path);
1314 file_path = file_path.Append(FILE_PATH_LITERAL("net"));
1315 file_path = file_path.Append(FILE_PATH_LITERAL("data"));
1316
danakj8522a25b2016-04-16 00:17:361317 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161318 FilePathToFileURL(file_path), DEFAULT_PRIORITY, &d,
1319 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191320 req->Start();
1321 EXPECT_TRUE(req->is_pending());
[email protected]316c1e5e2012-09-12 15:17:441322
1323 d.set_cancel_in_received_data_pending(true);
1324
[email protected]255620da2013-08-19 13:14:291325 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441326 }
1327
1328 // Take out mock resource provider.
1329 NetModule::SetResourceProvider(NULL);
1330}
1331
[email protected]5f9581402013-10-30 13:08:321332TEST_F(URLRequestTest, FileDirOutputSanity) {
1333 // Verify the general sanity of the the output of the file:
1334 // directory lister by checking for the output of a known existing
1335 // file.
1336 const char sentinel_name[] = "filedir-sentinel";
1337
1338 base::FilePath path;
1339 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:471340 path = path.Append(kTestFilePath);
[email protected]5f9581402013-10-30 13:08:321341
1342 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:161343 std::unique_ptr<URLRequest> req(
1344 default_context_.CreateRequest(FilePathToFileURL(path), DEFAULT_PRIORITY,
1345 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191346 req->Start();
[email protected]5f9581402013-10-30 13:08:321347 base::RunLoop().Run();
1348
1349 // Generate entry for the sentinel file.
1350 base::FilePath sentinel_path = path.AppendASCII(sentinel_name);
[email protected]54124ed02014-01-07 10:06:581351 base::File::Info info;
[email protected]9eae4e62013-12-04 20:56:491352 EXPECT_TRUE(base::GetFileInfo(sentinel_path, &info));
[email protected]5f9581402013-10-30 13:08:321353 EXPECT_GT(info.size, 0);
1354 std::string sentinel_output = GetDirectoryListingEntry(
1355 base::string16(sentinel_name, sentinel_name + strlen(sentinel_name)),
satoruxddac0442017-05-29 06:06:181356 std::string(sentinel_name), false /* is_dir */, info.size,
1357
[email protected]5f9581402013-10-30 13:08:321358 info.last_modified);
1359
1360 ASSERT_LT(0, d.bytes_received());
1361 ASSERT_FALSE(d.request_failed());
maksim.sisovb53724b52016-09-16 05:30:501362 EXPECT_EQ(OK, d.request_status());
[email protected]5f9581402013-10-30 13:08:321363 // Check for the entry generated for the "sentinel" file.
1364 const std::string& data = d.data_received();
1365 ASSERT_NE(data.find(sentinel_output), std::string::npos);
1366}
1367
[email protected]316c1e5e2012-09-12 15:17:441368TEST_F(URLRequestTest, FileDirRedirectNoCrash) {
1369 // There is an implicit redirect when loading a file path that matches a
1370 // directory and does not end with a slash. Ensure that following such
1371 // redirects does not crash. See http://crbug.com/18686.
1372
[email protected]6cdfd7f2013-02-08 20:40:151373 base::FilePath path;
[email protected]316c1e5e2012-09-12 15:17:441374 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:471375 path = path.Append(kTestFilePath);
[email protected]316c1e5e2012-09-12 15:17:441376
1377 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:161378 std::unique_ptr<URLRequest> req(
1379 default_context_.CreateRequest(FilePathToFileURL(path), DEFAULT_PRIORITY,
1380 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191381 req->Start();
[email protected]255620da2013-08-19 13:14:291382 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441383
1384 ASSERT_EQ(1, d.received_redirect_count());
1385 ASSERT_LT(0, d.bytes_received());
1386 ASSERT_FALSE(d.request_failed());
maksim.sisovb53724b52016-09-16 05:30:501387 EXPECT_EQ(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:441388}
1389
1390#if defined(OS_WIN)
1391// Don't accept the url "file:///" on windows. See http://crbug.com/1474.
1392TEST_F(URLRequestTest, FileDirRedirectSingleSlash) {
1393 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:161394 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
1395 GURL("file:///"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:191396 req->Start();
[email protected]255620da2013-08-19 13:14:291397 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:441398
1399 ASSERT_EQ(1, d.received_redirect_count());
maksim.sisovb53724b52016-09-16 05:30:501400 EXPECT_NE(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:441401}
[email protected]5ecf7cb282014-05-11 01:49:551402#endif // defined(OS_WIN)
1403
brettwa1228ebb2016-10-28 03:51:341404#endif // !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]5ecf7cb282014-05-11 01:49:551405
1406TEST_F(URLRequestTest, InvalidUrlTest) {
1407 TestDelegate d;
1408 {
rhalavatib7bd7c792017-04-27 05:25:161409 std::unique_ptr<URLRequest> r(
1410 default_context_.CreateRequest(GURL("invalid url"), DEFAULT_PRIORITY,
1411 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5ecf7cb282014-05-11 01:49:551412
[email protected]f7022f32014-08-21 16:32:191413 r->Start();
1414 EXPECT_TRUE(r->is_pending());
[email protected]5ecf7cb282014-05-11 01:49:551415
1416 base::RunLoop().Run();
1417 EXPECT_TRUE(d.request_failed());
1418 }
1419}
1420
jochen0e3b3a62014-09-16 18:31:231421TEST_F(URLRequestTest, InvalidReferrerTest) {
1422 TestURLRequestContext context;
1423 TestNetworkDelegate network_delegate;
1424 network_delegate.set_cancel_request_with_policy_violating_referrer(true);
1425 context.set_network_delegate(&network_delegate);
1426 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361427 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:161428 context.CreateRequest(GURL("http://localhost/"), DEFAULT_PRIORITY, &d,
1429 TRAFFIC_ANNOTATION_FOR_TESTS));
jochen0e3b3a62014-09-16 18:31:231430 req->SetReferrer("https://somewhere.com/");
1431
1432 req->Start();
1433 base::RunLoop().Run();
1434 EXPECT_TRUE(d.request_failed());
1435}
1436
[email protected]5ecf7cb282014-05-11 01:49:551437#if defined(OS_WIN)
1438TEST_F(URLRequestTest, ResolveShortcutTest) {
1439 base::FilePath app_path;
1440 PathService::Get(base::DIR_SOURCE_ROOT, &app_path);
mmenke9f2ec60c2015-06-01 20:59:471441 app_path = app_path.Append(kTestFilePath);
[email protected]5ecf7cb282014-05-11 01:49:551442 app_path = app_path.AppendASCII("with-headers.html");
1443
1444 std::wstring lnk_path = app_path.value() + L".lnk";
1445
1446 base::win::ScopedCOMInitializer com_initializer;
1447
1448 // Temporarily create a shortcut for test
1449 {
Robert Liaoc88f99d12017-10-17 21:48:331450 Microsoft::WRL::ComPtr<IShellLink> shell;
robliaoeb9bfd642017-05-18 17:35:161451 ASSERT_TRUE(SUCCEEDED(::CoCreateInstance(
1452 CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shell))));
Robert Liaoc88f99d12017-10-17 21:48:331453 Microsoft::WRL::ComPtr<IPersistFile> persist;
robliao310fa98b2017-05-11 17:14:001454 ASSERT_TRUE(SUCCEEDED(shell.CopyTo(persist.GetAddressOf())));
[email protected]5ecf7cb282014-05-11 01:49:551455 EXPECT_TRUE(SUCCEEDED(shell->SetPath(app_path.value().c_str())));
1456 EXPECT_TRUE(SUCCEEDED(shell->SetDescription(L"ResolveShortcutTest")));
1457 EXPECT_TRUE(SUCCEEDED(persist->Save(lnk_path.c_str(), TRUE)));
1458 }
1459
1460 TestDelegate d;
1461 {
danakj8522a25b2016-04-16 00:17:361462 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161463 FilePathToFileURL(base::FilePath(lnk_path)), DEFAULT_PRIORITY, &d,
1464 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5ecf7cb282014-05-11 01:49:551465
[email protected]f7022f32014-08-21 16:32:191466 r->Start();
1467 EXPECT_TRUE(r->is_pending());
[email protected]5ecf7cb282014-05-11 01:49:551468
1469 base::RunLoop().Run();
1470
1471 WIN32_FILE_ATTRIBUTE_DATA data;
1472 GetFileAttributesEx(app_path.value().c_str(),
1473 GetFileExInfoStandard, &data);
1474 HANDLE file = CreateFile(app_path.value().c_str(), GENERIC_READ,
1475 FILE_SHARE_READ, NULL, OPEN_EXISTING,
1476 FILE_ATTRIBUTE_NORMAL, NULL);
1477 EXPECT_NE(INVALID_HANDLE_VALUE, file);
danakj8522a25b2016-04-16 00:17:361478 std::unique_ptr<char[]> buffer(new char[data.nFileSizeLow]);
[email protected]5ecf7cb282014-05-11 01:49:551479 DWORD read_size;
1480 BOOL result;
1481 result = ReadFile(file, buffer.get(), data.nFileSizeLow,
1482 &read_size, NULL);
1483 std::string content(buffer.get(), read_size);
1484 CloseHandle(file);
1485
[email protected]f7022f32014-08-21 16:32:191486 EXPECT_TRUE(!r->is_pending());
[email protected]5ecf7cb282014-05-11 01:49:551487 EXPECT_EQ(1, d.received_redirect_count());
1488 EXPECT_EQ(content, d.data_received());
1489 }
1490
1491 // Clean the shortcut
1492 DeleteFile(lnk_path.c_str());
1493}
1494#endif // defined(OS_WIN)
[email protected]316c1e5e2012-09-12 15:17:441495
1496// Custom URLRequestJobs for use with interceptor tests
1497class RestartTestJob : public URLRequestTestJob {
1498 public:
1499 RestartTestJob(URLRequest* request, NetworkDelegate* network_delegate)
1500 : URLRequestTestJob(request, network_delegate, true) {}
1501 protected:
dchengb03027d2014-10-21 12:00:201502 void StartAsync() override { this->NotifyRestartRequired(); }
[email protected]316c1e5e2012-09-12 15:17:441503 private:
Chris Watkins7a41d3552017-12-01 02:13:271504 ~RestartTestJob() override = default;
[email protected]316c1e5e2012-09-12 15:17:441505};
1506
1507class CancelTestJob : public URLRequestTestJob {
1508 public:
1509 explicit CancelTestJob(URLRequest* request, NetworkDelegate* network_delegate)
1510 : URLRequestTestJob(request, network_delegate, true) {}
1511 protected:
dchengb03027d2014-10-21 12:00:201512 void StartAsync() override { request_->Cancel(); }
[email protected]316c1e5e2012-09-12 15:17:441513 private:
Chris Watkins7a41d3552017-12-01 02:13:271514 ~CancelTestJob() override = default;
[email protected]316c1e5e2012-09-12 15:17:441515};
1516
1517class CancelThenRestartTestJob : public URLRequestTestJob {
1518 public:
1519 explicit CancelThenRestartTestJob(URLRequest* request,
1520 NetworkDelegate* network_delegate)
1521 : URLRequestTestJob(request, network_delegate, true) {
1522 }
1523 protected:
dchengb03027d2014-10-21 12:00:201524 void StartAsync() override {
[email protected]316c1e5e2012-09-12 15:17:441525 request_->Cancel();
1526 this->NotifyRestartRequired();
1527 }
1528 private:
Chris Watkins7a41d3552017-12-01 02:13:271529 ~CancelThenRestartTestJob() override = default;
[email protected]316c1e5e2012-09-12 15:17:441530};
1531
bengr1bf8e942014-11-07 01:36:501532// An Interceptor for use with interceptor tests.
1533class MockURLRequestInterceptor : public URLRequestInterceptor {
1534 public:
1535 // Static getters for canned response header and data strings.
1536 static std::string ok_data() {
1537 return URLRequestTestJob::test_data_1();
1538 }
1539
1540 static std::string ok_headers() {
1541 return URLRequestTestJob::test_headers();
1542 }
1543
1544 static std::string redirect_data() {
1545 return std::string();
1546 }
1547
1548 static std::string redirect_headers() {
1549 return URLRequestTestJob::test_redirect_headers();
1550 }
1551
1552 static std::string error_data() {
1553 return std::string("ohhh nooooo mr. bill!");
1554 }
1555
1556 static std::string error_headers() {
1557 return URLRequestTestJob::test_error_headers();
1558 }
1559
1560 MockURLRequestInterceptor()
1561 : intercept_main_request_(false), restart_main_request_(false),
1562 cancel_main_request_(false), cancel_then_restart_main_request_(false),
1563 simulate_main_network_error_(false),
1564 intercept_redirect_(false), cancel_redirect_request_(false),
1565 intercept_final_response_(false), cancel_final_request_(false),
1566 use_url_request_http_job_(false),
1567 did_intercept_main_(false), did_restart_main_(false),
1568 did_cancel_main_(false), did_cancel_then_restart_main_(false),
1569 did_simulate_error_main_(false),
1570 did_intercept_redirect_(false), did_cancel_redirect_(false),
1571 did_intercept_final_(false), did_cancel_final_(false) {
1572 }
1573
Chris Watkins7a41d3552017-12-01 02:13:271574 ~MockURLRequestInterceptor() override = default;
bengr1bf8e942014-11-07 01:36:501575
1576 // URLRequestInterceptor implementation:
1577 URLRequestJob* MaybeInterceptRequest(
1578 URLRequest* request,
1579 NetworkDelegate* network_delegate) const override {
1580 if (restart_main_request_) {
1581 restart_main_request_ = false;
1582 did_restart_main_ = true;
1583 return new RestartTestJob(request, network_delegate);
1584 }
1585 if (cancel_main_request_) {
1586 cancel_main_request_ = false;
1587 did_cancel_main_ = true;
1588 return new CancelTestJob(request, network_delegate);
1589 }
1590 if (cancel_then_restart_main_request_) {
1591 cancel_then_restart_main_request_ = false;
1592 did_cancel_then_restart_main_ = true;
1593 return new CancelThenRestartTestJob(request, network_delegate);
1594 }
1595 if (simulate_main_network_error_) {
1596 simulate_main_network_error_ = false;
1597 did_simulate_error_main_ = true;
1598 if (use_url_request_http_job_) {
1599 return URLRequestHttpJob::Factory(request, network_delegate, "http");
1600 }
1601 // This job will result in error since the requested URL is not one of the
1602 // URLs supported by these tests.
1603 return new URLRequestTestJob(request, network_delegate, true);
1604 }
1605 if (!intercept_main_request_)
1606 return nullptr;
1607 intercept_main_request_ = false;
1608 did_intercept_main_ = true;
1609 URLRequestTestJob* job = new URLRequestTestJob(request,
1610 network_delegate,
1611 main_headers_,
1612 main_data_,
1613 true);
1614 job->set_load_timing_info(main_request_load_timing_info_);
1615 return job;
1616 }
1617
1618 URLRequestJob* MaybeInterceptRedirect(URLRequest* request,
1619 NetworkDelegate* network_delegate,
1620 const GURL& location) const override {
1621 if (cancel_redirect_request_) {
1622 cancel_redirect_request_ = false;
1623 did_cancel_redirect_ = true;
1624 return new CancelTestJob(request, network_delegate);
1625 }
1626 if (!intercept_redirect_)
1627 return nullptr;
1628 intercept_redirect_ = false;
1629 did_intercept_redirect_ = true;
1630 if (use_url_request_http_job_) {
1631 return URLRequestHttpJob::Factory(request, network_delegate, "http");
1632 }
1633 return new URLRequestTestJob(request,
1634 network_delegate,
1635 redirect_headers_,
1636 redirect_data_,
1637 true);
1638 }
1639
1640 URLRequestJob* MaybeInterceptResponse(
1641 URLRequest* request,
1642 NetworkDelegate* network_delegate) const override {
1643 if (cancel_final_request_) {
1644 cancel_final_request_ = false;
1645 did_cancel_final_ = true;
1646 return new CancelTestJob(request, network_delegate);
1647 }
1648 if (!intercept_final_response_)
1649 return nullptr;
1650 intercept_final_response_ = false;
1651 did_intercept_final_ = true;
1652 if (use_url_request_http_job_) {
1653 return URLRequestHttpJob::Factory(request, network_delegate, "http");
1654 }
1655 return new URLRequestTestJob(request,
1656 network_delegate,
1657 final_headers_,
1658 final_data_,
1659 true);
1660 }
1661
1662 void set_intercept_main_request(bool intercept_main_request) {
1663 intercept_main_request_ = intercept_main_request;
1664 }
1665
1666 void set_main_headers(const std::string& main_headers) {
1667 main_headers_ = main_headers;
1668 }
1669
1670 void set_main_data(const std::string& main_data) {
1671 main_data_ = main_data;
1672 }
1673
1674 void set_main_request_load_timing_info(
1675 const LoadTimingInfo& main_request_load_timing_info) {
1676 main_request_load_timing_info_ = main_request_load_timing_info;
1677 }
1678
1679 void set_restart_main_request(bool restart_main_request) {
1680 restart_main_request_ = restart_main_request;
1681 }
1682
1683 void set_cancel_main_request(bool cancel_main_request) {
1684 cancel_main_request_ = cancel_main_request;
1685 }
1686
1687 void set_cancel_then_restart_main_request(
1688 bool cancel_then_restart_main_request) {
1689 cancel_then_restart_main_request_ = cancel_then_restart_main_request;
1690 }
1691
1692 void set_simulate_main_network_error(bool simulate_main_network_error) {
1693 simulate_main_network_error_ = simulate_main_network_error;
1694 }
1695
1696 void set_intercept_redirect(bool intercept_redirect) {
1697 intercept_redirect_ = intercept_redirect;
1698 }
1699
1700 void set_redirect_headers(const std::string& redirect_headers) {
1701 redirect_headers_ = redirect_headers;
1702 }
1703
1704 void set_redirect_data(const std::string& redirect_data) {
1705 redirect_data_ = redirect_data;
1706 }
1707
1708 void set_cancel_redirect_request(bool cancel_redirect_request) {
1709 cancel_redirect_request_ = cancel_redirect_request;
1710 }
1711
1712 void set_intercept_final_response(bool intercept_final_response) {
1713 intercept_final_response_ = intercept_final_response;
1714 }
1715
1716 void set_final_headers(const std::string& final_headers) {
1717 final_headers_ = final_headers;
1718 }
1719
1720 void set_final_data(const std::string& final_data) {
1721 final_data_ = final_data;
1722 }
1723
1724 void set_cancel_final_request(bool cancel_final_request) {
1725 cancel_final_request_ = cancel_final_request;
1726 }
1727
1728 void set_use_url_request_http_job(bool use_url_request_http_job) {
1729 use_url_request_http_job_ = use_url_request_http_job;
1730 }
1731
1732 bool did_intercept_main() const {
1733 return did_intercept_main_;
1734 }
1735
1736 bool did_restart_main() const {
1737 return did_restart_main_;
1738 }
1739
1740 bool did_cancel_main() const {
1741 return did_cancel_main_;
1742 }
1743
1744 bool did_cancel_then_restart_main() const {
1745 return did_cancel_then_restart_main_;
1746 }
1747
1748 bool did_simulate_error_main() const {
1749 return did_simulate_error_main_;
1750 }
1751
1752 bool did_intercept_redirect() const {
1753 return did_intercept_redirect_;
1754 }
1755
1756 bool did_cancel_redirect() const {
1757 return did_cancel_redirect_;
1758 }
1759
1760 bool did_intercept_final() const {
1761 return did_intercept_final_;
1762 }
1763
1764 bool did_cancel_final() const {
1765 return did_cancel_final_;
1766 }
1767
1768 private:
1769 // Indicate whether to intercept the main request, and if so specify the
1770 // response to return and the LoadTimingInfo to use.
1771 mutable bool intercept_main_request_;
1772 mutable std::string main_headers_;
1773 mutable std::string main_data_;
1774 mutable LoadTimingInfo main_request_load_timing_info_;
1775
1776 // These indicate actions that can be taken within MaybeInterceptRequest.
1777 mutable bool restart_main_request_;
1778 mutable bool cancel_main_request_;
1779 mutable bool cancel_then_restart_main_request_;
1780 mutable bool simulate_main_network_error_;
1781
1782 // Indicate whether to intercept redirects, and if so specify the response to
1783 // return.
1784 mutable bool intercept_redirect_;
1785 mutable std::string redirect_headers_;
1786 mutable std::string redirect_data_;
1787
1788 // Cancel the request within MaybeInterceptRedirect.
1789 mutable bool cancel_redirect_request_;
1790
1791 // Indicate whether to intercept the final response, and if so specify the
1792 // response to return.
1793 mutable bool intercept_final_response_;
1794 mutable std::string final_headers_;
1795 mutable std::string final_data_;
1796
1797 // Cancel the final request within MaybeInterceptResponse.
1798 mutable bool cancel_final_request_;
1799
1800 // Instruct the interceptor to use a real URLRequestHTTPJob.
1801 mutable bool use_url_request_http_job_;
1802
1803 // These indicate if the interceptor did something or not.
1804 mutable bool did_intercept_main_;
1805 mutable bool did_restart_main_;
1806 mutable bool did_cancel_main_;
1807 mutable bool did_cancel_then_restart_main_;
1808 mutable bool did_simulate_error_main_;
1809 mutable bool did_intercept_redirect_;
1810 mutable bool did_cancel_redirect_;
1811 mutable bool did_intercept_final_;
1812 mutable bool did_cancel_final_;
1813};
1814
1815// Inherit PlatformTest since we require the autorelease pool on Mac OS X.
1816class URLRequestInterceptorTest : public URLRequestTest {
1817 public:
1818 URLRequestInterceptorTest() : URLRequestTest(), interceptor_(NULL) {
1819 }
1820
1821 ~URLRequestInterceptorTest() override {
1822 // URLRequestJobs may post clean-up tasks on destruction.
1823 base::RunLoop().RunUntilIdle();
1824 }
1825
1826 void SetUpFactory() override {
1827 interceptor_ = new MockURLRequestInterceptor();
1828 job_factory_.reset(new URLRequestInterceptingJobFactory(
danakj8522a25b2016-04-16 00:17:361829 std::move(job_factory_), base::WrapUnique(interceptor_)));
bengr1bf8e942014-11-07 01:36:501830 }
1831
1832 MockURLRequestInterceptor* interceptor() const {
1833 return interceptor_;
1834 }
1835
1836 private:
1837 MockURLRequestInterceptor* interceptor_;
1838};
1839
1840TEST_F(URLRequestInterceptorTest, Intercept) {
1841 // Intercept the main request and respond with a simple response.
1842 interceptor()->set_intercept_main_request(true);
1843 interceptor()->set_main_headers(MockURLRequestInterceptor::ok_headers());
1844 interceptor()->set_main_data(MockURLRequestInterceptor::ok_data());
[email protected]2bba3252013-04-08 19:50:591845 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361846 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161847 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
1848 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:501849 base::SupportsUserData::Data* user_data0 = new base::SupportsUserData::Data();
1850 base::SupportsUserData::Data* user_data1 = new base::SupportsUserData::Data();
1851 base::SupportsUserData::Data* user_data2 = new base::SupportsUserData::Data();
Randy Smith4cd4d36a2017-08-24 01:01:091852 req->SetUserData(&user_data0, base::WrapUnique(user_data0));
avi0d991472017-04-27 07:04:041853 req->SetUserData(&user_data1, base::WrapUnique(user_data1));
1854 req->SetUserData(&user_data2, base::WrapUnique(user_data2));
bengr1bf8e942014-11-07 01:36:501855 req->set_method("GET");
[email protected]f7022f32014-08-21 16:32:191856 req->Start();
[email protected]255620da2013-08-19 13:14:291857 base::RunLoop().Run();
[email protected]2bba3252013-04-08 19:50:591858
bengr1bf8e942014-11-07 01:36:501859 // Make sure we can retrieve our specific user data.
Randy Smith4cd4d36a2017-08-24 01:01:091860 EXPECT_EQ(user_data0, req->GetUserData(&user_data0));
bengr1bf8e942014-11-07 01:36:501861 EXPECT_EQ(user_data1, req->GetUserData(&user_data1));
1862 EXPECT_EQ(user_data2, req->GetUserData(&user_data2));
[email protected]2bba3252013-04-08 19:50:591863
bengr1bf8e942014-11-07 01:36:501864 // Check that we got one good response.
maksim.sisovb53724b52016-09-16 05:30:501865 EXPECT_EQ(OK, d.request_status());
bengr1bf8e942014-11-07 01:36:501866 EXPECT_EQ(200, req->response_headers()->response_code());
1867 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
1868 EXPECT_EQ(1, d.response_started_count());
1869 EXPECT_EQ(0, d.received_redirect_count());
1870}
[email protected]2bba3252013-04-08 19:50:591871
bengr1bf8e942014-11-07 01:36:501872TEST_F(URLRequestInterceptorTest, InterceptRedirect) {
1873 // Intercept the main request and respond with a redirect.
1874 interceptor()->set_intercept_main_request(true);
1875 interceptor()->set_main_headers(
1876 MockURLRequestInterceptor::redirect_headers());
1877 interceptor()->set_main_data(MockURLRequestInterceptor::redirect_data());
1878
1879 // Intercept that redirect and respond with a final OK response.
1880 interceptor()->set_intercept_redirect(true);
1881 interceptor()->set_redirect_headers(MockURLRequestInterceptor::ok_headers());
1882 interceptor()->set_redirect_data(MockURLRequestInterceptor::ok_data());
1883
1884 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361885 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161886 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
1887 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:501888 req->set_method("GET");
1889 req->Start();
1890 base::RunLoop().Run();
1891
1892 // Check that the interceptor got called as expected.
1893 EXPECT_TRUE(interceptor()->did_intercept_main());
1894 EXPECT_TRUE(interceptor()->did_intercept_redirect());
1895
1896 // Check that we got one good response.
maksim.sisovb53724b52016-09-16 05:30:501897 int status = d.request_status();
1898 EXPECT_EQ(OK, status);
1899 if (status == OK)
bengr1bf8e942014-11-07 01:36:501900 EXPECT_EQ(200, req->response_headers()->response_code());
1901
1902 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
1903 EXPECT_EQ(1, d.response_started_count());
1904 EXPECT_EQ(0, d.received_redirect_count());
1905}
1906
1907TEST_F(URLRequestInterceptorTest, InterceptServerError) {
1908 // Intercept the main request to generate a server error response.
1909 interceptor()->set_intercept_main_request(true);
1910 interceptor()->set_main_headers(MockURLRequestInterceptor::error_headers());
1911 interceptor()->set_main_data(MockURLRequestInterceptor::error_data());
1912
1913 // Intercept that error and respond with an OK response.
1914 interceptor()->set_intercept_final_response(true);
1915 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
1916 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
1917
1918 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361919 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161920 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
1921 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:501922 req->set_method("GET");
1923 req->Start();
1924 base::RunLoop().Run();
1925
1926 // Check that the interceptor got called as expected.
1927 EXPECT_TRUE(interceptor()->did_intercept_main());
1928 EXPECT_TRUE(interceptor()->did_intercept_final());
1929
1930 // Check that we got one good response.
maksim.sisovb53724b52016-09-16 05:30:501931 EXPECT_EQ(OK, d.request_status());
bengr1bf8e942014-11-07 01:36:501932 EXPECT_EQ(200, req->response_headers()->response_code());
1933 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
1934 EXPECT_EQ(1, d.response_started_count());
1935 EXPECT_EQ(0, d.received_redirect_count());
1936}
1937
1938TEST_F(URLRequestInterceptorTest, InterceptNetworkError) {
1939 // Intercept the main request to simulate a network error.
1940 interceptor()->set_simulate_main_network_error(true);
1941
1942 // Intercept that error and respond with an OK response.
1943 interceptor()->set_intercept_final_response(true);
1944 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
1945 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
1946
1947 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361948 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161949 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
1950 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:501951 req->set_method("GET");
1952 req->Start();
1953 base::RunLoop().Run();
1954
1955 // Check that the interceptor got called as expected.
1956 EXPECT_TRUE(interceptor()->did_simulate_error_main());
1957 EXPECT_TRUE(interceptor()->did_intercept_final());
1958
1959 // Check that we received one good response.
maksim.sisovb53724b52016-09-16 05:30:501960 EXPECT_EQ(OK, d.request_status());
bengr1bf8e942014-11-07 01:36:501961 EXPECT_EQ(200, req->response_headers()->response_code());
1962 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
1963 EXPECT_EQ(1, d.response_started_count());
1964 EXPECT_EQ(0, d.received_redirect_count());
1965}
1966
1967TEST_F(URLRequestInterceptorTest, InterceptRestartRequired) {
1968 // Restart the main request.
1969 interceptor()->set_restart_main_request(true);
1970
1971 // then intercept the new main request and respond with an OK response
1972 interceptor()->set_intercept_main_request(true);
1973 interceptor()->set_main_headers(MockURLRequestInterceptor::ok_headers());
1974 interceptor()->set_main_data(MockURLRequestInterceptor::ok_data());
1975
1976 TestDelegate d;
danakj8522a25b2016-04-16 00:17:361977 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:161978 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
1979 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:501980 req->set_method("GET");
1981 req->Start();
1982 base::RunLoop().Run();
1983
1984 // Check that the interceptor got called as expected.
1985 EXPECT_TRUE(interceptor()->did_restart_main());
1986 EXPECT_TRUE(interceptor()->did_intercept_main());
1987
1988 // Check that we received one good response.
maksim.sisovb53724b52016-09-16 05:30:501989 int status = d.request_status();
1990 EXPECT_EQ(OK, status);
1991 if (status == OK)
bengr1bf8e942014-11-07 01:36:501992 EXPECT_EQ(200, req->response_headers()->response_code());
1993
1994 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
1995 EXPECT_EQ(1, d.response_started_count());
1996 EXPECT_EQ(0, d.received_redirect_count());
1997}
1998
1999TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelMain) {
2000 // Intercept the main request and cancel from within the restarted job.
2001 interceptor()->set_cancel_main_request(true);
2002
2003 // Set up to intercept the final response and override it with an OK response.
2004 interceptor()->set_intercept_final_response(true);
2005 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
2006 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
2007
2008 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362009 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162010 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2011 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:502012 req->set_method("GET");
2013 req->Start();
2014 base::RunLoop().Run();
2015
2016 // Check that the interceptor got called as expected.
2017 EXPECT_TRUE(interceptor()->did_cancel_main());
2018 EXPECT_FALSE(interceptor()->did_intercept_final());
2019
2020 // Check that we see a canceled request.
maksim.sisovb53724b52016-09-16 05:30:502021 EXPECT_EQ(ERR_ABORTED, d.request_status());
bengr1bf8e942014-11-07 01:36:502022}
2023
2024TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelRedirect) {
2025 // Intercept the main request and respond with a redirect.
2026 interceptor()->set_intercept_main_request(true);
2027 interceptor()->set_main_headers(
2028 MockURLRequestInterceptor::redirect_headers());
2029 interceptor()->set_main_data(MockURLRequestInterceptor::redirect_data());
2030
2031 // Intercept the redirect and cancel from within that job.
2032 interceptor()->set_cancel_redirect_request(true);
2033
2034 // Set up to intercept the final response and override it with an OK response.
2035 interceptor()->set_intercept_final_response(true);
2036 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
2037 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
2038
2039 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362040 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162041 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2042 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:502043 req->set_method("GET");
2044 req->Start();
2045 base::RunLoop().Run();
2046
2047 // Check that the interceptor got called as expected.
2048 EXPECT_TRUE(interceptor()->did_intercept_main());
2049 EXPECT_TRUE(interceptor()->did_cancel_redirect());
2050 EXPECT_FALSE(interceptor()->did_intercept_final());
2051
2052 // Check that we see a canceled request.
maksim.sisovb53724b52016-09-16 05:30:502053 EXPECT_EQ(ERR_ABORTED, d.request_status());
bengr1bf8e942014-11-07 01:36:502054}
2055
2056TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelFinal) {
2057 // Intercept the main request to simulate a network error.
2058 interceptor()->set_simulate_main_network_error(true);
2059
2060 // Set up to intercept final the response and cancel from within that job.
2061 interceptor()->set_cancel_final_request(true);
2062
2063 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362064 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162065 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2066 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:502067 req->set_method("GET");
2068 req->Start();
2069 base::RunLoop().Run();
2070
2071 // Check that the interceptor got called as expected.
2072 EXPECT_TRUE(interceptor()->did_simulate_error_main());
2073 EXPECT_TRUE(interceptor()->did_cancel_final());
2074
2075 // Check that we see a canceled request.
maksim.sisovb53724b52016-09-16 05:30:502076 EXPECT_EQ(ERR_ABORTED, d.request_status());
bengr1bf8e942014-11-07 01:36:502077}
2078
2079TEST_F(URLRequestInterceptorTest, InterceptRespectsCancelInRestart) {
2080 // Intercept the main request and cancel then restart from within that job.
2081 interceptor()->set_cancel_then_restart_main_request(true);
2082
2083 // Set up to intercept the final response and override it with an OK response.
2084 interceptor()->set_intercept_final_response(true);
bengrb50d631e2014-11-17 22:50:502085 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
2086 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
bengr1bf8e942014-11-07 01:36:502087
2088 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362089 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162090 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2091 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:502092 req->set_method("GET");
2093 req->Start();
2094 base::RunLoop().Run();
2095
2096 // Check that the interceptor got called as expected.
2097 EXPECT_TRUE(interceptor()->did_cancel_then_restart_main());
2098 EXPECT_FALSE(interceptor()->did_intercept_final());
2099
2100 // Check that we see a canceled request.
maksim.sisovb53724b52016-09-16 05:30:502101 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]2bba3252013-04-08 19:50:592102}
2103
2104// "Normal" LoadTimingInfo as returned by a job. Everything is in order, not
2105// reused. |connect_time_flags| is used to indicate if there should be dns
2106// or SSL times, and |used_proxy| is used for proxy times.
2107LoadTimingInfo NormalLoadTimingInfo(base::TimeTicks now,
2108 int connect_time_flags,
2109 bool used_proxy) {
2110 LoadTimingInfo load_timing;
2111 load_timing.socket_log_id = 1;
2112
2113 if (used_proxy) {
2114 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1);
2115 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2);
2116 }
2117
2118 LoadTimingInfo::ConnectTiming& connect_timing = load_timing.connect_timing;
2119 if (connect_time_flags & CONNECT_TIMING_HAS_DNS_TIMES) {
2120 connect_timing.dns_start = now + base::TimeDelta::FromDays(3);
2121 connect_timing.dns_end = now + base::TimeDelta::FromDays(4);
2122 }
2123 connect_timing.connect_start = now + base::TimeDelta::FromDays(5);
2124 if (connect_time_flags & CONNECT_TIMING_HAS_SSL_TIMES) {
2125 connect_timing.ssl_start = now + base::TimeDelta::FromDays(6);
2126 connect_timing.ssl_end = now + base::TimeDelta::FromDays(7);
2127 }
2128 connect_timing.connect_end = now + base::TimeDelta::FromDays(8);
2129
2130 load_timing.send_start = now + base::TimeDelta::FromDays(9);
2131 load_timing.send_end = now + base::TimeDelta::FromDays(10);
2132 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11);
2133 return load_timing;
2134}
2135
2136// Same as above, but in the case of a reused socket.
2137LoadTimingInfo NormalLoadTimingInfoReused(base::TimeTicks now,
2138 bool used_proxy) {
2139 LoadTimingInfo load_timing;
2140 load_timing.socket_log_id = 1;
2141 load_timing.socket_reused = true;
2142
2143 if (used_proxy) {
2144 load_timing.proxy_resolve_start = now + base::TimeDelta::FromDays(1);
2145 load_timing.proxy_resolve_end = now + base::TimeDelta::FromDays(2);
2146 }
2147
2148 load_timing.send_start = now + base::TimeDelta::FromDays(9);
2149 load_timing.send_end = now + base::TimeDelta::FromDays(10);
2150 load_timing.receive_headers_end = now + base::TimeDelta::FromDays(11);
2151 return load_timing;
2152}
2153
bengr1bf8e942014-11-07 01:36:502154LoadTimingInfo RunURLRequestInterceptorLoadTimingTest(
2155 const LoadTimingInfo& job_load_timing,
2156 const URLRequestContext& context,
2157 MockURLRequestInterceptor* interceptor) {
2158 interceptor->set_intercept_main_request(true);
2159 interceptor->set_main_request_load_timing_info(job_load_timing);
2160 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:162161 std::unique_ptr<URLRequest> req(
2162 context.CreateRequest(GURL("http://test_intercept/foo"), DEFAULT_PRIORITY,
2163 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:502164 req->Start();
2165 base::RunLoop().Run();
2166
2167 LoadTimingInfo resulting_load_timing;
2168 req->GetLoadTimingInfo(&resulting_load_timing);
2169
2170 // None of these should be modified by the URLRequest.
2171 EXPECT_EQ(job_load_timing.socket_reused, resulting_load_timing.socket_reused);
2172 EXPECT_EQ(job_load_timing.socket_log_id, resulting_load_timing.socket_log_id);
2173 EXPECT_EQ(job_load_timing.send_start, resulting_load_timing.send_start);
2174 EXPECT_EQ(job_load_timing.send_end, resulting_load_timing.send_end);
2175 EXPECT_EQ(job_load_timing.receive_headers_end,
2176 resulting_load_timing.receive_headers_end);
caseqe8340bc92016-04-20 00:02:572177 EXPECT_EQ(job_load_timing.push_start, resulting_load_timing.push_start);
2178 EXPECT_EQ(job_load_timing.push_end, resulting_load_timing.push_end);
bengr1bf8e942014-11-07 01:36:502179
2180 return resulting_load_timing;
2181}
2182
[email protected]2bba3252013-04-08 19:50:592183// Basic test that the intercept + load timing tests work.
bengr1bf8e942014-11-07 01:36:502184TEST_F(URLRequestInterceptorTest, InterceptLoadTiming) {
[email protected]2bba3252013-04-08 19:50:592185 base::TimeTicks now = base::TimeTicks::Now();
2186 LoadTimingInfo job_load_timing =
2187 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, false);
2188
[email protected]2ca01e52013-10-31 22:05:192189 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502190 RunURLRequestInterceptorLoadTimingTest(
2191 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592192
2193 // Nothing should have been changed by the URLRequest.
2194 EXPECT_EQ(job_load_timing.proxy_resolve_start,
2195 load_timing_result.proxy_resolve_start);
2196 EXPECT_EQ(job_load_timing.proxy_resolve_end,
2197 load_timing_result.proxy_resolve_end);
2198 EXPECT_EQ(job_load_timing.connect_timing.dns_start,
2199 load_timing_result.connect_timing.dns_start);
2200 EXPECT_EQ(job_load_timing.connect_timing.dns_end,
2201 load_timing_result.connect_timing.dns_end);
2202 EXPECT_EQ(job_load_timing.connect_timing.connect_start,
2203 load_timing_result.connect_timing.connect_start);
2204 EXPECT_EQ(job_load_timing.connect_timing.connect_end,
2205 load_timing_result.connect_timing.connect_end);
2206 EXPECT_EQ(job_load_timing.connect_timing.ssl_start,
2207 load_timing_result.connect_timing.ssl_start);
2208 EXPECT_EQ(job_load_timing.connect_timing.ssl_end,
2209 load_timing_result.connect_timing.ssl_end);
2210
2211 // Redundant sanity check.
2212 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_DNS_TIMES);
2213}
2214
2215// Another basic test, with proxy and SSL times, but no DNS times.
bengr1bf8e942014-11-07 01:36:502216TEST_F(URLRequestInterceptorTest, InterceptLoadTimingProxy) {
[email protected]2bba3252013-04-08 19:50:592217 base::TimeTicks now = base::TimeTicks::Now();
2218 LoadTimingInfo job_load_timing =
2219 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, true);
2220
[email protected]2ca01e52013-10-31 22:05:192221 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502222 RunURLRequestInterceptorLoadTimingTest(
2223 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592224
2225 // Nothing should have been changed by the URLRequest.
2226 EXPECT_EQ(job_load_timing.proxy_resolve_start,
2227 load_timing_result.proxy_resolve_start);
2228 EXPECT_EQ(job_load_timing.proxy_resolve_end,
2229 load_timing_result.proxy_resolve_end);
2230 EXPECT_EQ(job_load_timing.connect_timing.dns_start,
2231 load_timing_result.connect_timing.dns_start);
2232 EXPECT_EQ(job_load_timing.connect_timing.dns_end,
2233 load_timing_result.connect_timing.dns_end);
2234 EXPECT_EQ(job_load_timing.connect_timing.connect_start,
2235 load_timing_result.connect_timing.connect_start);
2236 EXPECT_EQ(job_load_timing.connect_timing.connect_end,
2237 load_timing_result.connect_timing.connect_end);
2238 EXPECT_EQ(job_load_timing.connect_timing.ssl_start,
2239 load_timing_result.connect_timing.ssl_start);
2240 EXPECT_EQ(job_load_timing.connect_timing.ssl_end,
2241 load_timing_result.connect_timing.ssl_end);
2242
2243 // Redundant sanity check.
2244 TestLoadTimingNotReusedWithProxy(load_timing_result,
2245 CONNECT_TIMING_HAS_SSL_TIMES);
2246}
2247
2248// Make sure that URLRequest correctly adjusts proxy times when they're before
2249// |request_start|, due to already having a connected socket. This happens in
[email protected]cf4cae32014-05-27 00:39:102250// the case of reusing a SPDY session. The connected socket is not considered
2251// reused in this test (May be a preconnect).
[email protected]2bba3252013-04-08 19:50:592252//
2253// To mix things up from the test above, assumes DNS times but no SSL times.
bengr1bf8e942014-11-07 01:36:502254TEST_F(URLRequestInterceptorTest, InterceptLoadTimingEarlyProxyResolution) {
[email protected]2bba3252013-04-08 19:50:592255 base::TimeTicks now = base::TimeTicks::Now();
2256 LoadTimingInfo job_load_timing =
2257 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_DNS_TIMES, true);
2258 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(6);
2259 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(5);
2260 job_load_timing.connect_timing.dns_start = now - base::TimeDelta::FromDays(4);
2261 job_load_timing.connect_timing.dns_end = now - base::TimeDelta::FromDays(3);
2262 job_load_timing.connect_timing.connect_start =
2263 now - base::TimeDelta::FromDays(2);
2264 job_load_timing.connect_timing.connect_end =
2265 now - base::TimeDelta::FromDays(1);
2266
[email protected]2ca01e52013-10-31 22:05:192267 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502268 RunURLRequestInterceptorLoadTimingTest(
2269 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592270
2271 // Proxy times, connect times, and DNS times should all be replaced with
2272 // request_start.
2273 EXPECT_EQ(load_timing_result.request_start,
2274 load_timing_result.proxy_resolve_start);
2275 EXPECT_EQ(load_timing_result.request_start,
2276 load_timing_result.proxy_resolve_end);
2277 EXPECT_EQ(load_timing_result.request_start,
2278 load_timing_result.connect_timing.dns_start);
2279 EXPECT_EQ(load_timing_result.request_start,
2280 load_timing_result.connect_timing.dns_end);
2281 EXPECT_EQ(load_timing_result.request_start,
2282 load_timing_result.connect_timing.connect_start);
2283 EXPECT_EQ(load_timing_result.request_start,
2284 load_timing_result.connect_timing.connect_end);
2285
2286 // Other times should have been left null.
2287 TestLoadTimingNotReusedWithProxy(load_timing_result,
2288 CONNECT_TIMING_HAS_DNS_TIMES);
2289}
2290
2291// Same as above, but in the reused case.
bengr1bf8e942014-11-07 01:36:502292TEST_F(URLRequestInterceptorTest,
2293 InterceptLoadTimingEarlyProxyResolutionReused) {
[email protected]2bba3252013-04-08 19:50:592294 base::TimeTicks now = base::TimeTicks::Now();
2295 LoadTimingInfo job_load_timing = NormalLoadTimingInfoReused(now, true);
2296 job_load_timing.proxy_resolve_start = now - base::TimeDelta::FromDays(4);
2297 job_load_timing.proxy_resolve_end = now - base::TimeDelta::FromDays(3);
2298
[email protected]2ca01e52013-10-31 22:05:192299 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502300 RunURLRequestInterceptorLoadTimingTest(
2301 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592302
2303 // Proxy times and connect times should all be replaced with request_start.
2304 EXPECT_EQ(load_timing_result.request_start,
2305 load_timing_result.proxy_resolve_start);
2306 EXPECT_EQ(load_timing_result.request_start,
2307 load_timing_result.proxy_resolve_end);
2308
2309 // Other times should have been left null.
2310 TestLoadTimingReusedWithProxy(load_timing_result);
2311}
2312
2313// Make sure that URLRequest correctly adjusts connect times when they're before
2314// |request_start|, due to reusing a connected socket. The connected socket is
2315// not considered reused in this test (May be a preconnect).
2316//
2317// To mix things up, the request has SSL times, but no DNS times.
bengr1bf8e942014-11-07 01:36:502318TEST_F(URLRequestInterceptorTest, InterceptLoadTimingEarlyConnect) {
[email protected]2bba3252013-04-08 19:50:592319 base::TimeTicks now = base::TimeTicks::Now();
2320 LoadTimingInfo job_load_timing =
2321 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_SSL_TIMES, false);
2322 job_load_timing.connect_timing.connect_start =
2323 now - base::TimeDelta::FromDays(1);
2324 job_load_timing.connect_timing.ssl_start = now - base::TimeDelta::FromDays(2);
2325 job_load_timing.connect_timing.ssl_end = now - base::TimeDelta::FromDays(3);
2326 job_load_timing.connect_timing.connect_end =
2327 now - base::TimeDelta::FromDays(4);
2328
[email protected]2ca01e52013-10-31 22:05:192329 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502330 RunURLRequestInterceptorLoadTimingTest(
2331 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592332
2333 // Connect times, and SSL times should be replaced with request_start.
2334 EXPECT_EQ(load_timing_result.request_start,
2335 load_timing_result.connect_timing.connect_start);
2336 EXPECT_EQ(load_timing_result.request_start,
2337 load_timing_result.connect_timing.ssl_start);
2338 EXPECT_EQ(load_timing_result.request_start,
2339 load_timing_result.connect_timing.ssl_end);
2340 EXPECT_EQ(load_timing_result.request_start,
2341 load_timing_result.connect_timing.connect_end);
2342
2343 // Other times should have been left null.
2344 TestLoadTimingNotReused(load_timing_result, CONNECT_TIMING_HAS_SSL_TIMES);
2345}
2346
2347// Make sure that URLRequest correctly adjusts connect times when they're before
2348// |request_start|, due to reusing a connected socket in the case that there
2349// are also proxy times. The connected socket is not considered reused in this
2350// test (May be a preconnect).
2351//
2352// In this test, there are no SSL or DNS times.
bengr1bf8e942014-11-07 01:36:502353TEST_F(URLRequestInterceptorTest, InterceptLoadTimingEarlyConnectWithProxy) {
[email protected]2bba3252013-04-08 19:50:592354 base::TimeTicks now = base::TimeTicks::Now();
2355 LoadTimingInfo job_load_timing =
2356 NormalLoadTimingInfo(now, CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY, true);
2357 job_load_timing.connect_timing.connect_start =
2358 now - base::TimeDelta::FromDays(1);
2359 job_load_timing.connect_timing.connect_end =
2360 now - base::TimeDelta::FromDays(2);
2361
[email protected]2ca01e52013-10-31 22:05:192362 LoadTimingInfo load_timing_result =
bengr1bf8e942014-11-07 01:36:502363 RunURLRequestInterceptorLoadTimingTest(
2364 job_load_timing, default_context(), interceptor());
[email protected]2bba3252013-04-08 19:50:592365
2366 // Connect times should be replaced with proxy_resolve_end.
2367 EXPECT_EQ(load_timing_result.proxy_resolve_end,
2368 load_timing_result.connect_timing.connect_start);
2369 EXPECT_EQ(load_timing_result.proxy_resolve_end,
2370 load_timing_result.connect_timing.connect_end);
2371
2372 // Other times should have been left null.
2373 TestLoadTimingNotReusedWithProxy(load_timing_result,
2374 CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY);
2375}
2376
[email protected]316c1e5e2012-09-12 15:17:442377// Check that two different URL requests have different identifiers.
2378TEST_F(URLRequestTest, Identifiers) {
2379 TestDelegate d;
2380 TestURLRequestContext context;
danakj8522a25b2016-04-16 00:17:362381 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:162382 context.CreateRequest(GURL("http://example.com"), DEFAULT_PRIORITY, &d,
2383 TRAFFIC_ANNOTATION_FOR_TESTS));
danakj8522a25b2016-04-16 00:17:362384 std::unique_ptr<URLRequest> other_req(
rhalavatib7bd7c792017-04-27 05:25:162385 context.CreateRequest(GURL("http://example.com"), DEFAULT_PRIORITY, &d,
2386 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:442387
mmenke19378d22014-09-09 04:12:592388 ASSERT_NE(req->identifier(), other_req->identifier());
[email protected]316c1e5e2012-09-12 15:17:442389}
2390
blundellb8163592f2015-12-16 14:22:422391#if defined(OS_IOS)
2392// TODO(droger): Check that a failure to connect to the proxy is reported to
2393// the network delegate. crbug.com/496743
2394#define MAYBE_NetworkDelegateProxyError DISABLED_NetworkDelegateProxyError
2395#else
2396#define MAYBE_NetworkDelegateProxyError NetworkDelegateProxyError
2397#endif
2398TEST_F(URLRequestTest, MAYBE_NetworkDelegateProxyError) {
[email protected]316c1e5e2012-09-12 15:17:442399 MockHostResolver host_resolver;
2400 host_resolver.rules()->AddSimulatedFailure("*");
2401
[email protected]ceefd7fd2012-11-29 00:36:242402 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]316c1e5e2012-09-12 15:17:442403 TestURLRequestContextWithProxy context("myproxy:70", &network_delegate);
2404
2405 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362406 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:162407 context.CreateRequest(GURL("http://example.com"), DEFAULT_PRIORITY, &d,
2408 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192409 req->set_method("GET");
[email protected]316c1e5e2012-09-12 15:17:442410
[email protected]f7022f32014-08-21 16:32:192411 req->Start();
[email protected]255620da2013-08-19 13:14:292412 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442413
2414 // Check we see a failed request.
[email protected]d8fc4722014-06-13 13:17:152415 // The proxy server is not set before failure.
tbansal2ecbbc72016-10-06 17:15:472416 EXPECT_FALSE(req->proxy_server().is_valid());
maksim.sisovb53724b52016-09-16 05:30:502417 EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:442418
2419 EXPECT_EQ(1, network_delegate.error_count());
robpercival214763f2016-07-01 23:27:012420 EXPECT_THAT(network_delegate.last_error(),
2421 IsError(ERR_PROXY_CONNECTION_FAILED));
[email protected]316c1e5e2012-09-12 15:17:442422 EXPECT_EQ(1, network_delegate.completed_requests());
2423}
2424
[email protected]cba24642014-08-15 20:49:592425// Make sure that NetworkDelegate::NotifyCompleted is called if
[email protected]316c1e5e2012-09-12 15:17:442426// content is empty.
2427TEST_F(URLRequestTest, RequestCompletionForEmptyResponse) {
2428 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:162429 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
2430 GURL("data:,"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192431 req->Start();
[email protected]255620da2013-08-19 13:14:292432 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442433 EXPECT_EQ("", d.data_received());
2434 EXPECT_EQ(1, default_network_delegate_.completed_requests());
2435}
2436
[email protected]5033ab82013-03-22 20:17:462437// Make sure that SetPriority actually sets the URLRequest's priority
2438// correctly, both before and after start.
2439TEST_F(URLRequestTest, SetPriorityBasic) {
2440 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362441 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162442 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2443 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192444 EXPECT_EQ(DEFAULT_PRIORITY, req->priority());
[email protected]5033ab82013-03-22 20:17:462445
[email protected]f7022f32014-08-21 16:32:192446 req->SetPriority(LOW);
2447 EXPECT_EQ(LOW, req->priority());
[email protected]5033ab82013-03-22 20:17:462448
[email protected]f7022f32014-08-21 16:32:192449 req->Start();
2450 EXPECT_EQ(LOW, req->priority());
[email protected]5033ab82013-03-22 20:17:462451
[email protected]f7022f32014-08-21 16:32:192452 req->SetPriority(MEDIUM);
2453 EXPECT_EQ(MEDIUM, req->priority());
[email protected]5033ab82013-03-22 20:17:462454}
2455
2456// Make sure that URLRequest calls SetPriority on a job before calling
2457// Start on it.
2458TEST_F(URLRequestTest, SetJobPriorityBeforeJobStart) {
2459 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362460 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162461 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2462 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192463 EXPECT_EQ(DEFAULT_PRIORITY, req->priority());
[email protected]5033ab82013-03-22 20:17:462464
mmenkeed0498b2015-12-08 23:20:422465 RequestPriority job_priority;
danakj8522a25b2016-04-16 00:17:362466 std::unique_ptr<URLRequestJob> job(new PriorityMonitoringURLRequestJob(
mmenkeed0498b2015-12-08 23:20:422467 req.get(), &default_network_delegate_, &job_priority));
2468 AddTestInterceptor()->set_main_intercept_job(std::move(job));
2469 EXPECT_EQ(DEFAULT_PRIORITY, job_priority);
[email protected]5033ab82013-03-22 20:17:462470
[email protected]f7022f32014-08-21 16:32:192471 req->SetPriority(LOW);
[email protected]5033ab82013-03-22 20:17:462472
[email protected]f7022f32014-08-21 16:32:192473 req->Start();
mmenkeed0498b2015-12-08 23:20:422474 EXPECT_EQ(LOW, job_priority);
[email protected]5033ab82013-03-22 20:17:462475}
2476
2477// Make sure that URLRequest passes on its priority updates to its
2478// job.
2479TEST_F(URLRequestTest, SetJobPriority) {
2480 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362481 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162482 GURL("http://test_intercept/foo"), DEFAULT_PRIORITY, &d,
2483 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5033ab82013-03-22 20:17:462484
mmenkeed0498b2015-12-08 23:20:422485 RequestPriority job_priority;
danakj8522a25b2016-04-16 00:17:362486 std::unique_ptr<URLRequestJob> job(new PriorityMonitoringURLRequestJob(
mmenkeed0498b2015-12-08 23:20:422487 req.get(), &default_network_delegate_, &job_priority));
2488 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]5033ab82013-03-22 20:17:462489
[email protected]f7022f32014-08-21 16:32:192490 req->SetPriority(LOW);
2491 req->Start();
mmenkeed0498b2015-12-08 23:20:422492 EXPECT_EQ(LOW, job_priority);
[email protected]5033ab82013-03-22 20:17:462493
[email protected]f7022f32014-08-21 16:32:192494 req->SetPriority(MEDIUM);
2495 EXPECT_EQ(MEDIUM, req->priority());
mmenkeed0498b2015-12-08 23:20:422496 EXPECT_EQ(MEDIUM, job_priority);
[email protected]5033ab82013-03-22 20:17:462497}
2498
[email protected]bb1c4662013-11-14 00:00:072499// Setting the IGNORE_LIMITS load flag should be okay if the priority
2500// is MAXIMUM_PRIORITY.
2501TEST_F(URLRequestTest, PriorityIgnoreLimits) {
2502 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362503 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162504 GURL("http://test_intercept/foo"), MAXIMUM_PRIORITY, &d,
2505 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192506 EXPECT_EQ(MAXIMUM_PRIORITY, req->priority());
[email protected]bb1c4662013-11-14 00:00:072507
mmenkeed0498b2015-12-08 23:20:422508 RequestPriority job_priority;
danakj8522a25b2016-04-16 00:17:362509 std::unique_ptr<URLRequestJob> job(new PriorityMonitoringURLRequestJob(
mmenkeed0498b2015-12-08 23:20:422510 req.get(), &default_network_delegate_, &job_priority));
2511 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]bb1c4662013-11-14 00:00:072512
[email protected]f7022f32014-08-21 16:32:192513 req->SetLoadFlags(LOAD_IGNORE_LIMITS);
2514 EXPECT_EQ(MAXIMUM_PRIORITY, req->priority());
[email protected]bb1c4662013-11-14 00:00:072515
[email protected]f7022f32014-08-21 16:32:192516 req->SetPriority(MAXIMUM_PRIORITY);
2517 EXPECT_EQ(MAXIMUM_PRIORITY, req->priority());
[email protected]bb1c4662013-11-14 00:00:072518
[email protected]f7022f32014-08-21 16:32:192519 req->Start();
2520 EXPECT_EQ(MAXIMUM_PRIORITY, req->priority());
mmenkeed0498b2015-12-08 23:20:422521 EXPECT_EQ(MAXIMUM_PRIORITY, job_priority);
[email protected]bb1c4662013-11-14 00:00:072522}
2523
nick5d570de92015-05-04 20:16:162524namespace {
2525
2526// Less verbose way of running a simple testserver for the tests below.
David Benjamin42116f62017-11-20 21:45:392527class HttpTestServer : public EmbeddedTestServer {
[email protected]316c1e5e2012-09-12 15:17:442528 public:
David Benjamin42116f62017-11-20 21:45:392529 explicit HttpTestServer(const base::FilePath& document_root) {
tommycli59a63432015-11-06 00:10:552530 AddDefaultHandlers(document_root);
tommyclieae5f75f2015-11-05 19:07:272531 }
tommycli59a63432015-11-06 00:10:552532
David Benjamin42116f62017-11-20 21:45:392533 HttpTestServer() { AddDefaultHandlers(base::FilePath()); }
tommycli59a63432015-11-06 00:10:552534};
tommyclieae5f75f2015-11-05 19:07:272535
nick5d570de92015-05-04 20:16:162536} // namespace
2537
[email protected]f2f31b32013-01-16 23:24:092538TEST_F(URLRequestTest, DelayedCookieCallback) {
David Benjamin42116f62017-11-20 21:45:392539 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442540 ASSERT_TRUE(test_server.Start());
2541
2542 TestURLRequestContext context;
danakj8522a25b2016-04-16 00:17:362543 std::unique_ptr<DelayedCookieMonster> delayed_cm(new DelayedCookieMonster());
[email protected]90499482013-06-01 00:39:502544 context.set_cookie_store(delayed_cm.get());
[email protected]316c1e5e2012-09-12 15:17:442545
2546 // Set up a cookie.
2547 {
2548 TestNetworkDelegate network_delegate;
2549 context.set_network_delegate(&network_delegate);
2550 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362551 std::unique_ptr<URLRequest> req(context.CreateRequest(
tommycli59a63432015-11-06 00:10:552552 test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162553 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192554 req->Start();
[email protected]255620da2013-08-19 13:14:292555 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442556 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2557 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2558 EXPECT_EQ(1, network_delegate.set_cookie_count());
2559 }
2560
2561 // Verify that the cookie is set.
2562 {
2563 TestNetworkDelegate network_delegate;
2564 context.set_network_delegate(&network_delegate);
2565 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362566 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162567 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2568 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192569 req->Start();
[email protected]255620da2013-08-19 13:14:292570 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442571
2572 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
2573 != std::string::npos);
2574 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2575 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2576 }
2577}
2578
[email protected]f2f31b32013-01-16 23:24:092579TEST_F(URLRequestTest, DoNotSendCookies) {
David Benjamin42116f62017-11-20 21:45:392580 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442581 ASSERT_TRUE(test_server.Start());
2582
2583 // Set up a cookie.
2584 {
2585 TestNetworkDelegate network_delegate;
2586 default_context_.set_network_delegate(&network_delegate);
2587 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362588 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552589 test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162590 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192591 req->Start();
[email protected]255620da2013-08-19 13:14:292592 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442593 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2594 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2595 }
2596
2597 // Verify that the cookie is set.
2598 {
2599 TestNetworkDelegate network_delegate;
2600 default_context_.set_network_delegate(&network_delegate);
2601 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362602 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162603 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2604 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192605 req->Start();
[email protected]255620da2013-08-19 13:14:292606 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442607
2608 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
2609 != std::string::npos);
2610 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2611 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2612 }
2613
2614 // Verify that the cookie isn't sent when LOAD_DO_NOT_SEND_COOKIES is set.
2615 {
2616 TestNetworkDelegate network_delegate;
2617 default_context_.set_network_delegate(&network_delegate);
2618 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362619 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162620 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2621 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192622 req->SetLoadFlags(LOAD_DO_NOT_SEND_COOKIES);
2623 req->Start();
[email protected]255620da2013-08-19 13:14:292624 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442625
2626 EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
2627 == std::string::npos);
2628
2629 // LOAD_DO_NOT_SEND_COOKIES does not trigger OnGetCookies.
2630 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2631 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2632 }
2633}
2634
2635TEST_F(URLRequestTest, DoNotSaveCookies) {
David Benjamin42116f62017-11-20 21:45:392636 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442637 ASSERT_TRUE(test_server.Start());
2638
2639 // Set up a cookie.
2640 {
2641 TestNetworkDelegate network_delegate;
2642 default_context_.set_network_delegate(&network_delegate);
2643 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362644 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552645 test_server.GetURL("/set-cookie?CookieToNotUpdate=2"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162646 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192647 req->Start();
[email protected]255620da2013-08-19 13:14:292648 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442649
2650 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2651 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2652 EXPECT_EQ(1, network_delegate.set_cookie_count());
2653 }
2654
2655 // Try to set-up another cookie and update the previous cookie.
2656 {
2657 TestNetworkDelegate network_delegate;
2658 default_context_.set_network_delegate(&network_delegate);
2659 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362660 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552661 test_server.GetURL("/set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
rhalavatib7bd7c792017-04-27 05:25:162662 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192663 req->SetLoadFlags(LOAD_DO_NOT_SAVE_COOKIES);
2664 req->Start();
[email protected]316c1e5e2012-09-12 15:17:442665
[email protected]255620da2013-08-19 13:14:292666 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442667
2668 // LOAD_DO_NOT_SAVE_COOKIES does not trigger OnSetCookie.
2669 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2670 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2671 EXPECT_EQ(0, network_delegate.set_cookie_count());
2672 }
2673
2674 // Verify the cookies weren't saved or updated.
2675 {
2676 TestNetworkDelegate network_delegate;
2677 default_context_.set_network_delegate(&network_delegate);
2678 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362679 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162680 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2681 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192682 req->Start();
[email protected]255620da2013-08-19 13:14:292683 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442684
2685 EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
2686 == std::string::npos);
2687 EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
2688 != std::string::npos);
2689
2690 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2691 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2692 EXPECT_EQ(0, network_delegate.set_cookie_count());
2693 }
2694}
2695
2696TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy) {
David Benjamin42116f62017-11-20 21:45:392697 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442698 ASSERT_TRUE(test_server.Start());
2699
2700 // Set up a cookie.
2701 {
2702 TestNetworkDelegate network_delegate;
2703 default_context_.set_network_delegate(&network_delegate);
2704 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362705 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552706 test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162707 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192708 req->Start();
[email protected]255620da2013-08-19 13:14:292709 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442710
2711 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2712 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2713 }
2714
2715 // Verify that the cookie is set.
2716 {
2717 TestNetworkDelegate network_delegate;
2718 default_context_.set_network_delegate(&network_delegate);
2719 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362720 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162721 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2722 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192723 req->Start();
[email protected]255620da2013-08-19 13:14:292724 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442725
2726 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
2727 != std::string::npos);
2728
2729 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2730 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2731 }
2732
2733 // Verify that the cookie isn't sent.
2734 {
2735 TestNetworkDelegate network_delegate;
2736 default_context_.set_network_delegate(&network_delegate);
2737 TestDelegate d;
2738 network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
danakj8522a25b2016-04-16 00:17:362739 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162740 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2741 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192742 req->Start();
[email protected]255620da2013-08-19 13:14:292743 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442744
2745 EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
2746 == std::string::npos);
2747
[email protected]22e045f2013-09-20 03:54:032748 EXPECT_EQ(1, network_delegate.blocked_get_cookies_count());
[email protected]316c1e5e2012-09-12 15:17:442749 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2750 }
2751}
2752
marqf14fff8d2015-12-02 15:52:292753// TODO(crbug.com/564656) This test is flaky on iOS.
2754#if defined(OS_IOS)
2755#define MAYBE_DoNotSaveCookies_ViaPolicy FLAKY_DoNotSaveCookies_ViaPolicy
2756#else
2757#define MAYBE_DoNotSaveCookies_ViaPolicy DoNotSaveCookies_ViaPolicy
2758#endif
[email protected]316c1e5e2012-09-12 15:17:442759TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy) {
David Benjamin42116f62017-11-20 21:45:392760 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442761 ASSERT_TRUE(test_server.Start());
2762
2763 // Set up a cookie.
2764 {
2765 TestNetworkDelegate network_delegate;
2766 default_context_.set_network_delegate(&network_delegate);
2767 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362768 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552769 test_server.GetURL("/set-cookie?CookieToNotUpdate=2"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162770 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192771 req->Start();
[email protected]255620da2013-08-19 13:14:292772 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442773
2774 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2775 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2776 }
2777
2778 // Try to set-up another cookie and update the previous cookie.
2779 {
2780 TestNetworkDelegate network_delegate;
2781 default_context_.set_network_delegate(&network_delegate);
2782 TestDelegate d;
2783 network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
danakj8522a25b2016-04-16 00:17:362784 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552785 test_server.GetURL("/set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
rhalavatib7bd7c792017-04-27 05:25:162786 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192787 req->Start();
[email protected]316c1e5e2012-09-12 15:17:442788
[email protected]255620da2013-08-19 13:14:292789 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442790
2791 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2792 EXPECT_EQ(2, network_delegate.blocked_set_cookie_count());
2793 }
2794
2795 // Verify the cookies weren't saved or updated.
2796 {
2797 TestNetworkDelegate network_delegate;
2798 default_context_.set_network_delegate(&network_delegate);
2799 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362800 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162801 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2802 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192803 req->Start();
[email protected]255620da2013-08-19 13:14:292804 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442805
2806 EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
2807 == std::string::npos);
2808 EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
2809 != std::string::npos);
2810
2811 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2812 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2813 }
2814}
2815
2816TEST_F(URLRequestTest, DoNotSaveEmptyCookies) {
David Benjamin42116f62017-11-20 21:45:392817 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442818 ASSERT_TRUE(test_server.Start());
2819
2820 // Set up an empty cookie.
2821 {
2822 TestNetworkDelegate network_delegate;
2823 default_context_.set_network_delegate(&network_delegate);
2824 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362825 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162826 test_server.GetURL("/set-cookie"), DEFAULT_PRIORITY, &d,
2827 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192828 req->Start();
[email protected]255620da2013-08-19 13:14:292829 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442830
2831 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2832 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2833 EXPECT_EQ(0, network_delegate.set_cookie_count());
2834 }
2835}
2836
2837TEST_F(URLRequestTest, DoNotSendCookies_ViaPolicy_Async) {
David Benjamin42116f62017-11-20 21:45:392838 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442839 ASSERT_TRUE(test_server.Start());
2840
2841 // Set up a cookie.
2842 {
2843 TestNetworkDelegate network_delegate;
2844 default_context_.set_network_delegate(&network_delegate);
2845 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362846 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552847 test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162848 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192849 req->Start();
[email protected]255620da2013-08-19 13:14:292850 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442851
2852 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2853 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2854 }
2855
2856 // Verify that the cookie is set.
2857 {
2858 TestNetworkDelegate network_delegate;
2859 default_context_.set_network_delegate(&network_delegate);
2860 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362861 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162862 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2863 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192864 req->Start();
[email protected]255620da2013-08-19 13:14:292865 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442866
2867 EXPECT_TRUE(d.data_received().find("CookieToNotSend=1")
2868 != std::string::npos);
2869
2870 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2871 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2872 }
2873
2874 // Verify that the cookie isn't sent.
2875 {
2876 TestNetworkDelegate network_delegate;
2877 default_context_.set_network_delegate(&network_delegate);
2878 TestDelegate d;
2879 network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
danakj8522a25b2016-04-16 00:17:362880 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162881 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2882 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192883 req->Start();
[email protected]255620da2013-08-19 13:14:292884 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442885
2886 EXPECT_TRUE(d.data_received().find("Cookie: CookieToNotSend=1")
2887 == std::string::npos);
2888
[email protected]22e045f2013-09-20 03:54:032889 EXPECT_EQ(1, network_delegate.blocked_get_cookies_count());
[email protected]316c1e5e2012-09-12 15:17:442890 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2891 }
2892}
2893
2894TEST_F(URLRequestTest, DoNotSaveCookies_ViaPolicy_Async) {
David Benjamin42116f62017-11-20 21:45:392895 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:442896 ASSERT_TRUE(test_server.Start());
2897
2898 // Set up a cookie.
2899 {
2900 TestNetworkDelegate network_delegate;
2901 default_context_.set_network_delegate(&network_delegate);
2902 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362903 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552904 test_server.GetURL("/set-cookie?CookieToNotUpdate=2"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:162905 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192906 req->Start();
[email protected]255620da2013-08-19 13:14:292907 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442908
2909 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2910 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2911 }
2912
2913 // Try to set-up another cookie and update the previous cookie.
2914 {
2915 TestNetworkDelegate network_delegate;
2916 default_context_.set_network_delegate(&network_delegate);
2917 TestDelegate d;
2918 network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
danakj8522a25b2016-04-16 00:17:362919 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:552920 test_server.GetURL("/set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
rhalavatib7bd7c792017-04-27 05:25:162921 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192922 req->Start();
[email protected]316c1e5e2012-09-12 15:17:442923
[email protected]255620da2013-08-19 13:14:292924 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442925
2926 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2927 EXPECT_EQ(2, network_delegate.blocked_set_cookie_count());
2928 }
2929
2930 // Verify the cookies weren't saved or updated.
2931 {
2932 TestNetworkDelegate network_delegate;
2933 default_context_.set_network_delegate(&network_delegate);
2934 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362935 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162936 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2937 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:192938 req->Start();
[email protected]255620da2013-08-19 13:14:292939 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:442940
2941 EXPECT_TRUE(d.data_received().find("CookieToNotSave=1")
2942 == std::string::npos);
2943 EXPECT_TRUE(d.data_received().find("CookieToNotUpdate=2")
2944 != std::string::npos);
2945
2946 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2947 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2948 }
2949}
2950
mkwstc5fa7762016-03-28 09:28:232951TEST_F(URLRequestTest, SameSiteCookies) {
David Benjamin42116f62017-11-20 21:45:392952 HttpTestServer test_server;
mkwst3f3daac2015-02-26 20:15:262953 ASSERT_TRUE(test_server.Start());
2954
mkwst202534e32016-01-15 16:07:152955 TestNetworkDelegate network_delegate;
mkwst202534e32016-01-15 16:07:152956 default_context_.set_network_delegate(&network_delegate);
2957
mkwstf71d0bd2016-03-21 14:15:242958 const std::string kHost = "example.test";
2959 const std::string kSubHost = "subdomain.example.test";
2960 const std::string kCrossHost = "cross-origin.test";
2961
2962 // Set up two 'SameSite' cookies on 'example.test'
mkwst3f3daac2015-02-26 20:15:262963 {
mkwst3f3daac2015-02-26 20:15:262964 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362965 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
mkwstf71d0bd2016-03-21 14:15:242966 test_server.GetURL(kHost,
2967 "/set-cookie?StrictSameSiteCookie=1;SameSite=Strict&"
2968 "LaxSameSiteCookie=1;SameSite=Lax"),
rhalavatib7bd7c792017-04-27 05:25:162969 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
mkwst3f3daac2015-02-26 20:15:262970 req->Start();
2971 base::RunLoop().Run();
2972 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2973 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
mkwstf71d0bd2016-03-21 14:15:242974 EXPECT_EQ(2, network_delegate.set_cookie_count());
mkwst3f3daac2015-02-26 20:15:262975 }
2976
mkwstf71d0bd2016-03-21 14:15:242977 // Verify that both cookies are sent for same-site requests.
mkwst3f3daac2015-02-26 20:15:262978 {
mkwst3f3daac2015-02-26 20:15:262979 TestDelegate d;
danakj8522a25b2016-04-16 00:17:362980 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:162981 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
2982 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:462983 req->set_site_for_cookies(test_server.GetURL(kHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:462984 req->set_initiator(url::Origin::Create(test_server.GetURL(kHost, "/")));
mkwst3f3daac2015-02-26 20:15:262985 req->Start();
2986 base::RunLoop().Run();
2987
mkwstf71d0bd2016-03-21 14:15:242988 EXPECT_NE(std::string::npos,
2989 d.data_received().find("StrictSameSiteCookie=1"));
2990 EXPECT_NE(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
mkwst3f3daac2015-02-26 20:15:262991 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
2992 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
2993 }
2994
clamyfd58ca072016-12-21 17:18:322995 // Verify that both cookies are sent when the request has no initiator (can
2996 // happen for main frame browser-initiated navigations).
2997 {
2998 TestDelegate d;
2999 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163000 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3001 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463002 req->set_site_for_cookies(test_server.GetURL(kHost, "/"));
clamyfd58ca072016-12-21 17:18:323003 req->Start();
3004 base::RunLoop().Run();
3005
3006 EXPECT_NE(std::string::npos,
3007 d.data_received().find("StrictSameSiteCookie=1"));
3008 EXPECT_NE(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
3009 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3010 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3011 }
3012
mkwstf71d0bd2016-03-21 14:15:243013 // Verify that both cookies are sent for same-registrable-domain requests.
mkwst3f3daac2015-02-26 20:15:263014 {
mkwst3f3daac2015-02-26 20:15:263015 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363016 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163017 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3018 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463019 req->set_site_for_cookies(test_server.GetURL(kSubHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463020 req->set_initiator(url::Origin::Create(test_server.GetURL(kSubHost, "/")));
mkwst202534e32016-01-15 16:07:153021 req->Start();
3022 base::RunLoop().Run();
3023
mkwstf71d0bd2016-03-21 14:15:243024 EXPECT_NE(std::string::npos,
3025 d.data_received().find("StrictSameSiteCookie=1"));
3026 EXPECT_NE(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
mkwst202534e32016-01-15 16:07:153027 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3028 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3029 }
3030
mkwstf71d0bd2016-03-21 14:15:243031 // Verify that neither cookie is not sent for cross-site requests.
3032 {
3033 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363034 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163035 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3036 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463037 req->set_site_for_cookies(test_server.GetURL(kCrossHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463038 req->set_initiator(
3039 url::Origin::Create(test_server.GetURL(kCrossHost, "/")));
mkwstf71d0bd2016-03-21 14:15:243040 req->Start();
3041 base::RunLoop().Run();
3042
3043 EXPECT_EQ(std::string::npos,
3044 d.data_received().find("StrictSameSiteCookie=1"));
3045 EXPECT_EQ(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
3046 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3047 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3048 }
3049
3050 // Verify that the lax cookie is sent for cross-site initiators when the
mkwst202534e32016-01-15 16:07:153051 // method is "safe".
3052 {
3053 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363054 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163055 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3056 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463057 req->set_site_for_cookies(test_server.GetURL(kHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463058 req->set_initiator(
3059 url::Origin::Create(test_server.GetURL(kCrossHost, "/")));
mkwstf71d0bd2016-03-21 14:15:243060 req->set_method("GET");
mkwst202534e32016-01-15 16:07:153061 req->Start();
3062 base::RunLoop().Run();
3063
mkwstf71d0bd2016-03-21 14:15:243064 EXPECT_EQ(std::string::npos,
3065 d.data_received().find("StrictSameSiteCookie=1"));
3066 EXPECT_NE(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
mkwst202534e32016-01-15 16:07:153067 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3068 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3069 }
3070
mkwstf71d0bd2016-03-21 14:15:243071 // Verify that neither cookie is sent for cross-site initiators when the
mkwst202534e32016-01-15 16:07:153072 // method is unsafe (e.g. POST).
3073 {
3074 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363075 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163076 test_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3077 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463078 req->set_site_for_cookies(test_server.GetURL(kHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463079 req->set_initiator(
3080 url::Origin::Create(test_server.GetURL(kCrossHost, "/")));
mkwst202534e32016-01-15 16:07:153081 req->set_method("POST");
mkwst3f3daac2015-02-26 20:15:263082 req->Start();
3083 base::RunLoop().Run();
3084
mkwstf71d0bd2016-03-21 14:15:243085 EXPECT_EQ(std::string::npos,
3086 d.data_received().find("StrictSameSiteCookie=1"));
3087 EXPECT_EQ(std::string::npos, d.data_received().find("LaxSameSiteCookie=1"));
mkwst3f3daac2015-02-26 20:15:263088 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3089 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3090 }
3091}
3092
estark557a5eb82015-12-01 22:57:103093// Tests that __Secure- cookies can't be set on non-secure origins.
estarkcd39c11f2015-10-19 19:46:363094TEST_F(URLRequestTest, SecureCookiePrefixOnNonsecureOrigin) {
tommycli59a63432015-11-06 00:10:553095 EmbeddedTestServer http_server;
3096 http_server.AddDefaultHandlers(
estarkcd39c11f2015-10-19 19:46:363097 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
tommycli59a63432015-11-06 00:10:553098 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3099 https_server.AddDefaultHandlers(
3100 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3101 ASSERT_TRUE(http_server.Start());
3102 ASSERT_TRUE(https_server.Start());
estarkcd39c11f2015-10-19 19:46:363103
estarkb15166b2015-12-18 16:56:383104 TestNetworkDelegate network_delegate;
estarkcd39c11f2015-10-19 19:46:363105 TestURLRequestContext context(true);
3106 context.set_network_delegate(&network_delegate);
3107 context.Init();
3108
estarkb15166b2015-12-18 16:56:383109 // Try to set a Secure __Secure- cookie.
estarkcd39c11f2015-10-19 19:46:363110 {
3111 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363112 std::unique_ptr<URLRequest> req(context.CreateRequest(
estark557a5eb82015-12-01 22:57:103113 http_server.GetURL("/set-cookie?__Secure-nonsecure-origin=1;Secure"),
rhalavatib7bd7c792017-04-27 05:25:163114 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363115 req->Start();
3116 base::RunLoop().Run();
3117 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3118 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3119 }
3120
3121 // Verify that the cookie is not set.
3122 {
3123 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363124 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163125 https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3126 TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363127 req->Start();
3128 base::RunLoop().Run();
3129
jww79aceda2015-12-07 01:56:343130 EXPECT_EQ(d.data_received().find("__Secure-nonsecure-origin=1"),
3131 std::string::npos);
estarkcd39c11f2015-10-19 19:46:363132 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3133 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3134 }
3135}
3136
estarkb15166b2015-12-18 16:56:383137TEST_F(URLRequestTest, SecureCookiePrefixNonsecure) {
tommycli59a63432015-11-06 00:10:553138 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3139 https_server.AddDefaultHandlers(
estarkcd39c11f2015-10-19 19:46:363140 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
tommycli59a63432015-11-06 00:10:553141 ASSERT_TRUE(https_server.Start());
estarkcd39c11f2015-10-19 19:46:363142
3143 TestNetworkDelegate network_delegate;
3144 TestURLRequestContext context(true);
3145 context.set_network_delegate(&network_delegate);
3146 context.Init();
3147
estarkb15166b2015-12-18 16:56:383148 // Try to set a non-Secure __Secure- cookie.
estarkcd39c11f2015-10-19 19:46:363149 {
3150 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:163151 std::unique_ptr<URLRequest> req(context.CreateRequest(
3152 https_server.GetURL("/set-cookie?__Secure-foo=1"), DEFAULT_PRIORITY, &d,
3153 TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363154 req->Start();
3155 base::RunLoop().Run();
3156 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3157 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3158 }
3159
3160 // Verify that the cookie is not set.
3161 {
3162 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363163 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163164 https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3165 TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363166 req->Start();
3167 base::RunLoop().Run();
3168
jww79aceda2015-12-07 01:56:343169 EXPECT_EQ(d.data_received().find("__Secure-foo=1"), std::string::npos);
estarkcd39c11f2015-10-19 19:46:363170 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3171 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3172 }
3173}
3174
estarkb15166b2015-12-18 16:56:383175TEST_F(URLRequestTest, SecureCookiePrefixSecure) {
tommycli59a63432015-11-06 00:10:553176 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3177 https_server.AddDefaultHandlers(
estarkcd39c11f2015-10-19 19:46:363178 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
tommycli59a63432015-11-06 00:10:553179 ASSERT_TRUE(https_server.Start());
estarkcd39c11f2015-10-19 19:46:363180
estarkb15166b2015-12-18 16:56:383181 TestNetworkDelegate network_delegate;
estarkcd39c11f2015-10-19 19:46:363182 TestURLRequestContext context(true);
3183 context.set_network_delegate(&network_delegate);
3184 context.Init();
3185
estarkb15166b2015-12-18 16:56:383186 // Try to set a Secure __Secure- cookie.
estarkcd39c11f2015-10-19 19:46:363187 {
3188 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363189 std::unique_ptr<URLRequest> req(context.CreateRequest(
estark557a5eb82015-12-01 22:57:103190 https_server.GetURL("/set-cookie?__Secure-bar=1;Secure"),
rhalavatib7bd7c792017-04-27 05:25:163191 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363192 req->Start();
3193 base::RunLoop().Run();
3194 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3195 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3196 }
3197
3198 // Verify that the cookie is set.
3199 {
3200 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363201 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163202 https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3203 TRAFFIC_ANNOTATION_FOR_TESTS));
estarkcd39c11f2015-10-19 19:46:363204 req->Start();
3205 base::RunLoop().Run();
3206
jww79aceda2015-12-07 01:56:343207 EXPECT_NE(d.data_received().find("__Secure-bar=1"), std::string::npos);
3208 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3209 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3210 }
3211}
3212
3213// Tests that secure cookies can't be set on non-secure origins if strict secure
3214// cookies are enabled.
3215TEST_F(URLRequestTest, StrictSecureCookiesOnNonsecureOrigin) {
3216 EmbeddedTestServer http_server;
3217 http_server.AddDefaultHandlers(
3218 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3219 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3220 https_server.AddDefaultHandlers(
3221 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3222 ASSERT_TRUE(http_server.Start());
3223 ASSERT_TRUE(https_server.Start());
3224
3225 TestExperimentalFeaturesNetworkDelegate network_delegate;
3226 TestURLRequestContext context(true);
3227 context.set_network_delegate(&network_delegate);
3228 context.Init();
3229
3230 // Try to set a Secure cookie, with experimental features enabled.
3231 {
3232 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363233 std::unique_ptr<URLRequest> req(context.CreateRequest(
jww79aceda2015-12-07 01:56:343234 http_server.GetURL("/set-cookie?nonsecure-origin=1;Secure"),
rhalavatib7bd7c792017-04-27 05:25:163235 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
jww79aceda2015-12-07 01:56:343236 req->Start();
3237 base::RunLoop().Run();
3238 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3239 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3240 }
3241
3242 // Verify that the cookie is not set.
3243 {
3244 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363245 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163246 https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3247 TRAFFIC_ANNOTATION_FOR_TESTS));
jww79aceda2015-12-07 01:56:343248 req->Start();
3249 base::RunLoop().Run();
3250
3251 EXPECT_EQ(d.data_received().find("nonsecure-origin=1"), std::string::npos);
3252 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3253 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3254 }
3255}
3256
3257// Tests that secure cookies can be set on secure origins even if strict secure
3258// cookies are enabled.
3259TEST_F(URLRequestTest, StrictSecureCookiesOnSecureOrigin) {
3260 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3261 https_server.AddDefaultHandlers(
3262 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3263 ASSERT_TRUE(https_server.Start());
3264
3265 TestExperimentalFeaturesNetworkDelegate network_delegate;
3266 TestURLRequestContext context(true);
3267 context.set_network_delegate(&network_delegate);
3268 context.Init();
3269
3270 // Try to set a Secure cookie, with experimental features enabled.
3271 {
3272 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363273 std::unique_ptr<URLRequest> req(context.CreateRequest(
jww79aceda2015-12-07 01:56:343274 https_server.GetURL("/set-cookie?secure-origin=1;Secure"),
rhalavatib7bd7c792017-04-27 05:25:163275 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
jww79aceda2015-12-07 01:56:343276 req->Start();
3277 base::RunLoop().Run();
3278 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3279 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3280 }
3281
3282 // Verify that the cookie is not set.
3283 {
3284 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363285 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163286 https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3287 TRAFFIC_ANNOTATION_FOR_TESTS));
jww79aceda2015-12-07 01:56:343288 req->Start();
3289 base::RunLoop().Run();
3290
3291 EXPECT_NE(d.data_received().find("secure-origin=1"), std::string::npos);
estarkcd39c11f2015-10-19 19:46:363292 EXPECT_EQ(0, network_delegate.blocked_get_cookies_count());
3293 EXPECT_EQ(0, network_delegate.blocked_set_cookie_count());
3294 }
3295}
3296
Mike West86149882017-07-28 10:41:493297TEST_F(URLRequestTest, CookieAgeMetrics) {
3298 EmbeddedTestServer http_server;
3299 http_server.AddDefaultHandlers(
3300 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3301 EmbeddedTestServer https_server(EmbeddedTestServer::TYPE_HTTPS);
3302 https_server.AddDefaultHandlers(
3303 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
3304 ASSERT_TRUE(http_server.Start());
3305 ASSERT_TRUE(https_server.Start());
3306
3307 TestNetworkDelegate network_delegate;
3308 default_context_.set_network_delegate(&network_delegate);
3309 base::HistogramTester histograms;
3310
3311 const std::string kHost = "example.test";
3312 const std::string kCrossHost = "cross-origin.test";
3313
3314 // Set a test cookie.
3315 {
3316 TestDelegate d;
3317 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3318 http_server.GetURL(kHost, "/set-cookie?cookie=value"), DEFAULT_PRIORITY,
3319 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
3320 req->Start();
3321 base::RunLoop().Run();
3322 ASSERT_EQ(1, network_delegate.set_cookie_count());
3323 }
3324
3325 // Make a secure request to `example.test`: we shouldn't record data.
3326 {
3327 TestDelegate d;
3328 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3329 https_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3330 TRAFFIC_ANNOTATION_FOR_TESTS));
3331 req->Start();
3332 base::RunLoop().Run();
3333 histograms.ExpectTotalCount("Cookie.AgeForNonSecureCrossSiteRequest", 0);
3334 histograms.ExpectTotalCount("Cookie.AgeForNonSecureSameSiteRequest", 0);
3335 }
3336
3337 // Make a non-secure same-site request.
3338 {
3339 TestDelegate d;
3340 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3341 http_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3342 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463343 req->set_site_for_cookies(http_server.GetURL(kHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463344 req->set_initiator(url::Origin::Create(http_server.GetURL(kHost, "/")));
Mike West86149882017-07-28 10:41:493345 req->Start();
3346 base::RunLoop().Run();
3347 histograms.ExpectTotalCount("Cookie.AgeForNonSecureCrossSiteRequest", 0);
3348 histograms.ExpectTotalCount("Cookie.AgeForNonSecureSameSiteRequest", 1);
3349 }
3350
3351 // Make a non-secure cross-site request.
3352 {
3353 TestDelegate d;
3354 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3355 http_server.GetURL(kHost, "/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3356 TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:463357 req->set_site_for_cookies(http_server.GetURL(kCrossHost, "/"));
Daniel Cheng88186bd52017-10-20 08:14:463358 req->set_initiator(
3359 url::Origin::Create(http_server.GetURL(kCrossHost, "/")));
Mike West86149882017-07-28 10:41:493360 req->Start();
3361 base::RunLoop().Run();
3362 histograms.ExpectTotalCount("Cookie.AgeForNonSecureCrossSiteRequest", 1);
3363 histograms.ExpectTotalCount("Cookie.AgeForNonSecureSameSiteRequest", 1);
3364 }
3365}
3366
mmenkefb18c772015-09-30 22:22:503367// Tests that a request is cancelled while entering suspend mode. Uses mocks
3368// rather than a spawned test server because the connection used to talk to
3369// the test server is affected by entering suspend mode on Android.
3370TEST_F(URLRequestTest, CancelOnSuspend) {
3371 TestPowerMonitorSource* power_monitor_source = new TestPowerMonitorSource();
danakj8522a25b2016-04-16 00:17:363372 base::PowerMonitor power_monitor(base::WrapUnique(power_monitor_source));
mmenkefb18c772015-09-30 22:22:503373
3374 URLRequestFailedJob::AddUrlHandler();
3375
3376 TestDelegate d;
3377 // Request that just hangs.
3378 GURL url(URLRequestFailedJob::GetMockHttpUrl(ERR_IO_PENDING));
rhalavatib7bd7c792017-04-27 05:25:163379 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
3380 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
mmenkefb18c772015-09-30 22:22:503381 r->Start();
3382
3383 power_monitor_source->Suspend();
3384 // Wait for the suspend notification to cause the request to fail.
3385 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:503386 EXPECT_EQ(ERR_ABORTED, d.request_status());
mmenkefb18c772015-09-30 22:22:503387 EXPECT_TRUE(d.request_failed());
3388 EXPECT_EQ(1, default_network_delegate_.completed_requests());
3389
3390 URLRequestFilter::GetInstance()->ClearHandlers();
3391
3392 // Shouldn't be needed, but just in case.
3393 power_monitor_source->Resume();
3394}
3395
[email protected]5095cd72012-11-01 10:29:163396// FixedDateNetworkDelegate swaps out the server's HTTP Date response header
3397// value for the |fixed_date| argument given to the constructor.
3398class FixedDateNetworkDelegate : public TestNetworkDelegate {
3399 public:
3400 explicit FixedDateNetworkDelegate(const std::string& fixed_date)
3401 : fixed_date_(fixed_date) {}
Chris Watkins7a41d3552017-12-01 02:13:273402 ~FixedDateNetworkDelegate() override = default;
[email protected]5095cd72012-11-01 10:29:163403
[email protected]cba24642014-08-15 20:49:593404 // NetworkDelegate implementation
dchengb03027d2014-10-21 12:00:203405 int OnHeadersReceived(
[email protected]cba24642014-08-15 20:49:593406 URLRequest* request,
3407 const CompletionCallback& callback,
3408 const HttpResponseHeaders* original_response_headers,
3409 scoped_refptr<HttpResponseHeaders>* override_response_headers,
mostynbba063d6032014-10-09 11:01:133410 GURL* allowed_unsafe_redirect_url) override;
[email protected]5095cd72012-11-01 10:29:163411
3412 private:
3413 std::string fixed_date_;
3414
3415 DISALLOW_COPY_AND_ASSIGN(FixedDateNetworkDelegate);
3416};
3417
3418int FixedDateNetworkDelegate::OnHeadersReceived(
[email protected]cba24642014-08-15 20:49:593419 URLRequest* request,
3420 const CompletionCallback& callback,
3421 const HttpResponseHeaders* original_response_headers,
3422 scoped_refptr<HttpResponseHeaders>* override_response_headers,
[email protected]5f714132014-03-26 10:41:163423 GURL* allowed_unsafe_redirect_url) {
[email protected]cba24642014-08-15 20:49:593424 HttpResponseHeaders* new_response_headers =
3425 new HttpResponseHeaders(original_response_headers->raw_headers());
[email protected]5095cd72012-11-01 10:29:163426
3427 new_response_headers->RemoveHeader("Date");
3428 new_response_headers->AddHeader("Date: " + fixed_date_);
3429
3430 *override_response_headers = new_response_headers;
3431 return TestNetworkDelegate::OnHeadersReceived(request,
3432 callback,
3433 original_response_headers,
[email protected]5f714132014-03-26 10:41:163434 override_response_headers,
3435 allowed_unsafe_redirect_url);
[email protected]5095cd72012-11-01 10:29:163436}
3437
3438// Test that cookie expiration times are adjusted for server/client clock
3439// skew and that we handle incorrect timezone specifier "UTC" in HTTP Date
3440// headers by defaulting to GMT. (crbug.com/135131)
3441TEST_F(URLRequestTest, AcceptClockSkewCookieWithWrongDateTimezone) {
David Benjamin42116f62017-11-20 21:45:393442 HttpTestServer test_server;
[email protected]5095cd72012-11-01 10:29:163443 ASSERT_TRUE(test_server.Start());
3444
3445 // Set up an expired cookie.
3446 {
3447 TestNetworkDelegate network_delegate;
3448 default_context_.set_network_delegate(&network_delegate);
3449 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363450 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
[email protected]2ca01e52013-10-31 22:05:193451 test_server.GetURL(
tommycli59a63432015-11-06 00:10:553452 "/set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
rhalavatib7bd7c792017-04-27 05:25:163453 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193454 req->Start();
[email protected]255620da2013-08-19 13:14:293455 base::RunLoop().Run();
[email protected]5095cd72012-11-01 10:29:163456 }
3457 // Verify that the cookie is not set.
3458 {
3459 TestNetworkDelegate network_delegate;
3460 default_context_.set_network_delegate(&network_delegate);
3461 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363462 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163463 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3464 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193465 req->Start();
[email protected]255620da2013-08-19 13:14:293466 base::RunLoop().Run();
[email protected]5095cd72012-11-01 10:29:163467
3468 EXPECT_TRUE(d.data_received().find("StillGood=1") == std::string::npos);
3469 }
3470 // Set up a cookie with clock skew and "UTC" HTTP Date timezone specifier.
3471 {
3472 FixedDateNetworkDelegate network_delegate("18-Apr-1977 22:49:13 UTC");
3473 default_context_.set_network_delegate(&network_delegate);
3474 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363475 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
[email protected]2ca01e52013-10-31 22:05:193476 test_server.GetURL(
tommycli59a63432015-11-06 00:10:553477 "/set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
rhalavatib7bd7c792017-04-27 05:25:163478 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193479 req->Start();
[email protected]255620da2013-08-19 13:14:293480 base::RunLoop().Run();
[email protected]5095cd72012-11-01 10:29:163481 }
3482 // Verify that the cookie is set.
3483 {
3484 TestNetworkDelegate network_delegate;
3485 default_context_.set_network_delegate(&network_delegate);
3486 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363487 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163488 test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
3489 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193490 req->Start();
[email protected]255620da2013-08-19 13:14:293491 base::RunLoop().Run();
[email protected]5095cd72012-11-01 10:29:163492
3493 EXPECT_TRUE(d.data_received().find("StillGood=1") != std::string::npos);
3494 }
3495}
3496
3497
[email protected]316c1e5e2012-09-12 15:17:443498// Check that it is impossible to change the referrer in the extra headers of
3499// an URLRequest.
3500TEST_F(URLRequestTest, DoNotOverrideReferrer) {
David Benjamin42116f62017-11-20 21:45:393501 HttpTestServer test_server;
[email protected]316c1e5e2012-09-12 15:17:443502 ASSERT_TRUE(test_server.Start());
3503
3504 // If extra headers contain referer and the request contains a referer,
3505 // only the latter shall be respected.
3506 {
3507 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363508 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163509 test_server.GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
3510 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193511 req->SetReferrer("http://foo.com/");
[email protected]316c1e5e2012-09-12 15:17:443512
3513 HttpRequestHeaders headers;
3514 headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/");
[email protected]f7022f32014-08-21 16:32:193515 req->SetExtraRequestHeaders(headers);
[email protected]316c1e5e2012-09-12 15:17:443516
[email protected]f7022f32014-08-21 16:32:193517 req->Start();
[email protected]255620da2013-08-19 13:14:293518 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:443519
3520 EXPECT_EQ("http://foo.com/", d.data_received());
3521 }
3522
3523 // If extra headers contain a referer but the request does not, no referer
3524 // shall be sent in the header.
3525 {
3526 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363527 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163528 test_server.GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
3529 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:443530
3531 HttpRequestHeaders headers;
3532 headers.SetHeader(HttpRequestHeaders::kReferer, "http://bar.com/");
[email protected]f7022f32014-08-21 16:32:193533 req->SetExtraRequestHeaders(headers);
3534 req->SetLoadFlags(LOAD_VALIDATE_CACHE);
[email protected]316c1e5e2012-09-12 15:17:443535
[email protected]f7022f32014-08-21 16:32:193536 req->Start();
[email protected]255620da2013-08-19 13:14:293537 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:443538
3539 EXPECT_EQ("None", d.data_received());
3540 }
3541}
3542
[email protected]b89290212009-08-14 22:37:353543class URLRequestTestHTTP : public URLRequestTest {
[email protected]95409e12010-08-17 20:07:113544 public:
mmenke9f2ec60c2015-06-01 20:59:473545 URLRequestTestHTTP() : test_server_(base::FilePath(kTestFilePath)) {}
[email protected]95409e12010-08-17 20:07:113546
[email protected]b89290212009-08-14 22:37:353547 protected:
[email protected]21184962011-10-26 00:50:303548 // Requests |redirect_url|, which must return a HTTP 3xx redirect.
3549 // |request_method| is the method to use for the initial request.
3550 // |redirect_method| is the method that is expected to be used for the second
3551 // request, after redirection.
3552 // If |include_data| is true, data is uploaded with the request. The
3553 // response body is expected to match it exactly, if and only if
3554 // |request_method| == |redirect_method|.
3555 void HTTPRedirectMethodTest(const GURL& redirect_url,
3556 const std::string& request_method,
3557 const std::string& redirect_method,
3558 bool include_data) {
3559 static const char kData[] = "hello world";
3560 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:163561 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3562 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193563 req->set_method(request_method);
[email protected]21184962011-10-26 00:50:303564 if (include_data) {
mmenkecbc2b712014-10-09 20:29:073565 req->set_upload(CreateSimpleUploadData(kData));
[email protected]21184962011-10-26 00:50:303566 HttpRequestHeaders headers;
3567 headers.SetHeader(HttpRequestHeaders::kContentLength,
Brett Wilson5accd242017-11-30 22:07:323568 base::NumberToString(arraysize(kData) - 1));
svaldez5b3a8972015-10-09 23:23:543569 headers.SetHeader(HttpRequestHeaders::kContentType, "text/plain");
[email protected]f7022f32014-08-21 16:32:193570 req->SetExtraRequestHeaders(headers);
[email protected]21184962011-10-26 00:50:303571 }
[email protected]f7022f32014-08-21 16:32:193572 req->Start();
[email protected]255620da2013-08-19 13:14:293573 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:193574 EXPECT_EQ(redirect_method, req->method());
maksim.sisovb53724b52016-09-16 05:30:503575 EXPECT_EQ(OK, d.request_status());
[email protected]21184962011-10-26 00:50:303576 if (include_data) {
3577 if (request_method == redirect_method) {
svaldez5b3a8972015-10-09 23:23:543578 EXPECT_TRUE(req->extra_request_headers().HasHeader(
3579 HttpRequestHeaders::kContentLength));
3580 EXPECT_TRUE(req->extra_request_headers().HasHeader(
3581 HttpRequestHeaders::kContentType));
[email protected]21184962011-10-26 00:50:303582 EXPECT_EQ(kData, d.data_received());
3583 } else {
svaldez5b3a8972015-10-09 23:23:543584 EXPECT_FALSE(req->extra_request_headers().HasHeader(
3585 HttpRequestHeaders::kContentLength));
3586 EXPECT_FALSE(req->extra_request_headers().HasHeader(
3587 HttpRequestHeaders::kContentType));
[email protected]21184962011-10-26 00:50:303588 EXPECT_NE(kData, d.data_received());
3589 }
3590 }
3591 if (HasFailure())
3592 LOG(WARNING) << "Request method was: " << request_method;
3593 }
3594
Alex Clarke1e08882b32017-10-06 14:22:403595 // Requests |redirect_url|, which must return a HTTP 3xx redirect. It's also
3596 // used as the initial origin.
jww5fe460ff2015-03-28 00:22:513597 // |request_method| is the method to use for the initial request.
3598 // |redirect_method| is the method that is expected to be used for the second
3599 // request, after redirection.
Alex Clarke1e08882b32017-10-06 14:22:403600 // |expected_origin_value| is the expected value for the Origin header after
jww5fe460ff2015-03-28 00:22:513601 // redirection. If empty, expects that there will be no Origin header.
3602 void HTTPRedirectOriginHeaderTest(const GURL& redirect_url,
3603 const std::string& request_method,
3604 const std::string& redirect_method,
Alex Clarke1e08882b32017-10-06 14:22:403605 const std::string& expected_origin_value) {
jww5fe460ff2015-03-28 00:22:513606 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:163607 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
3608 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
jww5fe460ff2015-03-28 00:22:513609 req->set_method(request_method);
3610 req->SetExtraRequestHeaderByName(HttpRequestHeaders::kOrigin,
3611 redirect_url.GetOrigin().spec(), false);
3612 req->Start();
3613
3614 base::RunLoop().Run();
3615
3616 EXPECT_EQ(redirect_method, req->method());
3617 // Note that there is no check for request success here because, for
3618 // purposes of testing, the request very well may fail. For example, if the
3619 // test redirects to an HTTPS server from an HTTP origin, thus it is cross
3620 // origin, there is not an HTTPS server in this unit test framework, so the
3621 // request would fail. However, that's fine, as long as the request headers
3622 // are in order and pass the checks below.
Alex Clarke1e08882b32017-10-06 14:22:403623 if (expected_origin_value.empty()) {
jww5fe460ff2015-03-28 00:22:513624 EXPECT_FALSE(
3625 req->extra_request_headers().HasHeader(HttpRequestHeaders::kOrigin));
3626 } else {
3627 std::string origin_header;
3628 EXPECT_TRUE(req->extra_request_headers().GetHeader(
3629 HttpRequestHeaders::kOrigin, &origin_header));
Alex Clarke1e08882b32017-10-06 14:22:403630 EXPECT_EQ(expected_origin_value, origin_header);
jww5fe460ff2015-03-28 00:22:513631 }
3632 }
3633
[email protected]762d2db2010-01-11 19:03:013634 void HTTPUploadDataOperationTest(const std::string& method) {
[email protected]762d2db2010-01-11 19:03:013635 const int kMsgSize = 20000; // multiple of 10
3636 const int kIterations = 50;
[email protected]f43b89f32012-05-01 19:39:483637 char* uploadBytes = new char[kMsgSize+1];
3638 char* ptr = uploadBytes;
[email protected]762d2db2010-01-11 19:03:013639 char marker = 'a';
3640 for (int idx = 0; idx < kMsgSize/10; idx++) {
3641 memcpy(ptr, "----------", 10);
3642 ptr += 10;
3643 if (idx % 100 == 0) {
3644 ptr--;
3645 *ptr++ = marker;
3646 if (++marker > 'z')
3647 marker = 'a';
3648 }
3649 }
3650 uploadBytes[kMsgSize] = '\0';
3651
[email protected]762d2db2010-01-11 19:03:013652 for (int i = 0; i < kIterations; ++i) {
3653 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363654 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163655 test_server_.GetURL("/echo"), DEFAULT_PRIORITY, &d,
3656 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193657 r->set_method(method.c_str());
[email protected]762d2db2010-01-11 19:03:013658
mmenkecbc2b712014-10-09 20:29:073659 r->set_upload(CreateSimpleUploadData(uploadBytes));
[email protected]762d2db2010-01-11 19:03:013660
[email protected]f7022f32014-08-21 16:32:193661 r->Start();
3662 EXPECT_TRUE(r->is_pending());
[email protected]762d2db2010-01-11 19:03:013663
[email protected]255620da2013-08-19 13:14:293664 base::RunLoop().Run();
[email protected]762d2db2010-01-11 19:03:013665
maksim.sisovb53724b52016-09-16 05:30:503666 ASSERT_EQ(1, d.response_started_count()) << "request failed. Error: "
3667 << d.request_status();
[email protected]762d2db2010-01-11 19:03:013668
3669 EXPECT_FALSE(d.received_data_before_response());
3670 EXPECT_EQ(uploadBytes, d.data_received());
[email protected]762d2db2010-01-11 19:03:013671 }
3672 delete[] uploadBytes;
3673 }
3674
[email protected]ede03212012-09-07 12:52:263675 bool DoManyCookiesRequest(int num_cookies) {
[email protected]263163f2012-06-14 22:40:343676 TestDelegate d;
danakj8522a25b2016-04-16 00:17:363677 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:553678 test_server_.GetURL("/set-many-cookies?" +
davidben151423e2015-03-23 18:48:363679 base::IntToString(num_cookies)),
rhalavatib7bd7c792017-04-27 05:25:163680 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]263163f2012-06-14 22:40:343681
[email protected]f7022f32014-08-21 16:32:193682 r->Start();
3683 EXPECT_TRUE(r->is_pending());
[email protected]263163f2012-06-14 22:40:343684
[email protected]255620da2013-08-19 13:14:293685 base::RunLoop().Run();
[email protected]263163f2012-06-14 22:40:343686
maksim.sisovb53724b52016-09-16 05:30:503687 if (d.request_status() != OK) {
3688 EXPECT_EQ(ERR_RESPONSE_HEADERS_TOO_BIG, d.request_status());
3689 return false;
3690 }
[email protected]263163f2012-06-14 22:40:343691
maksim.sisovb53724b52016-09-16 05:30:503692 return true;
[email protected]263163f2012-06-14 22:40:343693 }
3694
David Benjamin42116f62017-11-20 21:45:393695 HttpTestServer* http_test_server() { return &test_server_; }
bengr1bf8e942014-11-07 01:36:503696
tommycli59a63432015-11-06 00:10:553697 private:
David Benjamin42116f62017-11-20 21:45:393698 HttpTestServer test_server_;
[email protected]b89290212009-08-14 22:37:353699};
3700
tommycli59a63432015-11-06 00:10:553701namespace {
3702
danakj8522a25b2016-04-16 00:17:363703std::unique_ptr<test_server::HttpResponse> HandleRedirectConnect(
tommycli59a63432015-11-06 00:10:553704 const test_server::HttpRequest& request) {
3705 if (request.headers.find("Host") == request.headers.end() ||
3706 request.headers.at("Host") != "www.redirect.com" ||
3707 request.method != test_server::METHOD_CONNECT) {
3708 return nullptr;
3709 }
3710
danakj8522a25b2016-04-16 00:17:363711 std::unique_ptr<test_server::BasicHttpResponse> http_response(
tommycli59a63432015-11-06 00:10:553712 new test_server::BasicHttpResponse);
3713 http_response->set_code(HTTP_FOUND);
3714 http_response->AddCustomHeader("Location",
3715 "http://www.destination.com/foo.js");
dchengc7eeda422015-12-26 03:56:483716 return std::move(http_response);
tommycli59a63432015-11-06 00:10:553717}
3718
3719} // namespace
3720
nharperb7441ef2016-01-25 23:54:143721class TestSSLConfigService : public SSLConfigService {
3722 public:
3723 TestSSLConfigService(bool ev_enabled,
3724 bool online_rev_checking,
3725 bool rev_checking_required_local_anchors,
3726 bool token_binding_enabled)
3727 : ev_enabled_(ev_enabled),
3728 online_rev_checking_(online_rev_checking),
3729 rev_checking_required_local_anchors_(
3730 rev_checking_required_local_anchors),
3731 token_binding_enabled_(token_binding_enabled),
davidben095ebb52017-04-12 22:23:343732 min_version_(kDefaultSSLVersionMin),
3733 max_version_(kDefaultSSLVersionMax) {}
nharperb7441ef2016-01-25 23:54:143734
davidben095ebb52017-04-12 22:23:343735 void set_max_version(uint16_t version) { max_version_ = version; }
nharperb7441ef2016-01-25 23:54:143736 void set_min_version(uint16_t version) { min_version_ = version; }
3737
nharperb7441ef2016-01-25 23:54:143738 // SSLConfigService:
3739 void GetSSLConfig(SSLConfig* config) override {
3740 *config = SSLConfig();
3741 config->rev_checking_enabled = online_rev_checking_;
3742 config->verify_ev_cert = ev_enabled_;
3743 config->rev_checking_required_local_anchors =
3744 rev_checking_required_local_anchors_;
davidben095ebb52017-04-12 22:23:343745 config->version_min = min_version_;
3746 config->version_max = max_version_;
nharperb7441ef2016-01-25 23:54:143747 if (token_binding_enabled_) {
3748 config->token_binding_params.push_back(TB_PARAM_ECDSAP256);
3749 }
3750 }
3751
3752 protected:
Chris Watkins7a41d3552017-12-01 02:13:273753 ~TestSSLConfigService() override = default;
nharperb7441ef2016-01-25 23:54:143754
3755 private:
3756 const bool ev_enabled_;
3757 const bool online_rev_checking_;
3758 const bool rev_checking_required_local_anchors_;
3759 const bool token_binding_enabled_;
3760 uint16_t min_version_;
davidben095ebb52017-04-12 22:23:343761 uint16_t max_version_;
nharperb7441ef2016-01-25 23:54:143762};
3763
3764// TODO(svaldez): Update tests to use EmbeddedTestServer.
3765#if !defined(OS_IOS)
3766class TokenBindingURLRequestTest : public URLRequestTestHTTP {
3767 public:
fdoray9f0b4782017-02-10 12:55:473768 TokenBindingURLRequestTest() = default;
fdoraya89e673c2017-01-31 21:44:213769
nharperb7441ef2016-01-25 23:54:143770 void SetUp() override {
3771 default_context_.set_ssl_config_service(
3772 new TestSSLConfigService(false, false, false, true));
fdoraya89e673c2017-01-31 21:44:213773 channel_id_service_.reset(
3774 new ChannelIDService(new DefaultChannelIDStore(NULL)));
nharperb7441ef2016-01-25 23:54:143775 default_context_.set_channel_id_service(channel_id_service_.get());
3776 URLRequestTestHTTP::SetUp();
3777 }
3778
3779 protected:
danakj8522a25b2016-04-16 00:17:363780 std::unique_ptr<ChannelIDService> channel_id_service_;
nharperb7441ef2016-01-25 23:54:143781};
3782
3783TEST_F(TokenBindingURLRequestTest, TokenBindingTest) {
3784 SpawnedTestServer::SSLOptions ssl_options;
3785 ssl_options.supported_token_binding_params.push_back(TB_PARAM_ECDSAP256);
3786 SpawnedTestServer https_test_server(SpawnedTestServer::TYPE_HTTPS,
3787 ssl_options,
3788 base::FilePath(kTestFilePath));
3789 ASSERT_TRUE(https_test_server.Start());
3790
3791 TestDelegate d;
3792 {
danakj8522a25b2016-04-16 00:17:363793 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163794 https_test_server.GetURL("tokbind-ekm"), DEFAULT_PRIORITY, &d,
3795 TRAFFIC_ANNOTATION_FOR_TESTS));
nharperb7441ef2016-01-25 23:54:143796 r->Start();
3797 EXPECT_TRUE(r->is_pending());
3798
3799 base::RunLoop().Run();
3800
maksim.sisovb53724b52016-09-16 05:30:503801 EXPECT_EQ(OK, d.request_status());
nharperb7441ef2016-01-25 23:54:143802
3803 HttpRequestHeaders headers;
3804 std::string token_binding_header, token_binding_message;
3805 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
3806 EXPECT_TRUE(headers.GetHeader(HttpRequestHeaders::kTokenBinding,
3807 &token_binding_header));
3808 EXPECT_TRUE(base::Base64UrlDecode(
nharper78e6d2b2016-09-21 05:42:353809 token_binding_header, base::Base64UrlDecodePolicy::DISALLOW_PADDING,
nharperb7441ef2016-01-25 23:54:143810 &token_binding_message));
nharperd6e65822016-03-30 23:05:483811 std::vector<TokenBinding> token_bindings;
3812 ASSERT_TRUE(
3813 ParseTokenBindingMessage(token_binding_message, &token_bindings));
3814 ASSERT_EQ(1ull, token_bindings.size());
nharperb7441ef2016-01-25 23:54:143815
3816 EXPECT_GT(d.bytes_received(), 0);
3817 std::string ekm = d.data_received();
3818
nharperd6e65822016-03-30 23:05:483819 EXPECT_EQ(TokenBindingType::PROVIDED, token_bindings[0].type);
nharper78e6d2b2016-09-21 05:42:353820 EXPECT_TRUE(VerifyTokenBindingSignature(token_bindings[0].ec_point,
3821 token_bindings[0].signature,
3822 TokenBindingType::PROVIDED, ekm));
nharperb7441ef2016-01-25 23:54:143823 }
3824}
nharperd6e65822016-03-30 23:05:483825
3826TEST_F(TokenBindingURLRequestTest, ForwardTokenBinding) {
3827 SpawnedTestServer::SSLOptions ssl_options;
3828 ssl_options.supported_token_binding_params.push_back(TB_PARAM_ECDSAP256);
3829 SpawnedTestServer https_test_server(SpawnedTestServer::TYPE_HTTPS,
3830 ssl_options,
3831 base::FilePath(kTestFilePath));
3832 ASSERT_TRUE(https_test_server.Start());
3833
3834 TestDelegate d;
3835 {
3836 GURL redirect_url =
3837 https_test_server.GetURL("forward-tokbind?/tokbind-ekm");
rhalavatib7bd7c792017-04-27 05:25:163838 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
3839 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
nharperd6e65822016-03-30 23:05:483840 r->Start();
3841 EXPECT_TRUE(r->is_pending());
3842
3843 base::RunLoop().Run();
3844
maksim.sisovb53724b52016-09-16 05:30:503845 EXPECT_EQ(OK, d.request_status());
nharperd6e65822016-03-30 23:05:483846
3847 HttpRequestHeaders headers;
3848 std::string token_binding_header, token_binding_message;
3849 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
3850 EXPECT_TRUE(headers.GetHeader(HttpRequestHeaders::kTokenBinding,
3851 &token_binding_header));
3852 EXPECT_TRUE(base::Base64UrlDecode(
nharper78e6d2b2016-09-21 05:42:353853 token_binding_header, base::Base64UrlDecodePolicy::DISALLOW_PADDING,
nharperd6e65822016-03-30 23:05:483854 &token_binding_message));
3855 std::vector<TokenBinding> token_bindings;
3856 ASSERT_TRUE(
3857 ParseTokenBindingMessage(token_binding_message, &token_bindings));
3858 ASSERT_EQ(2ull, token_bindings.size());
3859
3860 EXPECT_GT(d.bytes_received(), 0);
3861 std::string ekm = d.data_received();
3862
3863 EXPECT_EQ(TokenBindingType::PROVIDED, token_bindings[0].type);
nharper78e6d2b2016-09-21 05:42:353864 EXPECT_TRUE(VerifyTokenBindingSignature(token_bindings[0].ec_point,
3865 token_bindings[0].signature,
3866 TokenBindingType::PROVIDED, ekm));
nharperd6e65822016-03-30 23:05:483867 EXPECT_EQ(TokenBindingType::REFERRED, token_bindings[1].type);
nharper78e6d2b2016-09-21 05:42:353868 EXPECT_TRUE(VerifyTokenBindingSignature(token_bindings[1].ec_point,
3869 token_bindings[1].signature,
3870 TokenBindingType::REFERRED, ekm));
nharperd6e65822016-03-30 23:05:483871 }
3872}
3873
3874// TODO(nharper): Remove this #ifdef and replace SpawnedTestServer with
3875// EmbeddedTestServer once crbug.com/599187 is resolved.
3876#if !defined(OS_ANDROID)
3877TEST_F(TokenBindingURLRequestTest, DontForwardHeaderFromHttp) {
Sergey Ulanov9e8d6f32017-08-14 22:12:583878 SpawnedTestServer http_server(SpawnedTestServer::TYPE_HTTP, base::FilePath());
nharperd6e65822016-03-30 23:05:483879 ASSERT_TRUE(http_server.Start());
3880 SpawnedTestServer::SSLOptions ssl_options;
3881 ssl_options.supported_token_binding_params.push_back(TB_PARAM_ECDSAP256);
3882 SpawnedTestServer https_test_server(SpawnedTestServer::TYPE_HTTPS,
3883 ssl_options,
3884 base::FilePath(kTestFilePath));
3885 ASSERT_TRUE(https_test_server.Start());
3886
3887 TestDelegate d;
3888 {
3889 GURL redirect_url = http_server.GetURL(
3890 "forward-tokbind?" + https_test_server.GetURL("tokbind-ekm").spec());
rhalavatib7bd7c792017-04-27 05:25:163891 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
3892 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
nharperd6e65822016-03-30 23:05:483893 r->Start();
3894 EXPECT_TRUE(r->is_pending());
3895
3896 base::RunLoop().Run();
3897
maksim.sisovb53724b52016-09-16 05:30:503898 EXPECT_EQ(OK, d.request_status());
nharperd6e65822016-03-30 23:05:483899
3900 HttpRequestHeaders headers;
3901 std::string token_binding_header, token_binding_message;
3902 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
3903 EXPECT_TRUE(headers.GetHeader(HttpRequestHeaders::kTokenBinding,
3904 &token_binding_header));
3905 EXPECT_TRUE(base::Base64UrlDecode(
nharper78e6d2b2016-09-21 05:42:353906 token_binding_header, base::Base64UrlDecodePolicy::DISALLOW_PADDING,
nharperd6e65822016-03-30 23:05:483907 &token_binding_message));
3908 std::vector<TokenBinding> token_bindings;
3909 ASSERT_TRUE(
3910 ParseTokenBindingMessage(token_binding_message, &token_bindings));
3911 ASSERT_EQ(1ull, token_bindings.size());
3912
3913 EXPECT_GT(d.bytes_received(), 0);
3914 std::string ekm = d.data_received();
3915
3916 EXPECT_EQ(TokenBindingType::PROVIDED, token_bindings[0].type);
nharper78e6d2b2016-09-21 05:42:353917 EXPECT_TRUE(VerifyTokenBindingSignature(token_bindings[0].ec_point,
3918 token_bindings[0].signature,
3919 TokenBindingType::PROVIDED, ekm));
nharperd6e65822016-03-30 23:05:483920 }
3921}
3922
3923// Test that if a server supporting Token Binding redirects (with
nharper86f0be22016-07-14 00:49:363924// Include-Referred-Token-Binding-ID) to an https url on a server that does not
nharperd6e65822016-03-30 23:05:483925// support Token Binding, then we do not send a Sec-Token-Binding when following
3926// the redirect.
3927TEST_F(TokenBindingURLRequestTest, ForwardWithoutTokenBinding) {
3928 SpawnedTestServer::SSLOptions ssl_options;
3929 SpawnedTestServer https_test_server(SpawnedTestServer::TYPE_HTTPS,
3930 ssl_options,
3931 base::FilePath(kTestFilePath));
3932 ASSERT_TRUE(https_test_server.Start());
3933 ssl_options.supported_token_binding_params.push_back(TB_PARAM_ECDSAP256);
3934 SpawnedTestServer token_binding_test_server(SpawnedTestServer::TYPE_HTTPS,
3935 ssl_options,
3936 base::FilePath(kTestFilePath));
3937 ASSERT_TRUE(token_binding_test_server.Start());
3938
3939 TestDelegate d;
3940 {
3941 GURL redirect_url = token_binding_test_server.GetURL(
3942 "forward-tokbind?" + https_test_server.GetURL("tokbind-ekm").spec());
rhalavatib7bd7c792017-04-27 05:25:163943 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
3944 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
nharperd6e65822016-03-30 23:05:483945 r->Start();
3946 EXPECT_TRUE(r->is_pending());
3947
3948 base::RunLoop().Run();
3949
maksim.sisovb53724b52016-09-16 05:30:503950 EXPECT_EQ(OK, d.request_status());
nharperd6e65822016-03-30 23:05:483951
3952 HttpRequestHeaders headers;
3953 std::string token_binding_header, token_binding_message;
3954 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
3955 EXPECT_FALSE(headers.GetHeader(HttpRequestHeaders::kTokenBinding,
3956 &token_binding_header));
3957 }
3958}
3959#endif // !defined(OS_ANDROID)
nharperb7441ef2016-01-25 23:54:143960#endif // !defined(OS_IOS)
3961
3962// In this unit test, we're using the HTTPTestServer as a proxy server and
[email protected]95409e12010-08-17 20:07:113963// issuing a CONNECT request with the magic host name "www.redirect.com".
tommycli59a63432015-11-06 00:10:553964// The EmbeddedTestServer will return a 302 response, which we should not
[email protected]95409e12010-08-17 20:07:113965// follow.
[email protected]f2f31b32013-01-16 23:24:093966TEST_F(URLRequestTestHTTP, ProxyTunnelRedirectTest) {
tommycli59a63432015-11-06 00:10:553967 http_test_server()->RegisterRequestHandler(
Matt Menke2b2a60472018-02-07 02:12:123968 base::BindRepeating(&HandleRedirectConnect));
tommycli59a63432015-11-06 00:10:553969 ASSERT_TRUE(http_test_server()->Start());
[email protected]95409e12010-08-17 20:07:113970
[email protected]ceefd7fd2012-11-29 00:36:243971 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]d5a4dd62012-05-23 01:41:043972 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:553973 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]87a09a92011-07-14 15:50:503974
[email protected]d1ec59082009-02-11 02:48:153975 TestDelegate d;
3976 {
danakj8522a25b2016-04-16 00:17:363977 std::unique_ptr<URLRequest> r(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:163978 GURL("https://www.redirect.com/"), DEFAULT_PRIORITY, &d,
3979 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:193980 r->Start();
3981 EXPECT_TRUE(r->is_pending());
[email protected]d1ec59082009-02-11 02:48:153982
[email protected]255620da2013-08-19 13:14:293983 base::RunLoop().Run();
[email protected]d1ec59082009-02-11 02:48:153984
[email protected]d8fc4722014-06-13 13:17:153985 // The proxy server is not set before failure.
tbansal2ecbbc72016-10-06 17:15:473986 EXPECT_FALSE(r->proxy_server().is_valid());
maksim.sisovb53724b52016-09-16 05:30:503987 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status());
[email protected]dc651782009-02-14 01:45:083988 EXPECT_EQ(1, d.response_started_count());
[email protected]d1ec59082009-02-11 02:48:153989 // We should not have followed the redirect.
3990 EXPECT_EQ(0, d.received_redirect_count());
3991 }
3992}
3993
[email protected]8202d0c2011-02-23 08:31:143994// This is the same as the previous test, but checks that the network delegate
3995// registers the error.
[email protected]c044616e2013-02-20 02:01:263996TEST_F(URLRequestTestHTTP, NetworkDelegateTunnelConnectionFailed) {
tommycli59a63432015-11-06 00:10:553997 ASSERT_TRUE(http_test_server()->Start());
[email protected]8202d0c2011-02-23 08:31:143998
[email protected]ceefd7fd2012-11-29 00:36:243999 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]d5a4dd62012-05-23 01:41:044000 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554001 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]87a09a92011-07-14 15:50:504002
[email protected]8202d0c2011-02-23 08:31:144003 TestDelegate d;
4004 {
danakj8522a25b2016-04-16 00:17:364005 std::unique_ptr<URLRequest> r(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164006 GURL("https://www.redirect.com/"), DEFAULT_PRIORITY, &d,
4007 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194008 r->Start();
4009 EXPECT_TRUE(r->is_pending());
[email protected]8202d0c2011-02-23 08:31:144010
[email protected]255620da2013-08-19 13:14:294011 base::RunLoop().Run();
[email protected]8202d0c2011-02-23 08:31:144012
[email protected]d8fc4722014-06-13 13:17:154013 // The proxy server is not set before failure.
tbansal2ecbbc72016-10-06 17:15:474014 EXPECT_FALSE(r->proxy_server().is_valid());
[email protected]8202d0c2011-02-23 08:31:144015 EXPECT_EQ(1, d.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:504016 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status());
[email protected]8202d0c2011-02-23 08:31:144017 // We should not have followed the redirect.
4018 EXPECT_EQ(0, d.received_redirect_count());
4019
4020 EXPECT_EQ(1, network_delegate.error_count());
robpercival214763f2016-07-01 23:27:014021 EXPECT_THAT(network_delegate.last_error(),
4022 IsError(ERR_TUNNEL_CONNECTION_FAILED));
[email protected]8202d0c2011-02-23 08:31:144023 }
4024}
4025
[email protected]dc5a5cf2012-09-26 02:49:304026// Tests that we can block and asynchronously return OK in various stages.
4027TEST_F(URLRequestTestHTTP, NetworkDelegateBlockAsynchronously) {
4028 static const BlockingNetworkDelegate::Stage blocking_stages[] = {
4029 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
4030 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
4031 BlockingNetworkDelegate::ON_HEADERS_RECEIVED
4032 };
4033 static const size_t blocking_stages_length = arraysize(blocking_stages);
4034
tommycli59a63432015-11-06 00:10:554035 ASSERT_TRUE(http_test_server()->Start());
[email protected]dc5a5cf2012-09-26 02:49:304036
4037 TestDelegate d;
4038 BlockingNetworkDelegate network_delegate(
4039 BlockingNetworkDelegate::USER_CALLBACK);
4040 network_delegate.set_block_on(
4041 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST |
4042 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS |
4043 BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
4044
4045 TestURLRequestContext context(true);
4046 context.set_network_delegate(&network_delegate);
4047 context.Init();
4048
4049 {
danakj8522a25b2016-04-16 00:17:364050 std::unique_ptr<URLRequest> r(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164051 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
4052 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]dc5a5cf2012-09-26 02:49:304053
[email protected]f7022f32014-08-21 16:32:194054 r->Start();
[email protected]dc5a5cf2012-09-26 02:49:304055 for (size_t i = 0; i < blocking_stages_length; ++i) {
[email protected]255620da2013-08-19 13:14:294056 base::RunLoop().Run();
[email protected]dc5a5cf2012-09-26 02:49:304057 EXPECT_EQ(blocking_stages[i],
4058 network_delegate.stage_blocked_for_callback());
4059 network_delegate.DoCallback(OK);
4060 }
[email protected]255620da2013-08-19 13:14:294061 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:194062 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:504063 EXPECT_EQ(OK, d.request_status());
[email protected]dc5a5cf2012-09-26 02:49:304064 EXPECT_EQ(1, network_delegate.created_requests());
4065 EXPECT_EQ(0, network_delegate.destroyed_requests());
4066 }
4067 EXPECT_EQ(1, network_delegate.destroyed_requests());
4068}
4069
[email protected]4c76d7c2011-04-15 19:14:124070// Tests that the network delegate can block and cancel a request.
4071TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequest) {
tommycli59a63432015-11-06 00:10:554072 ASSERT_TRUE(http_test_server()->Start());
[email protected]4c76d7c2011-04-15 19:14:124073
4074 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304075 BlockingNetworkDelegate network_delegate(
4076 BlockingNetworkDelegate::AUTO_CALLBACK);
4077 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
4078 network_delegate.set_retval(ERR_EMPTY_RESPONSE);
[email protected]4c76d7c2011-04-15 19:14:124079
[email protected]d5a4dd62012-05-23 01:41:044080 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554081 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]87a09a92011-07-14 15:50:504082
[email protected]4c76d7c2011-04-15 19:14:124083 {
rhalavatib7bd7c792017-04-27 05:25:164084 std::unique_ptr<URLRequest> r(
4085 context.CreateRequest(http_test_server()->GetURL("/"), DEFAULT_PRIORITY,
4086 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]4c76d7c2011-04-15 19:14:124087
[email protected]f7022f32014-08-21 16:32:194088 r->Start();
[email protected]255620da2013-08-19 13:14:294089 base::RunLoop().Run();
[email protected]4c76d7c2011-04-15 19:14:124090
[email protected]d8fc4722014-06-13 13:17:154091 // The proxy server is not set before cancellation.
tbansal2ecbbc72016-10-06 17:15:474092 EXPECT_FALSE(r->proxy_server().is_valid());
maksim.sisovb53724b52016-09-16 05:30:504093 EXPECT_EQ(ERR_EMPTY_RESPONSE, d.request_status());
[email protected]4c76d7c2011-04-15 19:14:124094 EXPECT_EQ(1, network_delegate.created_requests());
4095 EXPECT_EQ(0, network_delegate.destroyed_requests());
4096 }
4097 EXPECT_EQ(1, network_delegate.destroyed_requests());
4098}
4099
[email protected]b4438d32012-09-27 06:15:304100// Helper function for NetworkDelegateCancelRequestAsynchronously and
4101// NetworkDelegateCancelRequestSynchronously. Sets up a blocking network
4102// delegate operating in |block_mode| and a request for |url|. It blocks the
4103// request in |stage| and cancels it with ERR_BLOCKED_BY_CLIENT.
4104void NetworkDelegateCancelRequest(BlockingNetworkDelegate::BlockMode block_mode,
4105 BlockingNetworkDelegate::Stage stage,
4106 const GURL& url) {
[email protected]3cd384c602011-08-31 16:12:364107 TestDelegate d;
[email protected]b4438d32012-09-27 06:15:304108 BlockingNetworkDelegate network_delegate(block_mode);
4109 network_delegate.set_retval(ERR_BLOCKED_BY_CLIENT);
4110 network_delegate.set_block_on(stage);
[email protected]3cd384c602011-08-31 16:12:364111
[email protected]b4438d32012-09-27 06:15:304112 TestURLRequestContext context(true);
4113 context.set_network_delegate(&network_delegate);
4114 context.Init();
[email protected]3cd384c602011-08-31 16:12:364115
4116 {
rhalavatib7bd7c792017-04-27 05:25:164117 std::unique_ptr<URLRequest> r(context.CreateRequest(
4118 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]3cd384c602011-08-31 16:12:364119
[email protected]f7022f32014-08-21 16:32:194120 r->Start();
[email protected]255620da2013-08-19 13:14:294121 base::RunLoop().Run();
[email protected]3cd384c602011-08-31 16:12:364122
[email protected]d8fc4722014-06-13 13:17:154123 // The proxy server is not set before cancellation.
tbansal2ecbbc72016-10-06 17:15:474124 if (stage == BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST ||
4125 stage == BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS) {
4126 EXPECT_FALSE(r->proxy_server().is_valid());
4127 } else if (stage == BlockingNetworkDelegate::ON_HEADERS_RECEIVED) {
4128 EXPECT_TRUE(r->proxy_server().is_direct());
4129 } else {
4130 NOTREACHED();
4131 }
maksim.sisovb53724b52016-09-16 05:30:504132 EXPECT_EQ(ERR_BLOCKED_BY_CLIENT, d.request_status());
[email protected]3cd384c602011-08-31 16:12:364133 EXPECT_EQ(1, network_delegate.created_requests());
4134 EXPECT_EQ(0, network_delegate.destroyed_requests());
4135 }
4136 EXPECT_EQ(1, network_delegate.destroyed_requests());
4137}
4138
[email protected]b4438d32012-09-27 06:15:304139// The following 3 tests check that the network delegate can cancel a request
4140// synchronously in various stages of the request.
4141TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously1) {
tommycli59a63432015-11-06 00:10:554142 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304143 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
4144 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
tommycli59a63432015-11-06 00:10:554145 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304146}
4147
4148TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously2) {
tommycli59a63432015-11-06 00:10:554149 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304150 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
4151 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
tommycli59a63432015-11-06 00:10:554152 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304153}
4154
4155TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestSynchronously3) {
tommycli59a63432015-11-06 00:10:554156 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304157 NetworkDelegateCancelRequest(BlockingNetworkDelegate::SYNCHRONOUS,
4158 BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
tommycli59a63432015-11-06 00:10:554159 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304160}
4161
4162// The following 3 tests check that the network delegate can cancel a request
4163// asynchronously in various stages of the request.
4164TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously1) {
tommycli59a63432015-11-06 00:10:554165 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304166 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
4167 BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
tommycli59a63432015-11-06 00:10:554168 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304169}
4170
4171TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously2) {
tommycli59a63432015-11-06 00:10:554172 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304173 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
4174 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
tommycli59a63432015-11-06 00:10:554175 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304176}
4177
4178TEST_F(URLRequestTestHTTP, NetworkDelegateCancelRequestAsynchronously3) {
tommycli59a63432015-11-06 00:10:554179 ASSERT_TRUE(http_test_server()->Start());
[email protected]b4438d32012-09-27 06:15:304180 NetworkDelegateCancelRequest(BlockingNetworkDelegate::AUTO_CALLBACK,
4181 BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
tommycli59a63432015-11-06 00:10:554182 http_test_server()->GetURL("/"));
[email protected]b4438d32012-09-27 06:15:304183}
4184
[email protected]4c76d7c2011-04-15 19:14:124185// Tests that the network delegate can block and redirect a request to a new
4186// URL.
4187TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequest) {
tommycli59a63432015-11-06 00:10:554188 ASSERT_TRUE(http_test_server()->Start());
[email protected]4c76d7c2011-04-15 19:14:124189
4190 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304191 BlockingNetworkDelegate network_delegate(
4192 BlockingNetworkDelegate::AUTO_CALLBACK);
4193 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
tommycli59a63432015-11-06 00:10:554194 GURL redirect_url(http_test_server()->GetURL("/simple.html"));
[email protected]4c76d7c2011-04-15 19:14:124195 network_delegate.set_redirect_url(redirect_url);
4196
[email protected]d5a4dd62012-05-23 01:41:044197 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554198 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]87a09a92011-07-14 15:50:504199
[email protected]4c76d7c2011-04-15 19:14:124200 {
tommycli59a63432015-11-06 00:10:554201 GURL original_url(http_test_server()->GetURL("/defaultresponse"));
rhalavatib7bd7c792017-04-27 05:25:164202 std::unique_ptr<URLRequest> r(context.CreateRequest(
4203 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]4c76d7c2011-04-15 19:14:124204
[email protected]6be6fa92014-08-06 23:44:564205 // Quit after hitting the redirect, so can check the headers.
4206 d.set_quit_on_redirect(true);
[email protected]f7022f32014-08-21 16:32:194207 r->Start();
[email protected]255620da2013-08-19 13:14:294208 base::RunLoop().Run();
[email protected]4c76d7c2011-04-15 19:14:124209
[email protected]6be6fa92014-08-06 23:44:564210 // Check headers from URLRequestJob.
[email protected]f7022f32014-08-21 16:32:194211 EXPECT_EQ(307, r->GetResponseCode());
4212 EXPECT_EQ(307, r->response_headers()->response_code());
[email protected]6be6fa92014-08-06 23:44:564213 std::string location;
[email protected]f7022f32014-08-21 16:32:194214 ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location",
4215 &location));
[email protected]6be6fa92014-08-06 23:44:564216 EXPECT_EQ(redirect_url, GURL(location));
4217
4218 // Let the request finish.
[email protected]f7022f32014-08-21 16:32:194219 r->FollowDeferredRedirect();
[email protected]6be6fa92014-08-06 23:44:564220 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:504221 EXPECT_EQ(OK, d.request_status());
tbansal2ecbbc72016-10-06 17:15:474222 EXPECT_EQ(ProxyServer(ProxyServer::SCHEME_HTTP,
4223 http_test_server()->host_port_pair()),
4224 r->proxy_server());
ryansturm49a8cb12016-06-15 16:51:094225 // before_send_headers_with_proxy_count only increments for headers sent
4226 // through an untunneled proxy.
4227 EXPECT_EQ(1, network_delegate.before_send_headers_with_proxy_count());
tommycli59a63432015-11-06 00:10:554228 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals(
4229 http_test_server()->host_port_pair()));
[email protected]597a1ab2014-06-26 08:12:274230
maksim.sisovb53724b52016-09-16 05:30:504231 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194232 EXPECT_EQ(redirect_url, r->url());
4233 EXPECT_EQ(original_url, r->original_url());
4234 EXPECT_EQ(2U, r->url_chain().size());
[email protected]4c76d7c2011-04-15 19:14:124235 EXPECT_EQ(1, network_delegate.created_requests());
4236 EXPECT_EQ(0, network_delegate.destroyed_requests());
4237 }
4238 EXPECT_EQ(1, network_delegate.destroyed_requests());
4239}
4240
[email protected]b813ed72012-04-05 08:21:364241// Tests that the network delegate can block and redirect a request to a new
4242// URL by setting a redirect_url and returning in OnBeforeURLRequest directly.
4243TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestSynchronously) {
tommycli59a63432015-11-06 00:10:554244 ASSERT_TRUE(http_test_server()->Start());
[email protected]b813ed72012-04-05 08:21:364245
4246 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304247 BlockingNetworkDelegate network_delegate(
4248 BlockingNetworkDelegate::SYNCHRONOUS);
tommycli59a63432015-11-06 00:10:554249 GURL redirect_url(http_test_server()->GetURL("/simple.html"));
[email protected]b813ed72012-04-05 08:21:364250 network_delegate.set_redirect_url(redirect_url);
[email protected]b813ed72012-04-05 08:21:364251
[email protected]d5a4dd62012-05-23 01:41:044252 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554253 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]b813ed72012-04-05 08:21:364254
4255 {
tommycli59a63432015-11-06 00:10:554256 GURL original_url(http_test_server()->GetURL("/defaultresponse"));
rhalavatib7bd7c792017-04-27 05:25:164257 std::unique_ptr<URLRequest> r(context.CreateRequest(
4258 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]b813ed72012-04-05 08:21:364259
[email protected]6be6fa92014-08-06 23:44:564260 // Quit after hitting the redirect, so can check the headers.
4261 d.set_quit_on_redirect(true);
[email protected]f7022f32014-08-21 16:32:194262 r->Start();
[email protected]255620da2013-08-19 13:14:294263 base::RunLoop().Run();
[email protected]b813ed72012-04-05 08:21:364264
[email protected]6be6fa92014-08-06 23:44:564265 // Check headers from URLRequestJob.
[email protected]f7022f32014-08-21 16:32:194266 EXPECT_EQ(307, r->GetResponseCode());
4267 EXPECT_EQ(307, r->response_headers()->response_code());
[email protected]6be6fa92014-08-06 23:44:564268 std::string location;
[email protected]f7022f32014-08-21 16:32:194269 ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location",
4270 &location));
[email protected]6be6fa92014-08-06 23:44:564271 EXPECT_EQ(redirect_url, GURL(location));
4272
4273 // Let the request finish.
[email protected]f7022f32014-08-21 16:32:194274 r->FollowDeferredRedirect();
[email protected]6be6fa92014-08-06 23:44:564275 base::RunLoop().Run();
4276
maksim.sisovb53724b52016-09-16 05:30:504277 EXPECT_EQ(OK, d.request_status());
tbansal2ecbbc72016-10-06 17:15:474278 EXPECT_EQ(ProxyServer(ProxyServer::SCHEME_HTTP,
4279 http_test_server()->host_port_pair()),
4280 r->proxy_server());
ryansturm49a8cb12016-06-15 16:51:094281 // before_send_headers_with_proxy_count only increments for headers sent
4282 // through an untunneled proxy.
4283 EXPECT_EQ(1, network_delegate.before_send_headers_with_proxy_count());
tommycli59a63432015-11-06 00:10:554284 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals(
4285 http_test_server()->host_port_pair()));
maksim.sisovb53724b52016-09-16 05:30:504286 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194287 EXPECT_EQ(redirect_url, r->url());
4288 EXPECT_EQ(original_url, r->original_url());
4289 EXPECT_EQ(2U, r->url_chain().size());
[email protected]b813ed72012-04-05 08:21:364290 EXPECT_EQ(1, network_delegate.created_requests());
4291 EXPECT_EQ(0, network_delegate.destroyed_requests());
4292 }
4293 EXPECT_EQ(1, network_delegate.destroyed_requests());
4294}
4295
[email protected]3c5ca8c2011-09-29 01:14:514296// Tests that redirects caused by the network delegate preserve POST data.
4297TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestPost) {
tommycli59a63432015-11-06 00:10:554298 ASSERT_TRUE(http_test_server()->Start());
[email protected]3c5ca8c2011-09-29 01:14:514299
4300 const char kData[] = "hello world";
4301
4302 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304303 BlockingNetworkDelegate network_delegate(
4304 BlockingNetworkDelegate::AUTO_CALLBACK);
4305 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
tommycli59a63432015-11-06 00:10:554306 GURL redirect_url(http_test_server()->GetURL("/echo"));
[email protected]3c5ca8c2011-09-29 01:14:514307 network_delegate.set_redirect_url(redirect_url);
4308
[email protected]ef2bf422012-05-11 03:27:094309 TestURLRequestContext context(true);
4310 context.set_network_delegate(&network_delegate);
4311 context.Init();
[email protected]3c5ca8c2011-09-29 01:14:514312
4313 {
tommycli59a63432015-11-06 00:10:554314 GURL original_url(http_test_server()->GetURL("/defaultresponse"));
rhalavatib7bd7c792017-04-27 05:25:164315 std::unique_ptr<URLRequest> r(context.CreateRequest(
4316 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194317 r->set_method("POST");
mmenkecbc2b712014-10-09 20:29:074318 r->set_upload(CreateSimpleUploadData(kData));
[email protected]3c5ca8c2011-09-29 01:14:514319 HttpRequestHeaders headers;
4320 headers.SetHeader(HttpRequestHeaders::kContentLength,
Brett Wilson5accd242017-11-30 22:07:324321 base::NumberToString(arraysize(kData) - 1));
[email protected]f7022f32014-08-21 16:32:194322 r->SetExtraRequestHeaders(headers);
[email protected]6be6fa92014-08-06 23:44:564323
4324 // Quit after hitting the redirect, so can check the headers.
4325 d.set_quit_on_redirect(true);
[email protected]f7022f32014-08-21 16:32:194326 r->Start();
[email protected]255620da2013-08-19 13:14:294327 base::RunLoop().Run();
[email protected]3c5ca8c2011-09-29 01:14:514328
[email protected]6be6fa92014-08-06 23:44:564329 // Check headers from URLRequestJob.
[email protected]f7022f32014-08-21 16:32:194330 EXPECT_EQ(307, r->GetResponseCode());
4331 EXPECT_EQ(307, r->response_headers()->response_code());
[email protected]6be6fa92014-08-06 23:44:564332 std::string location;
[email protected]f7022f32014-08-21 16:32:194333 ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location",
4334 &location));
[email protected]6be6fa92014-08-06 23:44:564335 EXPECT_EQ(redirect_url, GURL(location));
4336
4337 // Let the request finish.
[email protected]f7022f32014-08-21 16:32:194338 r->FollowDeferredRedirect();
[email protected]6be6fa92014-08-06 23:44:564339 base::RunLoop().Run();
4340
maksim.sisovb53724b52016-09-16 05:30:504341 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194342 EXPECT_EQ(redirect_url, r->url());
4343 EXPECT_EQ(original_url, r->original_url());
4344 EXPECT_EQ(2U, r->url_chain().size());
[email protected]3c5ca8c2011-09-29 01:14:514345 EXPECT_EQ(1, network_delegate.created_requests());
4346 EXPECT_EQ(0, network_delegate.destroyed_requests());
[email protected]f7022f32014-08-21 16:32:194347 EXPECT_EQ("POST", r->method());
[email protected]3c5ca8c2011-09-29 01:14:514348 EXPECT_EQ(kData, d.data_received());
4349 }
4350 EXPECT_EQ(1, network_delegate.destroyed_requests());
4351}
4352
[email protected]5f714132014-03-26 10:41:164353// Tests that the network delegate can block and redirect a request to a new
4354// URL during OnHeadersReceived.
4355TEST_F(URLRequestTestHTTP, NetworkDelegateRedirectRequestOnHeadersReceived) {
tommycli59a63432015-11-06 00:10:554356 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:164357
4358 TestDelegate d;
4359 BlockingNetworkDelegate network_delegate(
4360 BlockingNetworkDelegate::AUTO_CALLBACK);
4361 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
tommycli59a63432015-11-06 00:10:554362 GURL redirect_url(http_test_server()->GetURL("/simple.html"));
[email protected]5f714132014-03-26 10:41:164363 network_delegate.set_redirect_on_headers_received_url(redirect_url);
4364
4365 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554366 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]5f714132014-03-26 10:41:164367
4368 {
tommycli59a63432015-11-06 00:10:554369 GURL original_url(http_test_server()->GetURL("/defaultresponse"));
rhalavatib7bd7c792017-04-27 05:25:164370 std::unique_ptr<URLRequest> r(context.CreateRequest(
4371 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:164372
[email protected]f7022f32014-08-21 16:32:194373 r->Start();
[email protected]5f714132014-03-26 10:41:164374 base::RunLoop().Run();
4375
maksim.sisovb53724b52016-09-16 05:30:504376 EXPECT_EQ(OK, d.request_status());
tbansal2ecbbc72016-10-06 17:15:474377 EXPECT_EQ(ProxyServer(ProxyServer::SCHEME_HTTP,
4378 http_test_server()->host_port_pair()),
4379 r->proxy_server());
ryansturm49a8cb12016-06-15 16:51:094380 // before_send_headers_with_proxy_count only increments for headers sent
4381 // through an untunneled proxy.
4382 EXPECT_EQ(2, network_delegate.before_send_headers_with_proxy_count());
tommycli59a63432015-11-06 00:10:554383 EXPECT_TRUE(network_delegate.last_observed_proxy().Equals(
4384 http_test_server()->host_port_pair()));
[email protected]f7022f32014-08-21 16:32:194385
maksim.sisovb53724b52016-09-16 05:30:504386 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194387 EXPECT_EQ(redirect_url, r->url());
4388 EXPECT_EQ(original_url, r->original_url());
4389 EXPECT_EQ(2U, r->url_chain().size());
[email protected]5f714132014-03-26 10:41:164390 EXPECT_EQ(2, network_delegate.created_requests());
4391 EXPECT_EQ(0, network_delegate.destroyed_requests());
4392 }
4393 EXPECT_EQ(1, network_delegate.destroyed_requests());
4394}
4395
[email protected]c2911d72011-10-03 22:16:364396// Tests that the network delegate can synchronously complete OnAuthRequired
4397// by taking no action. This indicates that the NetworkDelegate does not want to
4398// handle the challenge, and is passing the buck along to the
4399// URLRequest::Delegate.
4400TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncNoAction) {
tommycli59a63432015-11-06 00:10:554401 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364402
4403 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304404 BlockingNetworkDelegate network_delegate(
4405 BlockingNetworkDelegate::SYNCHRONOUS);
[email protected]c2911d72011-10-03 22:16:364406
[email protected]ef2bf422012-05-11 03:27:094407 TestURLRequestContext context(true);
4408 context.set_network_delegate(&network_delegate);
4409 context.Init();
[email protected]c2911d72011-10-03 22:16:364410
[email protected]f3cf9802011-10-28 18:44:584411 d.set_credentials(AuthCredentials(kUser, kSecret));
[email protected]c2911d72011-10-03 22:16:364412
4413 {
tommycli59a63432015-11-06 00:10:554414 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164415 std::unique_ptr<URLRequest> r(context.CreateRequest(
4416 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194417 r->Start();
[email protected]79e1fd62013-06-20 06:50:044418
[email protected]255620da2013-08-19 13:14:294419 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:044420
maksim.sisovb53724b52016-09-16 05:30:504421 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194422 EXPECT_EQ(200, r->GetResponseCode());
[email protected]79e1fd62013-06-20 06:50:044423 EXPECT_TRUE(d.auth_required_called());
4424 EXPECT_EQ(1, network_delegate.created_requests());
4425 EXPECT_EQ(0, network_delegate.destroyed_requests());
4426 }
4427 EXPECT_EQ(1, network_delegate.destroyed_requests());
4428}
4429
4430TEST_F(URLRequestTestHTTP,
4431 NetworkDelegateOnAuthRequiredSyncNoAction_GetFullRequestHeaders) {
tommycli59a63432015-11-06 00:10:554432 ASSERT_TRUE(http_test_server()->Start());
[email protected]79e1fd62013-06-20 06:50:044433
4434 TestDelegate d;
4435 BlockingNetworkDelegate network_delegate(
4436 BlockingNetworkDelegate::SYNCHRONOUS);
4437
4438 TestURLRequestContext context(true);
4439 context.set_network_delegate(&network_delegate);
4440 context.Init();
4441
4442 d.set_credentials(AuthCredentials(kUser, kSecret));
4443
4444 {
tommycli59a63432015-11-06 00:10:554445 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164446 std::unique_ptr<URLRequest> r(context.CreateRequest(
4447 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194448 r->Start();
[email protected]79e1fd62013-06-20 06:50:044449
shivanisha8061c4202017-06-13 23:35:524450 base::RunLoop().Run();
4451
[email protected]79e1fd62013-06-20 06:50:044452 {
4453 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:194454 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
shivanisha8061c4202017-06-13 23:35:524455 EXPECT_TRUE(headers.HasHeader("Authorization"));
[email protected]79e1fd62013-06-20 06:50:044456 }
4457
maksim.sisovb53724b52016-09-16 05:30:504458 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194459 EXPECT_EQ(200, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364460 EXPECT_TRUE(d.auth_required_called());
4461 EXPECT_EQ(1, network_delegate.created_requests());
4462 EXPECT_EQ(0, network_delegate.destroyed_requests());
4463 }
4464 EXPECT_EQ(1, network_delegate.destroyed_requests());
4465}
4466
4467// Tests that the network delegate can synchronously complete OnAuthRequired
[email protected]1e110eae2013-05-10 22:02:404468// by setting credentials.
[email protected]c2911d72011-10-03 22:16:364469TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncSetAuth) {
tommycli59a63432015-11-06 00:10:554470 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364471
4472 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304473 BlockingNetworkDelegate network_delegate(
4474 BlockingNetworkDelegate::SYNCHRONOUS);
4475 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]c2911d72011-10-03 22:16:364476 network_delegate.set_auth_retval(
4477 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
4478
[email protected]f3cf9802011-10-28 18:44:584479 network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret));
[email protected]c2911d72011-10-03 22:16:364480
[email protected]ef2bf422012-05-11 03:27:094481 TestURLRequestContext context(true);
4482 context.set_network_delegate(&network_delegate);
4483 context.Init();
[email protected]c2911d72011-10-03 22:16:364484
4485 {
tommycli59a63432015-11-06 00:10:554486 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164487 std::unique_ptr<URLRequest> r(context.CreateRequest(
4488 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194489 r->Start();
[email protected]255620da2013-08-19 13:14:294490 base::RunLoop().Run();
[email protected]c2911d72011-10-03 22:16:364491
maksim.sisovb53724b52016-09-16 05:30:504492 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194493 EXPECT_EQ(200, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364494 EXPECT_FALSE(d.auth_required_called());
4495 EXPECT_EQ(1, network_delegate.created_requests());
4496 EXPECT_EQ(0, network_delegate.destroyed_requests());
4497 }
4498 EXPECT_EQ(1, network_delegate.destroyed_requests());
4499}
4500
[email protected]79e1fd62013-06-20 06:50:044501// Same as above, but also tests that GetFullRequestHeaders returns the proper
4502// headers (for the first or second request) when called at the proper times.
4503TEST_F(URLRequestTestHTTP,
4504 NetworkDelegateOnAuthRequiredSyncSetAuth_GetFullRequestHeaders) {
tommycli59a63432015-11-06 00:10:554505 ASSERT_TRUE(http_test_server()->Start());
[email protected]79e1fd62013-06-20 06:50:044506
4507 TestDelegate d;
4508 BlockingNetworkDelegate network_delegate(
4509 BlockingNetworkDelegate::SYNCHRONOUS);
4510 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
4511 network_delegate.set_auth_retval(
4512 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
4513
4514 network_delegate.set_auth_credentials(AuthCredentials(kUser, kSecret));
4515
4516 TestURLRequestContext context(true);
4517 context.set_network_delegate(&network_delegate);
4518 context.Init();
4519
4520 {
tommycli59a63432015-11-06 00:10:554521 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164522 std::unique_ptr<URLRequest> r(context.CreateRequest(
4523 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194524 r->Start();
[email protected]255620da2013-08-19 13:14:294525 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:044526
maksim.sisovb53724b52016-09-16 05:30:504527 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194528 EXPECT_EQ(200, r->GetResponseCode());
[email protected]79e1fd62013-06-20 06:50:044529 EXPECT_FALSE(d.auth_required_called());
4530 EXPECT_EQ(1, network_delegate.created_requests());
4531 EXPECT_EQ(0, network_delegate.destroyed_requests());
4532
4533 {
4534 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:194535 EXPECT_TRUE(r->GetFullRequestHeaders(&headers));
[email protected]79e1fd62013-06-20 06:50:044536 EXPECT_TRUE(headers.HasHeader("Authorization"));
4537 }
4538 }
4539 EXPECT_EQ(1, network_delegate.destroyed_requests());
4540}
4541
[email protected]c2911d72011-10-03 22:16:364542// Tests that the network delegate can synchronously complete OnAuthRequired
4543// by cancelling authentication.
4544TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredSyncCancel) {
tommycli59a63432015-11-06 00:10:554545 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364546
4547 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304548 BlockingNetworkDelegate network_delegate(
4549 BlockingNetworkDelegate::SYNCHRONOUS);
4550 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]c2911d72011-10-03 22:16:364551 network_delegate.set_auth_retval(
4552 NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH);
4553
[email protected]ef2bf422012-05-11 03:27:094554 TestURLRequestContext context(true);
4555 context.set_network_delegate(&network_delegate);
4556 context.Init();
[email protected]c2911d72011-10-03 22:16:364557
4558 {
tommycli59a63432015-11-06 00:10:554559 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164560 std::unique_ptr<URLRequest> r(context.CreateRequest(
4561 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194562 r->Start();
[email protected]255620da2013-08-19 13:14:294563 base::RunLoop().Run();
[email protected]c2911d72011-10-03 22:16:364564
maksim.sisovb53724b52016-09-16 05:30:504565 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194566 EXPECT_EQ(401, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364567 EXPECT_FALSE(d.auth_required_called());
4568 EXPECT_EQ(1, network_delegate.created_requests());
4569 EXPECT_EQ(0, network_delegate.destroyed_requests());
4570 }
4571 EXPECT_EQ(1, network_delegate.destroyed_requests());
4572}
4573
4574// Tests that the network delegate can asynchronously complete OnAuthRequired
4575// by taking no action. This indicates that the NetworkDelegate does not want
4576// to handle the challenge, and is passing the buck along to the
4577// URLRequest::Delegate.
4578TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncNoAction) {
tommycli59a63432015-11-06 00:10:554579 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364580
4581 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304582 BlockingNetworkDelegate network_delegate(
4583 BlockingNetworkDelegate::AUTO_CALLBACK);
4584 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]c2911d72011-10-03 22:16:364585
[email protected]ef2bf422012-05-11 03:27:094586 TestURLRequestContext context(true);
4587 context.set_network_delegate(&network_delegate);
4588 context.Init();
[email protected]c2911d72011-10-03 22:16:364589
[email protected]f3cf9802011-10-28 18:44:584590 d.set_credentials(AuthCredentials(kUser, kSecret));
[email protected]c2911d72011-10-03 22:16:364591
4592 {
tommycli59a63432015-11-06 00:10:554593 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164594 std::unique_ptr<URLRequest> r(context.CreateRequest(
4595 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194596 r->Start();
[email protected]255620da2013-08-19 13:14:294597 base::RunLoop().Run();
[email protected]c2911d72011-10-03 22:16:364598
maksim.sisovb53724b52016-09-16 05:30:504599 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194600 EXPECT_EQ(200, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364601 EXPECT_TRUE(d.auth_required_called());
4602 EXPECT_EQ(1, network_delegate.created_requests());
4603 EXPECT_EQ(0, network_delegate.destroyed_requests());
4604 }
4605 EXPECT_EQ(1, network_delegate.destroyed_requests());
4606}
4607
4608// Tests that the network delegate can asynchronously complete OnAuthRequired
4609// by setting credentials.
4610TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncSetAuth) {
tommycli59a63432015-11-06 00:10:554611 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364612
4613 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304614 BlockingNetworkDelegate network_delegate(
4615 BlockingNetworkDelegate::AUTO_CALLBACK);
4616 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]c2911d72011-10-03 22:16:364617 network_delegate.set_auth_retval(
[email protected]c2911d72011-10-03 22:16:364618 NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
4619
[email protected]f3cf9802011-10-28 18:44:584620 AuthCredentials auth_credentials(kUser, kSecret);
[email protected]c2911d72011-10-03 22:16:364621 network_delegate.set_auth_credentials(auth_credentials);
4622
[email protected]ef2bf422012-05-11 03:27:094623 TestURLRequestContext context(true);
4624 context.set_network_delegate(&network_delegate);
4625 context.Init();
[email protected]c2911d72011-10-03 22:16:364626
4627 {
tommycli59a63432015-11-06 00:10:554628 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164629 std::unique_ptr<URLRequest> r(context.CreateRequest(
4630 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194631 r->Start();
[email protected]255620da2013-08-19 13:14:294632 base::RunLoop().Run();
[email protected]c2911d72011-10-03 22:16:364633
maksim.sisovb53724b52016-09-16 05:30:504634 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194635 EXPECT_EQ(200, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364636 EXPECT_FALSE(d.auth_required_called());
4637 EXPECT_EQ(1, network_delegate.created_requests());
4638 EXPECT_EQ(0, network_delegate.destroyed_requests());
4639 }
4640 EXPECT_EQ(1, network_delegate.destroyed_requests());
4641}
4642
4643// Tests that the network delegate can asynchronously complete OnAuthRequired
4644// by cancelling authentication.
4645TEST_F(URLRequestTestHTTP, NetworkDelegateOnAuthRequiredAsyncCancel) {
tommycli59a63432015-11-06 00:10:554646 ASSERT_TRUE(http_test_server()->Start());
[email protected]c2911d72011-10-03 22:16:364647
4648 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304649 BlockingNetworkDelegate network_delegate(
4650 BlockingNetworkDelegate::AUTO_CALLBACK);
4651 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]c2911d72011-10-03 22:16:364652 network_delegate.set_auth_retval(
[email protected]c2911d72011-10-03 22:16:364653 NetworkDelegate::AUTH_REQUIRED_RESPONSE_CANCEL_AUTH);
4654
[email protected]ef2bf422012-05-11 03:27:094655 TestURLRequestContext context(true);
4656 context.set_network_delegate(&network_delegate);
4657 context.Init();
[email protected]c2911d72011-10-03 22:16:364658
4659 {
tommycli59a63432015-11-06 00:10:554660 GURL url(http_test_server()->GetURL("/auth-basic"));
rhalavatib7bd7c792017-04-27 05:25:164661 std::unique_ptr<URLRequest> r(context.CreateRequest(
4662 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:194663 r->Start();
[email protected]255620da2013-08-19 13:14:294664 base::RunLoop().Run();
[email protected]c2911d72011-10-03 22:16:364665
maksim.sisovb53724b52016-09-16 05:30:504666 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:194667 EXPECT_EQ(401, r->GetResponseCode());
[email protected]c2911d72011-10-03 22:16:364668 EXPECT_FALSE(d.auth_required_called());
4669 EXPECT_EQ(1, network_delegate.created_requests());
4670 EXPECT_EQ(0, network_delegate.destroyed_requests());
4671 }
4672 EXPECT_EQ(1, network_delegate.destroyed_requests());
4673}
4674
David Benjamin0bda12f2018-02-07 19:58:454675// Tests that NetworkDelegate header overrides from the 401 response do not
4676// affect the 200 response. This is a regression test for
4677// https://crbug.com/801237.
4678TEST_F(URLRequestTestHTTP, NetworkDelegateOverrideHeadersWithAuth) {
4679 ASSERT_TRUE(http_test_server()->Start());
4680
4681 TestDelegate d;
4682 d.set_credentials(AuthCredentials(kUser, kSecret));
4683 default_network_delegate_.set_add_header_to_first_response(true);
4684
4685 {
4686 GURL url(http_test_server()->GetURL("/auth-basic"));
4687 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
4688 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
4689 r->Start();
4690
4691 base::RunLoop().Run();
4692
4693 EXPECT_EQ(OK, d.request_status());
4694 EXPECT_EQ(200, r->GetResponseCode());
4695 EXPECT_TRUE(d.auth_required_called());
4696 EXPECT_FALSE(r->response_headers()->HasHeader("X-Network-Delegate"));
4697 }
4698
4699 {
4700 GURL url(http_test_server()->GetURL("/defaultresponse"));
4701 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
4702 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
4703 r->Start();
4704
4705 base::RunLoop().Run();
4706
4707 // Check that set_add_header_to_first_response normally adds a header.
4708 EXPECT_EQ(OK, d.request_status());
4709 EXPECT_EQ(200, r->GetResponseCode());
4710 EXPECT_TRUE(r->response_headers()->HasHeader("X-Network-Delegate"));
4711 }
4712}
4713
[email protected]9045b8822012-01-13 20:35:354714// Tests that we can handle when a network request was canceled while we were
4715// waiting for the network delegate.
4716// Part 1: Request is cancelled while waiting for OnBeforeURLRequest callback.
4717TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting1) {
tommycli59a63432015-11-06 00:10:554718 ASSERT_TRUE(http_test_server()->Start());
[email protected]9045b8822012-01-13 20:35:354719
4720 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304721 BlockingNetworkDelegate network_delegate(
4722 BlockingNetworkDelegate::USER_CALLBACK);
4723 network_delegate.set_block_on(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST);
[email protected]9045b8822012-01-13 20:35:354724
[email protected]ef2bf422012-05-11 03:27:094725 TestURLRequestContext context(true);
4726 context.set_network_delegate(&network_delegate);
4727 context.Init();
[email protected]9045b8822012-01-13 20:35:354728
4729 {
rhalavatib7bd7c792017-04-27 05:25:164730 std::unique_ptr<URLRequest> r(
4731 context.CreateRequest(http_test_server()->GetURL("/"), DEFAULT_PRIORITY,
4732 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]9045b8822012-01-13 20:35:354733
[email protected]f7022f32014-08-21 16:32:194734 r->Start();
[email protected]255620da2013-08-19 13:14:294735 base::RunLoop().Run();
[email protected]dc5a5cf2012-09-26 02:49:304736 EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_URL_REQUEST,
4737 network_delegate.stage_blocked_for_callback());
[email protected]9045b8822012-01-13 20:35:354738 EXPECT_EQ(0, network_delegate.completed_requests());
4739 // Cancel before callback.
[email protected]f7022f32014-08-21 16:32:194740 r->Cancel();
[email protected]9045b8822012-01-13 20:35:354741 // Ensure that network delegate is notified.
4742 EXPECT_EQ(1, network_delegate.completed_requests());
maksim.sisovb53724b52016-09-16 05:30:504743 EXPECT_EQ(1, network_delegate.canceled_requests());
[email protected]9045b8822012-01-13 20:35:354744 EXPECT_EQ(1, network_delegate.created_requests());
4745 EXPECT_EQ(0, network_delegate.destroyed_requests());
4746 }
4747 EXPECT_EQ(1, network_delegate.destroyed_requests());
4748}
4749
4750// Tests that we can handle when a network request was canceled while we were
4751// waiting for the network delegate.
ryansturm2343cb62016-06-15 01:09:004752// Part 2: Request is cancelled while waiting for OnBeforeStartTransaction
4753// callback.
[email protected]9045b8822012-01-13 20:35:354754TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting2) {
tommycli59a63432015-11-06 00:10:554755 ASSERT_TRUE(http_test_server()->Start());
[email protected]9045b8822012-01-13 20:35:354756
4757 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304758 BlockingNetworkDelegate network_delegate(
4759 BlockingNetworkDelegate::USER_CALLBACK);
4760 network_delegate.set_block_on(
4761 BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS);
[email protected]9045b8822012-01-13 20:35:354762
[email protected]ef2bf422012-05-11 03:27:094763 TestURLRequestContext context(true);
4764 context.set_network_delegate(&network_delegate);
4765 context.Init();
[email protected]9045b8822012-01-13 20:35:354766
4767 {
rhalavatib7bd7c792017-04-27 05:25:164768 std::unique_ptr<URLRequest> r(
4769 context.CreateRequest(http_test_server()->GetURL("/"), DEFAULT_PRIORITY,
4770 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]9045b8822012-01-13 20:35:354771
[email protected]f7022f32014-08-21 16:32:194772 r->Start();
[email protected]255620da2013-08-19 13:14:294773 base::RunLoop().Run();
[email protected]dc5a5cf2012-09-26 02:49:304774 EXPECT_EQ(BlockingNetworkDelegate::ON_BEFORE_SEND_HEADERS,
4775 network_delegate.stage_blocked_for_callback());
[email protected]9045b8822012-01-13 20:35:354776 EXPECT_EQ(0, network_delegate.completed_requests());
4777 // Cancel before callback.
[email protected]f7022f32014-08-21 16:32:194778 r->Cancel();
[email protected]9045b8822012-01-13 20:35:354779 // Ensure that network delegate is notified.
4780 EXPECT_EQ(1, network_delegate.completed_requests());
maksim.sisovb53724b52016-09-16 05:30:504781 EXPECT_EQ(1, network_delegate.canceled_requests());
[email protected]9045b8822012-01-13 20:35:354782 EXPECT_EQ(1, network_delegate.created_requests());
4783 EXPECT_EQ(0, network_delegate.destroyed_requests());
4784 }
4785 EXPECT_EQ(1, network_delegate.destroyed_requests());
4786}
4787
4788// Tests that we can handle when a network request was canceled while we were
4789// waiting for the network delegate.
4790// Part 3: Request is cancelled while waiting for OnHeadersReceived callback.
4791TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting3) {
tommycli59a63432015-11-06 00:10:554792 ASSERT_TRUE(http_test_server()->Start());
[email protected]9045b8822012-01-13 20:35:354793
4794 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304795 BlockingNetworkDelegate network_delegate(
4796 BlockingNetworkDelegate::USER_CALLBACK);
4797 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
[email protected]9045b8822012-01-13 20:35:354798
[email protected]ef2bf422012-05-11 03:27:094799 TestURLRequestContext context(true);
4800 context.set_network_delegate(&network_delegate);
4801 context.Init();
[email protected]9045b8822012-01-13 20:35:354802
4803 {
rhalavatib7bd7c792017-04-27 05:25:164804 std::unique_ptr<URLRequest> r(
4805 context.CreateRequest(http_test_server()->GetURL("/"), DEFAULT_PRIORITY,
4806 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]9045b8822012-01-13 20:35:354807
[email protected]f7022f32014-08-21 16:32:194808 r->Start();
[email protected]255620da2013-08-19 13:14:294809 base::RunLoop().Run();
[email protected]dc5a5cf2012-09-26 02:49:304810 EXPECT_EQ(BlockingNetworkDelegate::ON_HEADERS_RECEIVED,
4811 network_delegate.stage_blocked_for_callback());
[email protected]9045b8822012-01-13 20:35:354812 EXPECT_EQ(0, network_delegate.completed_requests());
4813 // Cancel before callback.
[email protected]f7022f32014-08-21 16:32:194814 r->Cancel();
[email protected]9045b8822012-01-13 20:35:354815 // Ensure that network delegate is notified.
4816 EXPECT_EQ(1, network_delegate.completed_requests());
maksim.sisovb53724b52016-09-16 05:30:504817 EXPECT_EQ(1, network_delegate.canceled_requests());
[email protected]9045b8822012-01-13 20:35:354818 EXPECT_EQ(1, network_delegate.created_requests());
4819 EXPECT_EQ(0, network_delegate.destroyed_requests());
4820 }
4821 EXPECT_EQ(1, network_delegate.destroyed_requests());
4822}
4823
4824// Tests that we can handle when a network request was canceled while we were
4825// waiting for the network delegate.
4826// Part 4: Request is cancelled while waiting for OnAuthRequired callback.
[email protected]bfe8b302013-02-15 12:16:024827TEST_F(URLRequestTestHTTP, NetworkDelegateCancelWhileWaiting4) {
tommycli59a63432015-11-06 00:10:554828 ASSERT_TRUE(http_test_server()->Start());
[email protected]9045b8822012-01-13 20:35:354829
4830 TestDelegate d;
[email protected]dc5a5cf2012-09-26 02:49:304831 BlockingNetworkDelegate network_delegate(
4832 BlockingNetworkDelegate::USER_CALLBACK);
4833 network_delegate.set_block_on(BlockingNetworkDelegate::ON_AUTH_REQUIRED);
[email protected]9045b8822012-01-13 20:35:354834
[email protected]ef2bf422012-05-11 03:27:094835 TestURLRequestContext context(true);
4836 context.set_network_delegate(&network_delegate);
4837 context.Init();
[email protected]9045b8822012-01-13 20:35:354838
4839 {
danakj8522a25b2016-04-16 00:17:364840 std::unique_ptr<URLRequest> r(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164841 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
4842 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]9045b8822012-01-13 20:35:354843
[email protected]f7022f32014-08-21 16:32:194844 r->Start();
[email protected]255620da2013-08-19 13:14:294845 base::RunLoop().Run();
[email protected]dc5a5cf2012-09-26 02:49:304846 EXPECT_EQ(BlockingNetworkDelegate::ON_AUTH_REQUIRED,
4847 network_delegate.stage_blocked_for_callback());
[email protected]9045b8822012-01-13 20:35:354848 EXPECT_EQ(0, network_delegate.completed_requests());
4849 // Cancel before callback.
[email protected]f7022f32014-08-21 16:32:194850 r->Cancel();
[email protected]9045b8822012-01-13 20:35:354851 // Ensure that network delegate is notified.
4852 EXPECT_EQ(1, network_delegate.completed_requests());
maksim.sisovb53724b52016-09-16 05:30:504853 EXPECT_EQ(1, network_delegate.canceled_requests());
[email protected]9045b8822012-01-13 20:35:354854 EXPECT_EQ(1, network_delegate.created_requests());
4855 EXPECT_EQ(0, network_delegate.destroyed_requests());
4856 }
4857 EXPECT_EQ(1, network_delegate.destroyed_requests());
4858}
4859
tommycli59a63432015-11-06 00:10:554860namespace {
4861
danakj8522a25b2016-04-16 00:17:364862std::unique_ptr<test_server::HttpResponse> HandleServerAuthConnect(
tommycli59a63432015-11-06 00:10:554863 const test_server::HttpRequest& request) {
4864 if (request.headers.find("Host") == request.headers.end() ||
4865 request.headers.at("Host") != "www.server-auth.com" ||
4866 request.method != test_server::METHOD_CONNECT) {
4867 return nullptr;
4868 }
4869
danakj8522a25b2016-04-16 00:17:364870 std::unique_ptr<test_server::BasicHttpResponse> http_response(
tommycli59a63432015-11-06 00:10:554871 new test_server::BasicHttpResponse);
4872 http_response->set_code(HTTP_UNAUTHORIZED);
4873 http_response->AddCustomHeader("WWW-Authenticate",
4874 "Basic realm=\"WallyWorld\"");
dchengc7eeda422015-12-26 03:56:484875 return std::move(http_response);
tommycli59a63432015-11-06 00:10:554876}
4877
4878} // namespace
4879
4880// In this unit test, we're using the EmbeddedTestServer as a proxy server and
[email protected]95409e12010-08-17 20:07:114881// issuing a CONNECT request with the magic host name "www.server-auth.com".
tommycli59a63432015-11-06 00:10:554882// The EmbeddedTestServer will return a 401 response, which we should balk at.
[email protected]b89290212009-08-14 22:37:354883TEST_F(URLRequestTestHTTP, UnexpectedServerAuthTest) {
tommycli59a63432015-11-06 00:10:554884 http_test_server()->RegisterRequestHandler(
Matt Menke2b2a60472018-02-07 02:12:124885 base::BindRepeating(&HandleServerAuthConnect));
tommycli59a63432015-11-06 00:10:554886 ASSERT_TRUE(http_test_server()->Start());
[email protected]95409e12010-08-17 20:07:114887
[email protected]ceefd7fd2012-11-29 00:36:244888 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]d5a4dd62012-05-23 01:41:044889 TestURLRequestContextWithProxy context(
tommycli59a63432015-11-06 00:10:554890 http_test_server()->host_port_pair().ToString(), &network_delegate);
[email protected]87a09a92011-07-14 15:50:504891
[email protected]dc651782009-02-14 01:45:084892 TestDelegate d;
4893 {
danakj8522a25b2016-04-16 00:17:364894 std::unique_ptr<URLRequest> r(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164895 GURL("https://www.server-auth.com/"), DEFAULT_PRIORITY, &d,
4896 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]dc651782009-02-14 01:45:084897
[email protected]f7022f32014-08-21 16:32:194898 r->Start();
4899 EXPECT_TRUE(r->is_pending());
[email protected]dc651782009-02-14 01:45:084900
[email protected]255620da2013-08-19 13:14:294901 base::RunLoop().Run();
[email protected]dc651782009-02-14 01:45:084902
[email protected]d8fc4722014-06-13 13:17:154903 // The proxy server is not set before failure.
tbansal2ecbbc72016-10-06 17:15:474904 EXPECT_FALSE(r->proxy_server().is_valid());
maksim.sisovb53724b52016-09-16 05:30:504905 EXPECT_EQ(ERR_TUNNEL_CONNECTION_FAILED, d.request_status());
[email protected]dc651782009-02-14 01:45:084906 }
4907}
4908
[email protected]b89290212009-08-14 22:37:354909TEST_F(URLRequestTestHTTP, GetTest_NoCache) {
tommycli59a63432015-11-06 00:10:554910 ASSERT_TRUE(http_test_server()->Start());
[email protected]95409e12010-08-17 20:07:114911
initial.commit586acc5fe2008-07-26 22:42:524912 TestDelegate d;
4913 {
danakj8522a25b2016-04-16 00:17:364914 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164915 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
4916 TRAFFIC_ANNOTATION_FOR_TESTS));
initial.commit586acc5fe2008-07-26 22:42:524917
[email protected]f7022f32014-08-21 16:32:194918 r->Start();
4919 EXPECT_TRUE(r->is_pending());
initial.commit586acc5fe2008-07-26 22:42:524920
[email protected]255620da2013-08-19 13:14:294921 base::RunLoop().Run();
initial.commit586acc5fe2008-07-26 22:42:524922
4923 EXPECT_EQ(1, d.response_started_count());
4924 EXPECT_FALSE(d.received_data_before_response());
4925 EXPECT_NE(0, d.bytes_received());
tommycli59a63432015-11-06 00:10:554926 EXPECT_EQ(http_test_server()->host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:194927 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:554928 EXPECT_EQ(http_test_server()->host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:194929 r->GetSocketAddress().port());
[email protected]c31a54592009-09-04 02:36:164930
[email protected]9e743cd2010-03-16 07:03:534931 // TODO(eroman): Add back the NetLog tests...
initial.commit586acc5fe2008-07-26 22:42:524932 }
initial.commit586acc5fe2008-07-26 22:42:524933}
4934
[email protected]263163f2012-06-14 22:40:344935// This test has the server send a large number of cookies to the client.
4936// To ensure that no number of cookies causes a crash, a galloping binary
4937// search is used to estimate that maximum number of cookies that are accepted
4938// by the browser. Beyond the maximum number, the request will fail with
4939// ERR_RESPONSE_HEADERS_TOO_BIG.
Sergey Ulanov0fb900c2017-09-20 00:27:314940#if defined(OS_WIN) || defined(OS_FUCHSIA)
[email protected]69dd6fe2013-02-23 23:15:304941// http://crbug.com/177916
4942#define MAYBE_GetTest_ManyCookies DISABLED_GetTest_ManyCookies
4943#else
4944#define MAYBE_GetTest_ManyCookies GetTest_ManyCookies
4945#endif // defined(OS_WIN)
4946TEST_F(URLRequestTestHTTP, MAYBE_GetTest_ManyCookies) {
tommycli59a63432015-11-06 00:10:554947 ASSERT_TRUE(http_test_server()->Start());
[email protected]263163f2012-06-14 22:40:344948
4949 int lower_bound = 0;
4950 int upper_bound = 1;
4951
4952 // Double the number of cookies until the response header limits are
4953 // exceeded.
4954 while (DoManyCookiesRequest(upper_bound)) {
4955 lower_bound = upper_bound;
4956 upper_bound *= 2;
4957 ASSERT_LT(upper_bound, 1000000);
4958 }
4959
pkasting6b68a162014-12-01 22:10:294960 int tolerance = static_cast<int>(upper_bound * 0.005);
[email protected]263163f2012-06-14 22:40:344961 if (tolerance < 2)
4962 tolerance = 2;
4963
4964 // Perform a binary search to find the highest possible number of cookies,
4965 // within the desired tolerance.
4966 while (upper_bound - lower_bound >= tolerance) {
4967 int num_cookies = (lower_bound + upper_bound) / 2;
4968
4969 if (DoManyCookiesRequest(num_cookies))
4970 lower_bound = num_cookies;
4971 else
4972 upper_bound = num_cookies;
4973 }
4974 // Success: the test did not crash.
4975}
4976
[email protected]b89290212009-08-14 22:37:354977TEST_F(URLRequestTestHTTP, GetTest) {
tommycli59a63432015-11-06 00:10:554978 ASSERT_TRUE(http_test_server()->Start());
[email protected]95409e12010-08-17 20:07:114979
initial.commit586acc5fe2008-07-26 22:42:524980 TestDelegate d;
4981 {
danakj8522a25b2016-04-16 00:17:364982 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:164983 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
4984 TRAFFIC_ANNOTATION_FOR_TESTS));
initial.commit586acc5fe2008-07-26 22:42:524985
[email protected]f7022f32014-08-21 16:32:194986 r->Start();
4987 EXPECT_TRUE(r->is_pending());
initial.commit586acc5fe2008-07-26 22:42:524988
[email protected]255620da2013-08-19 13:14:294989 base::RunLoop().Run();
initial.commit586acc5fe2008-07-26 22:42:524990
4991 EXPECT_EQ(1, d.response_started_count());
4992 EXPECT_FALSE(d.received_data_before_response());
4993 EXPECT_NE(0, d.bytes_received());
tommycli59a63432015-11-06 00:10:554994 EXPECT_EQ(http_test_server()->host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:194995 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:554996 EXPECT_EQ(http_test_server()->host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:194997 r->GetSocketAddress().port());
initial.commit586acc5fe2008-07-26 22:42:524998 }
[email protected]5d7b373e2009-09-02 07:19:034999}
5000
[email protected]79e1fd62013-06-20 06:50:045001TEST_F(URLRequestTestHTTP, GetTest_GetFullRequestHeaders) {
tommycli59a63432015-11-06 00:10:555002 ASSERT_TRUE(http_test_server()->Start());
[email protected]79e1fd62013-06-20 06:50:045003
5004 TestDelegate d;
5005 {
tommycli59a63432015-11-06 00:10:555006 GURL test_url(http_test_server()->GetURL("/defaultresponse"));
rhalavatib7bd7c792017-04-27 05:25:165007 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
5008 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]79e1fd62013-06-20 06:50:045009
5010 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:195011 EXPECT_FALSE(r->GetFullRequestHeaders(&headers));
[email protected]79e1fd62013-06-20 06:50:045012
[email protected]f7022f32014-08-21 16:32:195013 r->Start();
5014 EXPECT_TRUE(r->is_pending());
[email protected]79e1fd62013-06-20 06:50:045015
[email protected]255620da2013-08-19 13:14:295016 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:045017
5018 EXPECT_EQ(1, d.response_started_count());
5019 EXPECT_FALSE(d.received_data_before_response());
5020 EXPECT_NE(0, d.bytes_received());
tommycli59a63432015-11-06 00:10:555021 EXPECT_EQ(http_test_server()->host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:195022 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:555023 EXPECT_EQ(http_test_server()->host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:195024 r->GetSocketAddress().port());
[email protected]79e1fd62013-06-20 06:50:045025
5026 EXPECT_TRUE(d.have_full_request_headers());
5027 CheckFullRequestHeaders(d.full_request_headers(), test_url);
5028 }
5029}
5030
[email protected]58e32bb2013-01-21 18:23:255031TEST_F(URLRequestTestHTTP, GetTestLoadTiming) {
tommycli59a63432015-11-06 00:10:555032 ASSERT_TRUE(http_test_server()->Start());
[email protected]58e32bb2013-01-21 18:23:255033
5034 TestDelegate d;
5035 {
danakj8522a25b2016-04-16 00:17:365036 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:165037 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
5038 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]58e32bb2013-01-21 18:23:255039
[email protected]f7022f32014-08-21 16:32:195040 r->Start();
5041 EXPECT_TRUE(r->is_pending());
[email protected]58e32bb2013-01-21 18:23:255042
[email protected]255620da2013-08-19 13:14:295043 base::RunLoop().Run();
[email protected]58e32bb2013-01-21 18:23:255044
5045 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:195046 r->GetLoadTimingInfo(&load_timing_info);
[email protected]58e32bb2013-01-21 18:23:255047 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
5048
5049 EXPECT_EQ(1, d.response_started_count());
5050 EXPECT_FALSE(d.received_data_before_response());
5051 EXPECT_NE(0, d.bytes_received());
tommycli59a63432015-11-06 00:10:555052 EXPECT_EQ(http_test_server()->host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:195053 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:555054 EXPECT_EQ(http_test_server()->host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:195055 r->GetSocketAddress().port());
[email protected]58e32bb2013-01-21 18:23:255056 }
5057}
5058
tommycli59a63432015-11-06 00:10:555059// TODO(svaldez): Update tests to use EmbeddedTestServer.
5060#if !defined(OS_IOS)
[email protected]aad63572011-05-24 20:14:395061TEST_F(URLRequestTestHTTP, GetZippedTest) {
tommycli59a63432015-11-06 00:10:555062 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
tommycli59a63432015-11-06 00:10:555063 base::FilePath(kTestFilePath));
5064
5065 ASSERT_TRUE(test_server.Start());
[email protected]aad63572011-05-24 20:14:395066
5067 // Parameter that specifies the Content-Length field in the response:
5068 // C - Compressed length.
5069 // U - Uncompressed length.
5070 // L - Large length (larger than both C & U).
5071 // M - Medium length (between C & U).
5072 // S - Small length (smaller than both C & U).
5073 const char test_parameters[] = "CULMS";
5074 const int num_tests = arraysize(test_parameters)- 1; // Skip NULL.
5075 // C & U should be OK.
[email protected]f0e2bf42011-07-22 21:21:445076 // L & M are larger than the data sent, and show an error.
[email protected]aad63572011-05-24 20:14:395077 // S has too little data, but we seem to accept it.
5078 const bool test_expect_success[num_tests] =
[email protected]f001bd6a2011-12-08 04:31:375079 { true, true, false, false, true };
[email protected]aad63572011-05-24 20:14:395080
xunjielifb4da222016-07-14 18:38:595081 base::FilePath file_path;
5082 PathService::Get(base::DIR_SOURCE_ROOT, &file_path);
5083 file_path = file_path.Append(kTestFilePath);
5084 file_path = file_path.Append(FILE_PATH_LITERAL("BullRunSpeech.txt"));
5085 std::string expected_content;
5086 ASSERT_TRUE(base::ReadFileToString(file_path, &expected_content));
5087
5088 for (int i = 0; i < num_tests; i++) {
[email protected]aad63572011-05-24 20:14:395089 TestDelegate d;
5090 {
tommycli59a63432015-11-06 00:10:555091 std::string test_file = base::StringPrintf(
5092 "compressedfiles/BullRunSpeech.txt?%c", test_parameters[i]);
[email protected]aad63572011-05-24 20:14:395093
[email protected]ceefd7fd2012-11-29 00:36:245094 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]ef2bf422012-05-11 03:27:095095 TestURLRequestContext context(true);
5096 context.set_network_delegate(&network_delegate);
5097 context.Init();
[email protected]87a09a92011-07-14 15:50:505098
rhalavatib7bd7c792017-04-27 05:25:165099 std::unique_ptr<URLRequest> r(
5100 context.CreateRequest(test_server.GetURL(test_file), DEFAULT_PRIORITY,
5101 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195102 r->Start();
5103 EXPECT_TRUE(r->is_pending());
[email protected]aad63572011-05-24 20:14:395104
[email protected]255620da2013-08-19 13:14:295105 base::RunLoop().Run();
[email protected]aad63572011-05-24 20:14:395106
5107 EXPECT_EQ(1, d.response_started_count());
5108 EXPECT_FALSE(d.received_data_before_response());
5109 VLOG(1) << " Received " << d.bytes_received() << " bytes"
maksim.sisovb53724b52016-09-16 05:30:505110 << " error = " << d.request_status();
[email protected]aad63572011-05-24 20:14:395111 if (test_expect_success[i]) {
maksim.sisovb53724b52016-09-16 05:30:505112 EXPECT_EQ(OK, d.request_status()) << " Parameter = \"" << test_file
5113 << "\"";
xunjielifb4da222016-07-14 18:38:595114 if (test_parameters[i] == 'S') {
5115 // When content length is smaller than both compressed length and
5116 // uncompressed length, HttpStreamParser might not read the full
5117 // response body.
5118 continue;
5119 }
5120 EXPECT_EQ(expected_content, d.data_received());
[email protected]aad63572011-05-24 20:14:395121 } else {
maksim.sisovb53724b52016-09-16 05:30:505122 EXPECT_EQ(ERR_CONTENT_LENGTH_MISMATCH, d.request_status())
[email protected]aad63572011-05-24 20:14:395123 << " Parameter = \"" << test_file << "\"";
5124 }
5125 }
5126 }
5127}
tommycli59a63432015-11-06 00:10:555128#endif // !defined(OS_IOS)
[email protected]aad63572011-05-24 20:14:395129
[email protected]58e32bb2013-01-21 18:23:255130TEST_F(URLRequestTestHTTP, RedirectLoadTiming) {
tommycli59a63432015-11-06 00:10:555131 ASSERT_TRUE(http_test_server()->Start());
[email protected]58e32bb2013-01-21 18:23:255132
tommycli59a63432015-11-06 00:10:555133 GURL destination_url = http_test_server()->GetURL("/");
[email protected]007b3f82013-04-09 08:46:455134 GURL original_url =
tommycli59a63432015-11-06 00:10:555135 http_test_server()->GetURL("/server-redirect?" + destination_url.spec());
[email protected]58e32bb2013-01-21 18:23:255136 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:165137 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
5138 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195139 req->Start();
[email protected]255620da2013-08-19 13:14:295140 base::RunLoop().Run();
[email protected]58e32bb2013-01-21 18:23:255141
5142 EXPECT_EQ(1, d.response_started_count());
5143 EXPECT_EQ(1, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:195144 EXPECT_EQ(destination_url, req->url());
5145 EXPECT_EQ(original_url, req->original_url());
5146 ASSERT_EQ(2U, req->url_chain().size());
5147 EXPECT_EQ(original_url, req->url_chain()[0]);
5148 EXPECT_EQ(destination_url, req->url_chain()[1]);
[email protected]58e32bb2013-01-21 18:23:255149
5150 LoadTimingInfo load_timing_info_before_redirect;
5151 EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeRedirect(
5152 &load_timing_info_before_redirect));
5153 TestLoadTimingNotReused(load_timing_info_before_redirect,
5154 CONNECT_TIMING_HAS_DNS_TIMES);
5155
5156 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:195157 req->GetLoadTimingInfo(&load_timing_info);
[email protected]58e32bb2013-01-21 18:23:255158 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
5159
5160 // Check that a new socket was used on redirect, since the server does not
5161 // supposed keep-alive sockets, and that the times before the redirect are
5162 // before the ones recorded for the second request.
5163 EXPECT_NE(load_timing_info_before_redirect.socket_log_id,
5164 load_timing_info.socket_log_id);
5165 EXPECT_LE(load_timing_info_before_redirect.receive_headers_end,
5166 load_timing_info.connect_timing.connect_start);
5167}
5168
[email protected]8f1ac082011-04-19 21:14:135169TEST_F(URLRequestTestHTTP, MultipleRedirectTest) {
tommycli59a63432015-11-06 00:10:555170 ASSERT_TRUE(http_test_server()->Start());
[email protected]8f1ac082011-04-19 21:14:135171
tommycli59a63432015-11-06 00:10:555172 GURL destination_url = http_test_server()->GetURL("/");
[email protected]007b3f82013-04-09 08:46:455173 GURL middle_redirect_url =
tommycli59a63432015-11-06 00:10:555174 http_test_server()->GetURL("/server-redirect?" + destination_url.spec());
5175 GURL original_url = http_test_server()->GetURL("/server-redirect?" +
5176 middle_redirect_url.spec());
[email protected]8f1ac082011-04-19 21:14:135177 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:165178 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
5179 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195180 req->Start();
[email protected]255620da2013-08-19 13:14:295181 base::RunLoop().Run();
[email protected]8f1ac082011-04-19 21:14:135182
5183 EXPECT_EQ(1, d.response_started_count());
5184 EXPECT_EQ(2, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:195185 EXPECT_EQ(destination_url, req->url());
5186 EXPECT_EQ(original_url, req->original_url());
5187 ASSERT_EQ(3U, req->url_chain().size());
5188 EXPECT_EQ(original_url, req->url_chain()[0]);
5189 EXPECT_EQ(middle_redirect_url, req->url_chain()[1]);
5190 EXPECT_EQ(destination_url, req->url_chain()[2]);
[email protected]8f1ac082011-04-19 21:14:135191}
5192
[email protected]abe1c4a2013-10-25 19:28:515193// First and second pieces of information logged by delegates to URLRequests.
5194const char kFirstDelegateInfo[] = "Wonderful delegate";
5195const char kSecondDelegateInfo[] = "Exciting delegate";
5196
5197// Logs delegate information to a URLRequest. The first string is logged
5198// synchronously on Start(), using DELEGATE_INFO_DEBUG_ONLY. The second is
5199// logged asynchronously, using DELEGATE_INFO_DISPLAY_TO_USER. Then
5200// another asynchronous call is used to clear the delegate information
5201// before calling a callback. The object then deletes itself.
5202class AsyncDelegateLogger : public base::RefCounted<AsyncDelegateLogger> {
5203 public:
5204 typedef base::Callback<void()> Callback;
5205
5206 // Each time delegate information is added to the URLRequest, the resulting
5207 // load state is checked. The expected load state after each request is
5208 // passed in as an argument.
5209 static void Run(URLRequest* url_request,
5210 LoadState expected_first_load_state,
5211 LoadState expected_second_load_state,
5212 LoadState expected_third_load_state,
5213 const Callback& callback) {
5214 AsyncDelegateLogger* logger = new AsyncDelegateLogger(
5215 url_request,
5216 expected_first_load_state,
5217 expected_second_load_state,
5218 expected_third_load_state,
5219 callback);
5220 logger->Start();
5221 }
5222
5223 // Checks that the log entries, starting with log_position, contain the
5224 // DELEGATE_INFO NetLog events that an AsyncDelegateLogger should have
5225 // recorded. Returns the index of entry after the expected number of
5226 // events this logged, or entries.size() if there aren't enough entries.
mmenke43758e62015-05-04 21:09:465227 static size_t CheckDelegateInfo(const TestNetLogEntry::List& entries,
vishal.b62985ca92015-04-17 08:45:515228 size_t log_position) {
[email protected]abe1c4a2013-10-25 19:28:515229 // There should be 4 DELEGATE_INFO events: Two begins and two ends.
5230 if (log_position + 3 >= entries.size()) {
5231 ADD_FAILURE() << "Not enough log entries";
5232 return entries.size();
5233 }
5234 std::string delegate_info;
mikecirone8b85c432016-09-08 19:11:005235 EXPECT_EQ(NetLogEventType::DELEGATE_INFO, entries[log_position].type);
5236 EXPECT_EQ(NetLogEventPhase::BEGIN, entries[log_position].phase);
rdsmith37a0dde2017-01-04 00:12:075237 EXPECT_TRUE(entries[log_position].GetStringValue("delegate_blocked_by",
[email protected]abe1c4a2013-10-25 19:28:515238 &delegate_info));
5239 EXPECT_EQ(kFirstDelegateInfo, delegate_info);
5240
5241 ++log_position;
mikecirone8b85c432016-09-08 19:11:005242 EXPECT_EQ(NetLogEventType::DELEGATE_INFO, entries[log_position].type);
5243 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515244
5245 ++log_position;
mikecirone8b85c432016-09-08 19:11:005246 EXPECT_EQ(NetLogEventType::DELEGATE_INFO, entries[log_position].type);
5247 EXPECT_EQ(NetLogEventPhase::BEGIN, entries[log_position].phase);
rdsmith37a0dde2017-01-04 00:12:075248 EXPECT_TRUE(entries[log_position].GetStringValue("delegate_blocked_by",
[email protected]abe1c4a2013-10-25 19:28:515249 &delegate_info));
5250 EXPECT_EQ(kSecondDelegateInfo, delegate_info);
5251
5252 ++log_position;
mikecirone8b85c432016-09-08 19:11:005253 EXPECT_EQ(NetLogEventType::DELEGATE_INFO, entries[log_position].type);
5254 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515255
5256 return log_position + 1;
5257 }
5258
5259 private:
5260 friend class base::RefCounted<AsyncDelegateLogger>;
5261
5262 AsyncDelegateLogger(URLRequest* url_request,
5263 LoadState expected_first_load_state,
5264 LoadState expected_second_load_state,
5265 LoadState expected_third_load_state,
5266 const Callback& callback)
5267 : url_request_(url_request),
5268 expected_first_load_state_(expected_first_load_state),
5269 expected_second_load_state_(expected_second_load_state),
5270 expected_third_load_state_(expected_third_load_state),
5271 callback_(callback) {
5272 }
5273
Chris Watkins7a41d3552017-12-01 02:13:275274 ~AsyncDelegateLogger() = default;
[email protected]abe1c4a2013-10-25 19:28:515275
5276 void Start() {
[email protected]f8fe5cf2013-12-04 20:11:535277 url_request_->LogBlockedBy(kFirstDelegateInfo);
[email protected]abe1c4a2013-10-25 19:28:515278 LoadStateWithParam load_state = url_request_->GetLoadState();
5279 EXPECT_EQ(expected_first_load_state_, load_state.state);
5280 EXPECT_NE(ASCIIToUTF16(kFirstDelegateInfo), load_state.param);
skyostil4891b25b2015-06-11 11:43:455281 base::ThreadTaskRunnerHandle::Get()->PostTask(
5282 FROM_HERE, base::Bind(&AsyncDelegateLogger::LogSecondDelegate, this));
[email protected]abe1c4a2013-10-25 19:28:515283 }
5284
5285 void LogSecondDelegate() {
[email protected]f8fe5cf2013-12-04 20:11:535286 url_request_->LogAndReportBlockedBy(kSecondDelegateInfo);
[email protected]abe1c4a2013-10-25 19:28:515287 LoadStateWithParam load_state = url_request_->GetLoadState();
5288 EXPECT_EQ(expected_second_load_state_, load_state.state);
5289 if (expected_second_load_state_ == LOAD_STATE_WAITING_FOR_DELEGATE) {
5290 EXPECT_EQ(ASCIIToUTF16(kSecondDelegateInfo), load_state.param);
5291 } else {
5292 EXPECT_NE(ASCIIToUTF16(kSecondDelegateInfo), load_state.param);
5293 }
skyostil4891b25b2015-06-11 11:43:455294 base::ThreadTaskRunnerHandle::Get()->PostTask(
5295 FROM_HERE, base::Bind(&AsyncDelegateLogger::LogComplete, this));
[email protected]abe1c4a2013-10-25 19:28:515296 }
5297
5298 void LogComplete() {
[email protected]f8fe5cf2013-12-04 20:11:535299 url_request_->LogUnblocked();
[email protected]abe1c4a2013-10-25 19:28:515300 LoadStateWithParam load_state = url_request_->GetLoadState();
5301 EXPECT_EQ(expected_third_load_state_, load_state.state);
5302 if (expected_second_load_state_ == LOAD_STATE_WAITING_FOR_DELEGATE)
[email protected]754bd202013-12-18 08:29:085303 EXPECT_EQ(base::string16(), load_state.param);
[email protected]abe1c4a2013-10-25 19:28:515304 callback_.Run();
5305 }
5306
5307 URLRequest* url_request_;
5308 const int expected_first_load_state_;
5309 const int expected_second_load_state_;
5310 const int expected_third_load_state_;
5311 const Callback callback_;
5312
5313 DISALLOW_COPY_AND_ASSIGN(AsyncDelegateLogger);
5314};
5315
5316// NetworkDelegate that logs delegate information before a request is started,
5317// before headers are sent, when headers are read, and when auth information
5318// is requested. Uses AsyncDelegateLogger.
5319class AsyncLoggingNetworkDelegate : public TestNetworkDelegate {
5320 public:
Chris Watkins7a41d3552017-12-01 02:13:275321 AsyncLoggingNetworkDelegate() = default;
5322 ~AsyncLoggingNetworkDelegate() override = default;
[email protected]abe1c4a2013-10-25 19:28:515323
5324 // NetworkDelegate implementation.
dchengb03027d2014-10-21 12:00:205325 int OnBeforeURLRequest(URLRequest* request,
5326 const CompletionCallback& callback,
5327 GURL* new_url) override {
[email protected]abe1c4a2013-10-25 19:28:515328 TestNetworkDelegate::OnBeforeURLRequest(request, callback, new_url);
5329 return RunCallbackAsynchronously(request, callback);
5330 }
5331
ryansturm2343cb62016-06-15 01:09:005332 int OnBeforeStartTransaction(URLRequest* request,
5333 const CompletionCallback& callback,
5334 HttpRequestHeaders* headers) override {
5335 TestNetworkDelegate::OnBeforeStartTransaction(request, callback, headers);
[email protected]abe1c4a2013-10-25 19:28:515336 return RunCallbackAsynchronously(request, callback);
5337 }
5338
dchengb03027d2014-10-21 12:00:205339 int OnHeadersReceived(
[email protected]abe1c4a2013-10-25 19:28:515340 URLRequest* request,
5341 const CompletionCallback& callback,
5342 const HttpResponseHeaders* original_response_headers,
[email protected]5f714132014-03-26 10:41:165343 scoped_refptr<HttpResponseHeaders>* override_response_headers,
mostynbba063d6032014-10-09 11:01:135344 GURL* allowed_unsafe_redirect_url) override {
[email protected]5f714132014-03-26 10:41:165345 TestNetworkDelegate::OnHeadersReceived(request,
5346 callback,
[email protected]abe1c4a2013-10-25 19:28:515347 original_response_headers,
[email protected]5f714132014-03-26 10:41:165348 override_response_headers,
5349 allowed_unsafe_redirect_url);
[email protected]abe1c4a2013-10-25 19:28:515350 return RunCallbackAsynchronously(request, callback);
5351 }
5352
dchengb03027d2014-10-21 12:00:205353 NetworkDelegate::AuthRequiredResponse OnAuthRequired(
[email protected]abe1c4a2013-10-25 19:28:515354 URLRequest* request,
5355 const AuthChallengeInfo& auth_info,
5356 const AuthCallback& callback,
mostynbba063d6032014-10-09 11:01:135357 AuthCredentials* credentials) override {
[email protected]abe1c4a2013-10-25 19:28:515358 AsyncDelegateLogger::Run(
5359 request,
5360 LOAD_STATE_WAITING_FOR_DELEGATE,
5361 LOAD_STATE_WAITING_FOR_DELEGATE,
5362 LOAD_STATE_WAITING_FOR_DELEGATE,
5363 base::Bind(&AsyncLoggingNetworkDelegate::SetAuthAndResume,
5364 callback, credentials));
5365 return AUTH_REQUIRED_RESPONSE_IO_PENDING;
5366 }
5367
5368 private:
5369 static int RunCallbackAsynchronously(
5370 URLRequest* request,
5371 const CompletionCallback& callback) {
5372 AsyncDelegateLogger::Run(
5373 request,
5374 LOAD_STATE_WAITING_FOR_DELEGATE,
5375 LOAD_STATE_WAITING_FOR_DELEGATE,
5376 LOAD_STATE_WAITING_FOR_DELEGATE,
5377 base::Bind(callback, OK));
5378 return ERR_IO_PENDING;
5379 }
5380
5381 static void SetAuthAndResume(const AuthCallback& callback,
5382 AuthCredentials* credentials) {
5383 *credentials = AuthCredentials(kUser, kSecret);
5384 callback.Run(NetworkDelegate::AUTH_REQUIRED_RESPONSE_SET_AUTH);
5385 }
5386
5387 DISALLOW_COPY_AND_ASSIGN(AsyncLoggingNetworkDelegate);
5388};
5389
5390// URLRequest::Delegate that logs delegate information when the headers
5391// are received, when each read completes, and during redirects. Uses
5392// AsyncDelegateLogger. Can optionally cancel a request in any phase.
5393//
5394// Inherits from TestDelegate to reuse the TestDelegate code to handle
5395// advancing to the next step in most cases, as well as cancellation.
5396class AsyncLoggingUrlRequestDelegate : public TestDelegate {
5397 public:
5398 enum CancelStage {
5399 NO_CANCEL = 0,
5400 CANCEL_ON_RECEIVED_REDIRECT,
5401 CANCEL_ON_RESPONSE_STARTED,
5402 CANCEL_ON_READ_COMPLETED
5403 };
5404
5405 explicit AsyncLoggingUrlRequestDelegate(CancelStage cancel_stage)
5406 : cancel_stage_(cancel_stage) {
5407 if (cancel_stage == CANCEL_ON_RECEIVED_REDIRECT)
5408 set_cancel_in_received_redirect(true);
5409 else if (cancel_stage == CANCEL_ON_RESPONSE_STARTED)
5410 set_cancel_in_response_started(true);
5411 else if (cancel_stage == CANCEL_ON_READ_COMPLETED)
5412 set_cancel_in_received_data(true);
5413 }
Chris Watkins7a41d3552017-12-01 02:13:275414 ~AsyncLoggingUrlRequestDelegate() override = default;
[email protected]abe1c4a2013-10-25 19:28:515415
5416 // URLRequest::Delegate implementation:
dchengb03027d2014-10-21 12:00:205417 void OnReceivedRedirect(URLRequest* request,
5418 const RedirectInfo& redirect_info,
5419 bool* defer_redirect) override {
[email protected]abe1c4a2013-10-25 19:28:515420 *defer_redirect = true;
5421 AsyncDelegateLogger::Run(
5422 request,
5423 LOAD_STATE_WAITING_FOR_DELEGATE,
5424 LOAD_STATE_WAITING_FOR_DELEGATE,
5425 LOAD_STATE_WAITING_FOR_DELEGATE,
5426 base::Bind(
5427 &AsyncLoggingUrlRequestDelegate::OnReceivedRedirectLoggingComplete,
[email protected]cba24642014-08-15 20:49:595428 base::Unretained(this), request, redirect_info));
[email protected]abe1c4a2013-10-25 19:28:515429 }
5430
maksim.sisov0f4aa142016-09-05 05:55:285431 void OnResponseStarted(URLRequest* request, int net_error) override {
[email protected]abe1c4a2013-10-25 19:28:515432 AsyncDelegateLogger::Run(
maksim.sisov0f4aa142016-09-05 05:55:285433 request, LOAD_STATE_WAITING_FOR_DELEGATE,
5434 LOAD_STATE_WAITING_FOR_DELEGATE, LOAD_STATE_WAITING_FOR_DELEGATE,
5435 base::Bind(
5436 &AsyncLoggingUrlRequestDelegate::OnResponseStartedLoggingComplete,
5437 base::Unretained(this), request, net_error));
[email protected]abe1c4a2013-10-25 19:28:515438 }
5439
dchengb03027d2014-10-21 12:00:205440 void OnReadCompleted(URLRequest* request, int bytes_read) override {
[email protected]abe1c4a2013-10-25 19:28:515441 AsyncDelegateLogger::Run(
5442 request,
5443 LOAD_STATE_IDLE,
5444 LOAD_STATE_IDLE,
5445 LOAD_STATE_IDLE,
5446 base::Bind(
5447 &AsyncLoggingUrlRequestDelegate::AfterReadCompletedLoggingComplete,
5448 base::Unretained(this), request, bytes_read));
5449 }
5450
5451 private:
5452 void OnReceivedRedirectLoggingComplete(URLRequest* request,
[email protected]cba24642014-08-15 20:49:595453 const RedirectInfo& redirect_info) {
[email protected]abe1c4a2013-10-25 19:28:515454 bool defer_redirect = false;
[email protected]cba24642014-08-15 20:49:595455 TestDelegate::OnReceivedRedirect(request, redirect_info, &defer_redirect);
[email protected]abe1c4a2013-10-25 19:28:515456 // FollowDeferredRedirect should not be called after cancellation.
5457 if (cancel_stage_ == CANCEL_ON_RECEIVED_REDIRECT)
5458 return;
5459 if (!defer_redirect)
5460 request->FollowDeferredRedirect();
5461 }
5462
maksim.sisov0f4aa142016-09-05 05:55:285463 void OnResponseStartedLoggingComplete(URLRequest* request, int net_error) {
[email protected]abe1c4a2013-10-25 19:28:515464 // The parent class continues the request.
maksim.sisov0f4aa142016-09-05 05:55:285465 TestDelegate::OnResponseStarted(request, net_error);
[email protected]abe1c4a2013-10-25 19:28:515466 }
5467
5468 void AfterReadCompletedLoggingComplete(URLRequest* request, int bytes_read) {
5469 // The parent class continues the request.
5470 TestDelegate::OnReadCompleted(request, bytes_read);
5471 }
5472
5473 const CancelStage cancel_stage_;
5474
5475 DISALLOW_COPY_AND_ASSIGN(AsyncLoggingUrlRequestDelegate);
5476};
5477
5478// Tests handling of delegate info before a request starts.
5479TEST_F(URLRequestTestHTTP, DelegateInfoBeforeStart) {
tommycli59a63432015-11-06 00:10:555480 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515481
5482 TestDelegate request_delegate;
5483 TestURLRequestContext context(true);
5484 context.set_network_delegate(NULL);
5485 context.set_net_log(&net_log_);
5486 context.Init();
5487
5488 {
rhalavatib7bd7c792017-04-27 05:25:165489 std::unique_ptr<URLRequest> r(context.CreateRequest(
5490 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY,
5491 &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195492 LoadStateWithParam load_state = r->GetLoadState();
[email protected]abe1c4a2013-10-25 19:28:515493 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state);
[email protected]754bd202013-12-18 08:29:085494 EXPECT_EQ(base::string16(), load_state.param);
[email protected]abe1c4a2013-10-25 19:28:515495
5496 AsyncDelegateLogger::Run(
[email protected]f7022f32014-08-21 16:32:195497 r.get(),
[email protected]abe1c4a2013-10-25 19:28:515498 LOAD_STATE_WAITING_FOR_DELEGATE,
5499 LOAD_STATE_WAITING_FOR_DELEGATE,
5500 LOAD_STATE_IDLE,
[email protected]f7022f32014-08-21 16:32:195501 base::Bind(&URLRequest::Start, base::Unretained(r.get())));
[email protected]abe1c4a2013-10-25 19:28:515502
5503 base::RunLoop().Run();
5504
[email protected]f7022f32014-08-21 16:32:195505 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505506 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515507 }
5508
mmenke43758e62015-05-04 21:09:465509 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515510 net_log_.GetEntries(&entries);
5511 size_t log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005512 entries, 0, NetLogEventType::DELEGATE_INFO, NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515513
5514 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries, log_position);
5515
5516 // Nothing else should add any delegate info to the request.
mikecirone8b85c432016-09-08 19:11:005517 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5518 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515519}
5520
5521// Tests handling of delegate info from a network delegate.
5522TEST_F(URLRequestTestHTTP, NetworkDelegateInfo) {
tommycli59a63432015-11-06 00:10:555523 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515524
5525 TestDelegate request_delegate;
5526 AsyncLoggingNetworkDelegate network_delegate;
5527 TestURLRequestContext context(true);
5528 context.set_network_delegate(&network_delegate);
5529 context.set_net_log(&net_log_);
5530 context.Init();
5531
5532 {
rhalavatib7bd7c792017-04-27 05:25:165533 std::unique_ptr<URLRequest> r(context.CreateRequest(
5534 http_test_server()->GetURL("/simple.html"), DEFAULT_PRIORITY,
5535 &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195536 LoadStateWithParam load_state = r->GetLoadState();
[email protected]abe1c4a2013-10-25 19:28:515537 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state);
[email protected]754bd202013-12-18 08:29:085538 EXPECT_EQ(base::string16(), load_state.param);
[email protected]abe1c4a2013-10-25 19:28:515539
[email protected]f7022f32014-08-21 16:32:195540 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515541 base::RunLoop().Run();
5542
[email protected]f7022f32014-08-21 16:32:195543 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505544 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515545 EXPECT_EQ(1, network_delegate.created_requests());
5546 EXPECT_EQ(0, network_delegate.destroyed_requests());
5547 }
5548 EXPECT_EQ(1, network_delegate.destroyed_requests());
5549
5550 size_t log_position = 0;
mmenke43758e62015-05-04 21:09:465551 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515552 net_log_.GetEntries(&entries);
5553 for (size_t i = 0; i < 3; ++i) {
5554 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005555 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5556 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515557
5558 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5559 log_position + 1);
5560
5561 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005562 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5563 entries[log_position].type);
5564 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515565 }
5566
mikecirone8b85c432016-09-08 19:11:005567 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5568 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515569}
5570
5571// Tests handling of delegate info from a network delegate in the case of an
5572// HTTP redirect.
5573TEST_F(URLRequestTestHTTP, NetworkDelegateInfoRedirect) {
tommycli59a63432015-11-06 00:10:555574 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515575
5576 TestDelegate request_delegate;
5577 AsyncLoggingNetworkDelegate network_delegate;
5578 TestURLRequestContext context(true);
5579 context.set_network_delegate(&network_delegate);
5580 context.set_net_log(&net_log_);
5581 context.Init();
5582
5583 {
danakj8522a25b2016-04-16 00:17:365584 std::unique_ptr<URLRequest> r(context.CreateRequest(
tommycli59a63432015-11-06 00:10:555585 http_test_server()->GetURL("/server-redirect?simple.html"),
rhalavatib7bd7c792017-04-27 05:25:165586 DEFAULT_PRIORITY, &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195587 LoadStateWithParam load_state = r->GetLoadState();
[email protected]abe1c4a2013-10-25 19:28:515588 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state);
[email protected]754bd202013-12-18 08:29:085589 EXPECT_EQ(base::string16(), load_state.param);
[email protected]abe1c4a2013-10-25 19:28:515590
[email protected]f7022f32014-08-21 16:32:195591 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515592 base::RunLoop().Run();
5593
[email protected]f7022f32014-08-21 16:32:195594 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505595 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515596 EXPECT_EQ(2, network_delegate.created_requests());
5597 EXPECT_EQ(0, network_delegate.destroyed_requests());
5598 }
5599 EXPECT_EQ(1, network_delegate.destroyed_requests());
5600
5601 size_t log_position = 0;
mmenke43758e62015-05-04 21:09:465602 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515603 net_log_.GetEntries(&entries);
5604 // The NetworkDelegate logged information in OnBeforeURLRequest,
ryansturm2343cb62016-06-15 01:09:005605 // OnBeforeStartTransaction, and OnHeadersReceived.
[email protected]abe1c4a2013-10-25 19:28:515606 for (size_t i = 0; i < 3; ++i) {
5607 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005608 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5609 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515610
5611 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5612 log_position + 1);
5613
5614 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005615 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5616 entries[log_position].type);
5617 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515618 }
5619
5620 // The URLRequest::Delegate then gets informed about the redirect.
5621 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005622 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5623 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515624
5625 // The NetworkDelegate logged information in the same three events as before.
5626 for (size_t i = 0; i < 3; ++i) {
5627 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005628 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5629 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515630
5631 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5632 log_position + 1);
5633
5634 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005635 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5636 entries[log_position].type);
5637 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515638 }
5639
mikecirone8b85c432016-09-08 19:11:005640 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5641 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515642}
5643
5644// Tests handling of delegate info from a network delegate in the case of HTTP
5645// AUTH.
5646TEST_F(URLRequestTestHTTP, NetworkDelegateInfoAuth) {
tommycli59a63432015-11-06 00:10:555647 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515648
5649 TestDelegate request_delegate;
5650 AsyncLoggingNetworkDelegate network_delegate;
5651 TestURLRequestContext context(true);
5652 context.set_network_delegate(&network_delegate);
5653 context.set_net_log(&net_log_);
5654 context.Init();
5655
5656 {
rhalavatib7bd7c792017-04-27 05:25:165657 std::unique_ptr<URLRequest> r(context.CreateRequest(
5658 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY,
5659 &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195660 LoadStateWithParam load_state = r->GetLoadState();
[email protected]abe1c4a2013-10-25 19:28:515661 EXPECT_EQ(LOAD_STATE_IDLE, load_state.state);
[email protected]754bd202013-12-18 08:29:085662 EXPECT_EQ(base::string16(), load_state.param);
[email protected]abe1c4a2013-10-25 19:28:515663
[email protected]f7022f32014-08-21 16:32:195664 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515665 base::RunLoop().Run();
5666
[email protected]f7022f32014-08-21 16:32:195667 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505668 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515669 EXPECT_EQ(1, network_delegate.created_requests());
5670 EXPECT_EQ(0, network_delegate.destroyed_requests());
5671 }
5672 EXPECT_EQ(1, network_delegate.destroyed_requests());
5673
5674 size_t log_position = 0;
mmenke43758e62015-05-04 21:09:465675 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515676 net_log_.GetEntries(&entries);
5677 // The NetworkDelegate should have logged information in OnBeforeURLRequest,
ryansturm2343cb62016-06-15 01:09:005678 // OnBeforeStartTransaction, OnHeadersReceived, OnAuthRequired, and then again
5679 // in
5680 // OnBeforeURLRequest and OnBeforeStartTransaction.
[email protected]abe1c4a2013-10-25 19:28:515681 for (size_t i = 0; i < 6; ++i) {
5682 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005683 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5684 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515685
5686 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5687 log_position + 1);
5688
5689 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005690 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5691 entries[log_position].type);
5692 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515693 }
5694
mikecirone8b85c432016-09-08 19:11:005695 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5696 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515697}
5698
tommycli59a63432015-11-06 00:10:555699// TODO(svaldez): Update tests to use EmbeddedTestServer.
5700#if !defined(OS_IOS)
[email protected]abe1c4a2013-10-25 19:28:515701// Tests handling of delegate info from a URLRequest::Delegate.
5702TEST_F(URLRequestTestHTTP, URLRequestDelegateInfo) {
tommycli59a63432015-11-06 00:10:555703 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTP,
tommycli59a63432015-11-06 00:10:555704 base::FilePath(kTestFilePath));
5705
5706 ASSERT_TRUE(test_server.Start());
[email protected]abe1c4a2013-10-25 19:28:515707
5708 AsyncLoggingUrlRequestDelegate request_delegate(
5709 AsyncLoggingUrlRequestDelegate::NO_CANCEL);
5710 TestURLRequestContext context(true);
5711 context.set_network_delegate(NULL);
5712 context.set_net_log(&net_log_);
5713 context.Init();
5714
5715 {
5716 // A chunked response with delays between chunks is used to make sure that
5717 // attempts by the URLRequest delegate to log information while reading the
5718 // body are ignored. Since they are ignored, this test is robust against
[email protected]1826a402014-01-08 15:40:485719 // the possibility of multiple reads being combined in the unlikely event
[email protected]abe1c4a2013-10-25 19:28:515720 // that it occurs.
danakj8522a25b2016-04-16 00:17:365721 std::unique_ptr<URLRequest> r(context.CreateRequest(
tommycli59a63432015-11-06 00:10:555722 test_server.GetURL("/chunked?waitBetweenChunks=20"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:165723 &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195724 LoadStateWithParam load_state = r->GetLoadState();
5725 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515726 base::RunLoop().Run();
5727
[email protected]f7022f32014-08-21 16:32:195728 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505729 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515730 }
5731
mmenke43758e62015-05-04 21:09:465732 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515733 net_log_.GetEntries(&entries);
5734
[email protected]1826a402014-01-08 15:40:485735 size_t log_position = 0;
5736
[email protected]abe1c4a2013-10-25 19:28:515737 // The delegate info should only have been logged on header complete. Other
5738 // times it should silently be ignored.
mikecirone8b85c432016-09-08 19:11:005739 log_position = ExpectLogContainsSomewhereAfter(
5740 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE,
5741 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515742
5743 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5744 log_position + 1);
5745
5746 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005747 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE, entries[log_position].type);
5748 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515749
mikecirone8b85c432016-09-08 19:11:005750 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5751 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515752 EXPECT_FALSE(LogContainsEntryWithTypeAfter(
mikecirone8b85c432016-09-08 19:11:005753 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE));
[email protected]abe1c4a2013-10-25 19:28:515754}
tommycli59a63432015-11-06 00:10:555755#endif // !defined(OS_IOS)
[email protected]abe1c4a2013-10-25 19:28:515756
5757// Tests handling of delegate info from a URLRequest::Delegate in the case of
5758// an HTTP redirect.
5759TEST_F(URLRequestTestHTTP, URLRequestDelegateInfoOnRedirect) {
tommycli59a63432015-11-06 00:10:555760 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515761
5762 AsyncLoggingUrlRequestDelegate request_delegate(
5763 AsyncLoggingUrlRequestDelegate::NO_CANCEL);
5764 TestURLRequestContext context(true);
5765 context.set_network_delegate(NULL);
5766 context.set_net_log(&net_log_);
5767 context.Init();
5768
5769 {
danakj8522a25b2016-04-16 00:17:365770 std::unique_ptr<URLRequest> r(context.CreateRequest(
tommycli59a63432015-11-06 00:10:555771 http_test_server()->GetURL("/server-redirect?simple.html"),
rhalavatib7bd7c792017-04-27 05:25:165772 DEFAULT_PRIORITY, &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195773 LoadStateWithParam load_state = r->GetLoadState();
5774 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515775 base::RunLoop().Run();
5776
[email protected]f7022f32014-08-21 16:32:195777 EXPECT_EQ(200, r->GetResponseCode());
maksim.sisovb53724b52016-09-16 05:30:505778 EXPECT_EQ(OK, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515779 }
5780
mmenke43758e62015-05-04 21:09:465781 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515782 net_log_.GetEntries(&entries);
5783
5784 // Delegate info should only have been logged in OnReceivedRedirect and
5785 // OnResponseStarted.
5786 size_t log_position = 0;
5787 for (int i = 0; i < 2; ++i) {
5788 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005789 entries, log_position, NetLogEventType::URL_REQUEST_DELEGATE,
5790 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515791
5792 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5793 log_position + 1);
5794
5795 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005796 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5797 entries[log_position].type);
5798 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515799 }
5800
mikecirone8b85c432016-09-08 19:11:005801 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5802 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515803 EXPECT_FALSE(LogContainsEntryWithTypeAfter(
mikecirone8b85c432016-09-08 19:11:005804 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE));
[email protected]abe1c4a2013-10-25 19:28:515805}
5806
5807// Tests handling of delegate info from a URLRequest::Delegate in the case of
5808// an HTTP redirect, with cancellation at various points.
5809TEST_F(URLRequestTestHTTP, URLRequestDelegateOnRedirectCancelled) {
tommycli59a63432015-11-06 00:10:555810 ASSERT_TRUE(http_test_server()->Start());
[email protected]abe1c4a2013-10-25 19:28:515811
5812 const AsyncLoggingUrlRequestDelegate::CancelStage kCancelStages[] = {
5813 AsyncLoggingUrlRequestDelegate::CANCEL_ON_RECEIVED_REDIRECT,
5814 AsyncLoggingUrlRequestDelegate::CANCEL_ON_RESPONSE_STARTED,
5815 AsyncLoggingUrlRequestDelegate::CANCEL_ON_READ_COMPLETED,
5816 };
5817
5818 for (size_t test_case = 0; test_case < arraysize(kCancelStages);
5819 ++test_case) {
5820 AsyncLoggingUrlRequestDelegate request_delegate(kCancelStages[test_case]);
vishal.b62985ca92015-04-17 08:45:515821 TestNetLog net_log;
krasin0bfeb6b2017-01-13 21:48:045822 TestURLRequestContext context(true);
[email protected]abe1c4a2013-10-25 19:28:515823 context.set_network_delegate(NULL);
5824 context.set_net_log(&net_log);
5825 context.Init();
5826
5827 {
danakj8522a25b2016-04-16 00:17:365828 std::unique_ptr<URLRequest> r(context.CreateRequest(
tommycli59a63432015-11-06 00:10:555829 http_test_server()->GetURL("/server-redirect?simple.html"),
rhalavatib7bd7c792017-04-27 05:25:165830 DEFAULT_PRIORITY, &request_delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195831 LoadStateWithParam load_state = r->GetLoadState();
5832 r->Start();
[email protected]abe1c4a2013-10-25 19:28:515833 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:505834 EXPECT_EQ(ERR_ABORTED, request_delegate.request_status());
[email protected]abe1c4a2013-10-25 19:28:515835 }
5836
mmenke43758e62015-05-04 21:09:465837 TestNetLogEntry::List entries;
[email protected]abe1c4a2013-10-25 19:28:515838 net_log.GetEntries(&entries);
5839
5840 // Delegate info is always logged in both OnReceivedRedirect and
5841 // OnResponseStarted. In the CANCEL_ON_RECEIVED_REDIRECT, the
5842 // OnResponseStarted delegate call is after cancellation, but logging is
5843 // still currently supported in that call.
5844 size_t log_position = 0;
5845 for (int i = 0; i < 2; ++i) {
5846 log_position = ExpectLogContainsSomewhereAfter(
mikecirone8b85c432016-09-08 19:11:005847 entries, log_position, NetLogEventType::URL_REQUEST_DELEGATE,
5848 NetLogEventPhase::BEGIN);
[email protected]abe1c4a2013-10-25 19:28:515849
5850 log_position = AsyncDelegateLogger::CheckDelegateInfo(entries,
5851 log_position + 1);
5852
5853 ASSERT_LT(log_position, entries.size());
mikecirone8b85c432016-09-08 19:11:005854 EXPECT_EQ(NetLogEventType::URL_REQUEST_DELEGATE,
5855 entries[log_position].type);
5856 EXPECT_EQ(NetLogEventPhase::END, entries[log_position].phase);
[email protected]abe1c4a2013-10-25 19:28:515857 }
5858
mikecirone8b85c432016-09-08 19:11:005859 EXPECT_FALSE(LogContainsEntryWithTypeAfter(entries, log_position + 1,
5860 NetLogEventType::DELEGATE_INFO));
[email protected]abe1c4a2013-10-25 19:28:515861 EXPECT_FALSE(LogContainsEntryWithTypeAfter(
mikecirone8b85c432016-09-08 19:11:005862 entries, log_position + 1, NetLogEventType::URL_REQUEST_DELEGATE));
[email protected]abe1c4a2013-10-25 19:28:515863 }
5864}
5865
[email protected]847c0fa92012-11-06 16:37:425866namespace {
5867
5868const char kExtraHeader[] = "Allow-Snafu";
5869const char kExtraValue[] = "fubar";
5870
5871class RedirectWithAdditionalHeadersDelegate : public TestDelegate {
dchengb03027d2014-10-21 12:00:205872 void OnReceivedRedirect(URLRequest* request,
5873 const RedirectInfo& redirect_info,
5874 bool* defer_redirect) override {
[email protected]cba24642014-08-15 20:49:595875 TestDelegate::OnReceivedRedirect(request, redirect_info, defer_redirect);
[email protected]847c0fa92012-11-06 16:37:425876 request->SetExtraRequestHeaderByName(kExtraHeader, kExtraValue, false);
5877 }
5878};
5879
5880} // namespace
5881
5882TEST_F(URLRequestTestHTTP, RedirectWithAdditionalHeadersTest) {
tommycli59a63432015-11-06 00:10:555883 ASSERT_TRUE(http_test_server()->Start());
[email protected]847c0fa92012-11-06 16:37:425884
tommycli59a63432015-11-06 00:10:555885 GURL destination_url =
5886 http_test_server()->GetURL("/echoheader?" + std::string(kExtraHeader));
5887 GURL original_url =
5888 http_test_server()->GetURL("/server-redirect?" + destination_url.spec());
[email protected]847c0fa92012-11-06 16:37:425889 RedirectWithAdditionalHeadersDelegate d;
rhalavatib7bd7c792017-04-27 05:25:165890 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
5891 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195892 req->Start();
[email protected]255620da2013-08-19 13:14:295893 base::RunLoop().Run();
[email protected]847c0fa92012-11-06 16:37:425894
5895 std::string value;
[email protected]f7022f32014-08-21 16:32:195896 const HttpRequestHeaders& headers = req->extra_request_headers();
[email protected]847c0fa92012-11-06 16:37:425897 EXPECT_TRUE(headers.GetHeader(kExtraHeader, &value));
5898 EXPECT_EQ(kExtraValue, value);
[email protected]f7022f32014-08-21 16:32:195899 EXPECT_FALSE(req->is_pending());
5900 EXPECT_FALSE(req->is_redirecting());
[email protected]847c0fa92012-11-06 16:37:425901 EXPECT_EQ(kExtraValue, d.data_received());
5902}
5903
[email protected]251a1b92012-11-13 11:01:095904namespace {
5905
5906const char kExtraHeaderToRemove[] = "To-Be-Removed";
5907
5908class RedirectWithHeaderRemovalDelegate : public TestDelegate {
dchengb03027d2014-10-21 12:00:205909 void OnReceivedRedirect(URLRequest* request,
5910 const RedirectInfo& redirect_info,
5911 bool* defer_redirect) override {
[email protected]cba24642014-08-15 20:49:595912 TestDelegate::OnReceivedRedirect(request, redirect_info, defer_redirect);
[email protected]251a1b92012-11-13 11:01:095913 request->RemoveRequestHeaderByName(kExtraHeaderToRemove);
5914 }
5915};
5916
5917} // namespace
5918
5919TEST_F(URLRequestTestHTTP, RedirectWithHeaderRemovalTest) {
tommycli59a63432015-11-06 00:10:555920 ASSERT_TRUE(http_test_server()->Start());
[email protected]251a1b92012-11-13 11:01:095921
tommycli59a63432015-11-06 00:10:555922 GURL destination_url = http_test_server()->GetURL(
5923 "/echoheader?" + std::string(kExtraHeaderToRemove));
5924 GURL original_url =
5925 http_test_server()->GetURL("/server-redirect?" + destination_url.spec());
[email protected]251a1b92012-11-13 11:01:095926 RedirectWithHeaderRemovalDelegate d;
rhalavatib7bd7c792017-04-27 05:25:165927 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
5928 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:195929 req->SetExtraRequestHeaderByName(kExtraHeaderToRemove, "dummy", false);
5930 req->Start();
[email protected]255620da2013-08-19 13:14:295931 base::RunLoop().Run();
[email protected]251a1b92012-11-13 11:01:095932
5933 std::string value;
[email protected]f7022f32014-08-21 16:32:195934 const HttpRequestHeaders& headers = req->extra_request_headers();
[email protected]251a1b92012-11-13 11:01:095935 EXPECT_FALSE(headers.GetHeader(kExtraHeaderToRemove, &value));
[email protected]f7022f32014-08-21 16:32:195936 EXPECT_FALSE(req->is_pending());
5937 EXPECT_FALSE(req->is_redirecting());
[email protected]251a1b92012-11-13 11:01:095938 EXPECT_EQ("None", d.data_received());
5939}
5940
mmenke94f1bd92016-12-07 21:13:055941TEST_F(URLRequestTestHTTP, CancelAfterStart) {
[email protected]316c1e5e2012-09-12 15:17:445942 TestDelegate d;
5943 {
danakj8522a25b2016-04-16 00:17:365944 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:165945 GURL("http://www.google.com/"), DEFAULT_PRIORITY, &d,
5946 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:445947
[email protected]f7022f32014-08-21 16:32:195948 r->Start();
5949 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:445950
[email protected]f7022f32014-08-21 16:32:195951 r->Cancel();
[email protected]316c1e5e2012-09-12 15:17:445952
[email protected]255620da2013-08-19 13:14:295953 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:445954
5955 // We expect to receive OnResponseStarted even though the request has been
5956 // cancelled.
5957 EXPECT_EQ(1, d.response_started_count());
5958 EXPECT_EQ(0, d.bytes_received());
5959 EXPECT_FALSE(d.received_data_before_response());
5960 }
5961}
5962
mmenke94f1bd92016-12-07 21:13:055963TEST_F(URLRequestTestHTTP, CancelInResponseStarted) {
tommycli59a63432015-11-06 00:10:555964 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:445965
5966 TestDelegate d;
5967 {
danakj8522a25b2016-04-16 00:17:365968 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:165969 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d,
5970 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:445971
5972 d.set_cancel_in_response_started(true);
5973
[email protected]f7022f32014-08-21 16:32:195974 r->Start();
5975 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:445976
[email protected]255620da2013-08-19 13:14:295977 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:445978
5979 EXPECT_EQ(1, d.response_started_count());
5980 EXPECT_EQ(0, d.bytes_received());
5981 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:505982 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:445983 }
5984}
5985
mmenke94f1bd92016-12-07 21:13:055986TEST_F(URLRequestTestHTTP, CancelOnDataReceived) {
tommycli59a63432015-11-06 00:10:555987 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:445988
5989 TestDelegate d;
5990 {
danakj8522a25b2016-04-16 00:17:365991 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:165992 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
5993 TRAFFIC_ANNOTATION_FOR_TESTS));
mmenke94f1bd92016-12-07 21:13:055994
5995 d.set_cancel_in_received_data(true);
5996
5997 r->Start();
5998 EXPECT_TRUE(r->is_pending());
5999
6000 base::RunLoop().Run();
6001
6002 EXPECT_EQ(1, d.response_started_count());
6003 EXPECT_NE(0, d.received_bytes_count());
6004 EXPECT_FALSE(d.received_data_before_response());
6005 EXPECT_EQ(ERR_ABORTED, d.request_status());
6006 }
6007}
6008
6009TEST_F(URLRequestTestHTTP, CancelDuringEofRead) {
6010 ASSERT_TRUE(http_test_server()->Start());
6011
6012 TestDelegate d;
6013 {
6014 // This returns an empty response (With headers).
6015 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166016 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d,
6017 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:446018
6019 d.set_cancel_in_received_data(true);
6020
[email protected]f7022f32014-08-21 16:32:196021 r->Start();
6022 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446023
[email protected]255620da2013-08-19 13:14:296024 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446025
6026 EXPECT_EQ(1, d.response_started_count());
mmenke94f1bd92016-12-07 21:13:056027 EXPECT_EQ(0, d.received_bytes_count());
[email protected]316c1e5e2012-09-12 15:17:446028 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:506029 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:446030 }
6031}
6032
mmenke94f1bd92016-12-07 21:13:056033TEST_F(URLRequestTestHTTP, CancelByDestroyingAfterStart) {
tommycli59a63432015-11-06 00:10:556034 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446035
6036 TestDelegate d;
6037 {
danakj8522a25b2016-04-16 00:17:366038 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166039 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d,
6040 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:446041
[email protected]f7022f32014-08-21 16:32:196042 r->Start();
6043 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446044
6045 // The request will be implicitly canceled when it is destroyed. The
6046 // test delegate must not post a quit message when this happens because
6047 // this test doesn't actually have a message loop. The quit message would
6048 // get put on this thread's message queue and the next test would exit
6049 // early, causing problems.
6050 d.set_quit_on_complete(false);
6051 }
6052 // expect things to just cleanup properly.
6053
kimwjdalsl2bb4ff02015-12-16 22:06:026054 // we won't actually get a received response here because we've never run the
[email protected]316c1e5e2012-09-12 15:17:446055 // message loop
6056 EXPECT_FALSE(d.received_data_before_response());
6057 EXPECT_EQ(0, d.bytes_received());
6058}
6059
mmenke94f1bd92016-12-07 21:13:056060TEST_F(URLRequestTestHTTP, CancelWhileReadingFromCache) {
tommycli59a63432015-11-06 00:10:556061 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446062
6063 // populate cache
6064 {
6065 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366066 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166067 http_test_server()->GetURL("/cachetime"), DEFAULT_PRIORITY, &d,
6068 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196069 r->Start();
[email protected]255620da2013-08-19 13:14:296070 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:506071 EXPECT_EQ(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:446072 }
6073
6074 // cancel read from cache (see bug 990242)
6075 {
6076 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366077 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166078 http_test_server()->GetURL("/cachetime"), DEFAULT_PRIORITY, &d,
6079 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196080 r->Start();
6081 r->Cancel();
[email protected]255620da2013-08-19 13:14:296082 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446083
maksim.sisovb53724b52016-09-16 05:30:506084 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:446085 EXPECT_EQ(1, d.response_started_count());
6086 EXPECT_EQ(0, d.bytes_received());
6087 EXPECT_FALSE(d.received_data_before_response());
6088 }
6089}
6090
6091TEST_F(URLRequestTestHTTP, PostTest) {
tommycli59a63432015-11-06 00:10:556092 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446093 HTTPUploadDataOperationTest("POST");
6094}
6095
6096TEST_F(URLRequestTestHTTP, PutTest) {
tommycli59a63432015-11-06 00:10:556097 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446098 HTTPUploadDataOperationTest("PUT");
6099}
6100
6101TEST_F(URLRequestTestHTTP, PostEmptyTest) {
tommycli59a63432015-11-06 00:10:556102 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446103
6104 TestDelegate d;
6105 {
danakj8522a25b2016-04-16 00:17:366106 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166107 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6108 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196109 r->set_method("POST");
[email protected]316c1e5e2012-09-12 15:17:446110
[email protected]f7022f32014-08-21 16:32:196111 r->Start();
6112 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446113
[email protected]255620da2013-08-19 13:14:296114 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446115
maksim.sisovb53724b52016-09-16 05:30:506116 ASSERT_EQ(1, d.response_started_count()) << "request failed. Error: "
6117 << d.request_status();
[email protected]316c1e5e2012-09-12 15:17:446118
6119 EXPECT_FALSE(d.received_data_before_response());
6120 EXPECT_TRUE(d.data_received().empty());
6121 }
6122}
6123
6124TEST_F(URLRequestTestHTTP, PostFileTest) {
tommycli59a63432015-11-06 00:10:556125 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446126
6127 TestDelegate d;
6128 {
danakj8522a25b2016-04-16 00:17:366129 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166130 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6131 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196132 r->set_method("POST");
[email protected]316c1e5e2012-09-12 15:17:446133
[email protected]6cdfd7f2013-02-08 20:40:156134 base::FilePath dir;
[email protected]316c1e5e2012-09-12 15:17:446135 PathService::Get(base::DIR_EXE, &dir);
[email protected]37b3c1992014-03-11 20:59:026136 base::SetCurrentDirectory(dir);
[email protected]316c1e5e2012-09-12 15:17:446137
danakj8522a25b2016-04-16 00:17:366138 std::vector<std::unique_ptr<UploadElementReader>> element_readers;
[email protected]316c1e5e2012-09-12 15:17:446139
[email protected]6cdfd7f2013-02-08 20:40:156140 base::FilePath path;
[email protected]316c1e5e2012-09-12 15:17:446141 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:476142 path = path.Append(kTestFilePath);
[email protected]316c1e5e2012-09-12 15:17:446143 path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
Jeremy Roman0579ed62017-08-29 15:56:196144 element_readers.push_back(std::make_unique<UploadFileElementReader>(
avibf0746c2015-12-09 19:53:146145 base::ThreadTaskRunnerHandle::Get().get(), path, 0,
ricea2deef682016-09-09 08:04:076146 std::numeric_limits<uint64_t>::max(), base::Time()));
Bence Béky8f9d7d3952017-10-09 19:58:046147 r->set_upload(std::make_unique<ElementsUploadDataStream>(
6148 std::move(element_readers), 0));
[email protected]316c1e5e2012-09-12 15:17:446149
[email protected]f7022f32014-08-21 16:32:196150 r->Start();
6151 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446152
[email protected]255620da2013-08-19 13:14:296153 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446154
avibf0746c2015-12-09 19:53:146155 int64_t size64 = 0;
pkasting6b68a162014-12-01 22:10:296156 ASSERT_EQ(true, base::GetFileSize(path, &size64));
6157 ASSERT_LE(size64, std::numeric_limits<int>::max());
6158 int size = static_cast<int>(size64);
danakj8522a25b2016-04-16 00:17:366159 std::unique_ptr<char[]> buf(new char[size]);
[email protected]316c1e5e2012-09-12 15:17:446160
[email protected]7600d0b2013-12-08 21:43:306161 ASSERT_EQ(size, base::ReadFile(path, buf.get(), size));
[email protected]316c1e5e2012-09-12 15:17:446162
maksim.sisovb53724b52016-09-16 05:30:506163 ASSERT_EQ(1, d.response_started_count()) << "request failed. Error: "
6164 << d.request_status();
[email protected]316c1e5e2012-09-12 15:17:446165
6166 EXPECT_FALSE(d.received_data_before_response());
6167
[email protected]329b68b2012-11-14 17:54:276168 EXPECT_EQ(size, d.bytes_received());
6169 EXPECT_EQ(std::string(&buf[0], size), d.data_received());
[email protected]316c1e5e2012-09-12 15:17:446170 }
6171}
6172
[email protected]999dd8c2013-11-12 06:45:546173TEST_F(URLRequestTestHTTP, PostUnreadableFileTest) {
tommycli59a63432015-11-06 00:10:556174 ASSERT_TRUE(http_test_server()->Start());
[email protected]999dd8c2013-11-12 06:45:546175
6176 TestDelegate d;
6177 {
danakj8522a25b2016-04-16 00:17:366178 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166179 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6180 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196181 r->set_method("POST");
[email protected]999dd8c2013-11-12 06:45:546182
danakj8522a25b2016-04-16 00:17:366183 std::vector<std::unique_ptr<UploadElementReader>> element_readers;
[email protected]999dd8c2013-11-12 06:45:546184
Jeremy Roman0579ed62017-08-29 15:56:196185 element_readers.push_back(std::make_unique<UploadFileElementReader>(
skyostil4891b25b2015-06-11 11:43:456186 base::ThreadTaskRunnerHandle::Get().get(),
[email protected]999dd8c2013-11-12 06:45:546187 base::FilePath(FILE_PATH_LITERAL(
6188 "c:\\path\\to\\non\\existant\\file.randomness.12345")),
ricea2deef682016-09-09 08:04:076189 0, std::numeric_limits<uint64_t>::max(), base::Time()));
Bence Béky8f9d7d3952017-10-09 19:58:046190 r->set_upload(std::make_unique<ElementsUploadDataStream>(
6191 std::move(element_readers), 0));
[email protected]999dd8c2013-11-12 06:45:546192
[email protected]f7022f32014-08-21 16:32:196193 r->Start();
6194 EXPECT_TRUE(r->is_pending());
[email protected]999dd8c2013-11-12 06:45:546195
6196 base::RunLoop().Run();
6197
[email protected]999dd8c2013-11-12 06:45:546198 EXPECT_TRUE(d.request_failed());
6199 EXPECT_FALSE(d.received_data_before_response());
6200 EXPECT_EQ(0, d.bytes_received());
maksim.sisovb53724b52016-09-16 05:30:506201 EXPECT_EQ(ERR_FILE_NOT_FOUND, d.request_status());
[email protected]999dd8c2013-11-12 06:45:546202 }
6203}
6204
mmenke56b0cbb912016-03-28 21:34:536205namespace {
6206
6207// Adds a standard set of data to an upload for chunked upload integration
6208// tests.
6209void AddDataToUpload(ChunkedUploadDataStream::Writer* writer) {
6210 writer->AppendData("a", 1, false);
6211 writer->AppendData("bcd", 3, false);
6212 writer->AppendData("this is a longer chunk than before.", 35, false);
6213 writer->AppendData("\r\n\r\n", 4, false);
6214 writer->AppendData("0", 1, false);
6215 writer->AppendData("2323", 4, true);
6216}
6217
6218// Checks that the upload data added in AddChunksToUpload() was echoed back from
6219// the server.
6220void VerifyReceivedDataMatchesChunks(URLRequest* r, TestDelegate* d) {
6221 // This should match the chunks sent by AddChunksToUpload().
6222 const std::string expected_data =
6223 "abcdthis is a longer chunk than before.\r\n\r\n02323";
6224
maksim.sisovb53724b52016-09-16 05:30:506225 ASSERT_EQ(1, d->response_started_count()) << "request failed. Error: "
6226 << d->request_status();
mmenke56b0cbb912016-03-28 21:34:536227
6228 EXPECT_FALSE(d->received_data_before_response());
6229
6230 EXPECT_EQ(expected_data.size(), static_cast<size_t>(d->bytes_received()));
6231 EXPECT_EQ(expected_data, d->data_received());
6232}
6233
6234} // namespace
6235
[email protected]316c1e5e2012-09-12 15:17:446236TEST_F(URLRequestTestHTTP, TestPostChunkedDataBeforeStart) {
tommycli59a63432015-11-06 00:10:556237 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446238
6239 TestDelegate d;
6240 {
danakj8522a25b2016-04-16 00:17:366241 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166242 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6243 TRAFFIC_ANNOTATION_FOR_TESTS));
danakj8522a25b2016-04-16 00:17:366244 std::unique_ptr<ChunkedUploadDataStream> upload_data_stream(
mmenke56b0cbb912016-03-28 21:34:536245 new ChunkedUploadDataStream(0));
danakj8522a25b2016-04-16 00:17:366246 std::unique_ptr<ChunkedUploadDataStream::Writer> writer =
mmenke56b0cbb912016-03-28 21:34:536247 upload_data_stream->CreateWriter();
6248 r->set_upload(std::move(upload_data_stream));
[email protected]f7022f32014-08-21 16:32:196249 r->set_method("POST");
mmenke56b0cbb912016-03-28 21:34:536250 AddDataToUpload(writer.get());
[email protected]f7022f32014-08-21 16:32:196251 r->Start();
6252 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446253
[email protected]255620da2013-08-19 13:14:296254 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446255
[email protected]f7022f32014-08-21 16:32:196256 VerifyReceivedDataMatchesChunks(r.get(), &d);
[email protected]316c1e5e2012-09-12 15:17:446257 }
6258}
6259
[email protected]329b68b2012-11-14 17:54:276260TEST_F(URLRequestTestHTTP, TestPostChunkedDataJustAfterStart) {
tommycli59a63432015-11-06 00:10:556261 ASSERT_TRUE(http_test_server()->Start());
[email protected]329b68b2012-11-14 17:54:276262
6263 TestDelegate d;
6264 {
danakj8522a25b2016-04-16 00:17:366265 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166266 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6267 TRAFFIC_ANNOTATION_FOR_TESTS));
danakj8522a25b2016-04-16 00:17:366268 std::unique_ptr<ChunkedUploadDataStream> upload_data_stream(
mmenke56b0cbb912016-03-28 21:34:536269 new ChunkedUploadDataStream(0));
danakj8522a25b2016-04-16 00:17:366270 std::unique_ptr<ChunkedUploadDataStream::Writer> writer =
mmenke56b0cbb912016-03-28 21:34:536271 upload_data_stream->CreateWriter();
Bence Béky8f9d7d3952017-10-09 19:58:046272 r->set_upload(std::move(upload_data_stream));
[email protected]f7022f32014-08-21 16:32:196273 r->set_method("POST");
6274 r->Start();
6275 EXPECT_TRUE(r->is_pending());
mmenke56b0cbb912016-03-28 21:34:536276 AddDataToUpload(writer.get());
[email protected]255620da2013-08-19 13:14:296277 base::RunLoop().Run();
[email protected]329b68b2012-11-14 17:54:276278
[email protected]f7022f32014-08-21 16:32:196279 VerifyReceivedDataMatchesChunks(r.get(), &d);
[email protected]329b68b2012-11-14 17:54:276280 }
6281}
6282
[email protected]316c1e5e2012-09-12 15:17:446283TEST_F(URLRequestTestHTTP, TestPostChunkedDataAfterStart) {
tommycli59a63432015-11-06 00:10:556284 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446285
6286 TestDelegate d;
6287 {
danakj8522a25b2016-04-16 00:17:366288 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166289 http_test_server()->GetURL("/echo"), DEFAULT_PRIORITY, &d,
6290 TRAFFIC_ANNOTATION_FOR_TESTS));
danakj8522a25b2016-04-16 00:17:366291 std::unique_ptr<ChunkedUploadDataStream> upload_data_stream(
mmenke56b0cbb912016-03-28 21:34:536292 new ChunkedUploadDataStream(0));
danakj8522a25b2016-04-16 00:17:366293 std::unique_ptr<ChunkedUploadDataStream::Writer> writer =
mmenke56b0cbb912016-03-28 21:34:536294 upload_data_stream->CreateWriter();
6295 r->set_upload(std::move(upload_data_stream));
[email protected]f7022f32014-08-21 16:32:196296 r->set_method("POST");
6297 r->Start();
6298 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:446299
[email protected]255620da2013-08-19 13:14:296300 base::RunLoop().RunUntilIdle();
mmenke56b0cbb912016-03-28 21:34:536301 AddDataToUpload(writer.get());
[email protected]255620da2013-08-19 13:14:296302 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446303
[email protected]f7022f32014-08-21 16:32:196304 VerifyReceivedDataMatchesChunks(r.get(), &d);
[email protected]316c1e5e2012-09-12 15:17:446305 }
6306}
6307
6308TEST_F(URLRequestTestHTTP, ResponseHeadersTest) {
tommycli59a63432015-11-06 00:10:556309 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:446310
6311 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366312 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166313 http_test_server()->GetURL("/with-headers.html"), DEFAULT_PRIORITY, &d,
6314 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196315 req->Start();
[email protected]255620da2013-08-19 13:14:296316 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:446317
[email protected]f7022f32014-08-21 16:32:196318 const HttpResponseHeaders* headers = req->response_headers();
[email protected]316c1e5e2012-09-12 15:17:446319
6320 // Simple sanity check that response_info() accesses the same data.
[email protected]f7022f32014-08-21 16:32:196321 EXPECT_EQ(headers, req->response_info().headers.get());
[email protected]316c1e5e2012-09-12 15:17:446322
6323 std::string header;
6324 EXPECT_TRUE(headers->GetNormalizedHeader("cache-control", &header));
6325 EXPECT_EQ("private", header);
6326
6327 header.clear();
6328 EXPECT_TRUE(headers->GetNormalizedHeader("content-type", &header));
6329 EXPECT_EQ("text/html; charset=ISO-8859-1", header);
6330
6331 // The response has two "X-Multiple-Entries" headers.
6332 // This verfies our output has them concatenated together.
6333 header.clear();
6334 EXPECT_TRUE(headers->GetNormalizedHeader("x-multiple-entries", &header));
6335 EXPECT_EQ("a, b", header);
6336}
6337
tommycli59a63432015-11-06 00:10:556338// TODO(svaldez): iOS tests are flaky with EmbeddedTestServer and transport
6339// security state. (see http://crbug.com/550977).
6340#if !defined(OS_IOS)
[email protected]242d8562012-10-30 21:20:466341TEST_F(URLRequestTestHTTP, ProcessSTS) {
tommycli59a63432015-11-06 00:10:556342 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6343 https_test_server.SetSSLConfig(
6344 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6345 https_test_server.ServeFilesFromSourceDirectory(
6346 base::FilePath(kTestFilePath));
[email protected]242d8562012-10-30 21:20:466347 ASSERT_TRUE(https_test_server.Start());
6348
tommycli59a63432015-11-06 00:10:556349 std::string test_server_hostname = https_test_server.GetURL("/").host();
[email protected]242d8562012-10-30 21:20:466350 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366351 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166352 https_test_server.GetURL("/hsts-headers.html"), DEFAULT_PRIORITY, &d,
6353 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196354 request->Start();
[email protected]255620da2013-08-19 13:14:296355 base::RunLoop().Run();
[email protected]242d8562012-10-30 21:20:466356
6357 TransportSecurityState* security_state =
6358 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406359 TransportSecurityState::STSState sts_state;
6360 TransportSecurityState::PKPState pkp_state;
6361 EXPECT_TRUE(
6362 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
6363 EXPECT_FALSE(
6364 security_state->GetDynamicPKPState(test_server_hostname, &pkp_state));
6365 EXPECT_EQ(TransportSecurityState::STSState::MODE_FORCE_HTTPS,
6366 sts_state.upgrade_mode);
6367 EXPECT_TRUE(sts_state.include_subdomains);
6368 EXPECT_FALSE(pkp_state.include_subdomains);
mathpc992e602015-10-21 20:34:036369#if defined(OS_ANDROID)
6370 // Android's CertVerifyProc does not (yet) handle pins.
6371#else
martijnc0d6b622015-06-30 19:14:406372 EXPECT_FALSE(pkp_state.HasPublicKeyPins());
mathpc992e602015-10-21 20:34:036373#endif
[email protected]37fd55fb2013-06-29 13:13:276374}
6375
estarka5da76702015-04-09 04:00:166376TEST_F(URLRequestTestHTTP, STSNotProcessedOnIP) {
tommycli59a63432015-11-06 00:10:556377 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6378 https_test_server.ServeFilesFromSourceDirectory(
6379 base::FilePath(kTestFilePath));
estarka5da76702015-04-09 04:00:166380 ASSERT_TRUE(https_test_server.Start());
6381 // Make sure this test fails if the test server is changed to not
6382 // listen on an IP by default.
tommycli59a63432015-11-06 00:10:556383 ASSERT_TRUE(https_test_server.GetURL("/").HostIsIPAddress());
6384 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166385
6386 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366387 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166388 https_test_server.GetURL("/hsts-headers.html"), DEFAULT_PRIORITY, &d,
6389 TRAFFIC_ANNOTATION_FOR_TESTS));
estarka5da76702015-04-09 04:00:166390 request->Start();
6391 base::RunLoop().Run();
estarka5da76702015-04-09 04:00:166392 TransportSecurityState* security_state =
6393 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406394 TransportSecurityState::STSState sts_state;
6395 EXPECT_FALSE(
6396 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
estarka5da76702015-04-09 04:00:166397}
6398
estark06e0dac2015-08-07 21:56:016399namespace {
Martijn Croonenb1383da2017-10-11 11:56:356400const char kExpectCTStaticHostname[] = "expect-ct.preloaded.test";
6401const char kExpectStapleStaticHostname[] = "expect-staple.preloaded.test";
6402const char kExpectStapleReportURI[] =
6403 "http://report-uri.preloaded.test/expect-staple";
estark06e0dac2015-08-07 21:56:016404const char kHPKPReportUri[] = "https://hpkp-report.test";
6405} // namespace
6406
[email protected]37fd55fb2013-06-29 13:13:276407// Tests that enabling HPKP on a domain does not affect the HSTS
6408// validity/expiration.
dadrian2faf2062016-07-16 00:03:176409TEST_F(URLRequestTestHTTP, ProcessPKP) {
estark06e0dac2015-08-07 21:56:016410 GURL report_uri(kHPKPReportUri);
tommycli59a63432015-11-06 00:10:556411 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6412 https_test_server.SetSSLConfig(
6413 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6414 https_test_server.ServeFilesFromSourceDirectory(
6415 base::FilePath(kTestFilePath));
[email protected]37fd55fb2013-06-29 13:13:276416 ASSERT_TRUE(https_test_server.Start());
6417
tommycli59a63432015-11-06 00:10:556418 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166419
[email protected]37fd55fb2013-06-29 13:13:276420 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366421 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166422 https_test_server.GetURL("/hpkp-headers.html"), DEFAULT_PRIORITY, &d,
6423 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196424 request->Start();
[email protected]255620da2013-08-19 13:14:296425 base::RunLoop().Run();
[email protected]37fd55fb2013-06-29 13:13:276426 TransportSecurityState* security_state =
6427 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406428 TransportSecurityState::STSState sts_state;
6429 TransportSecurityState::PKPState pkp_state;
6430 EXPECT_FALSE(
6431 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
6432 EXPECT_TRUE(
6433 security_state->GetDynamicPKPState(test_server_hostname, &pkp_state));
6434 EXPECT_EQ(TransportSecurityState::STSState::MODE_DEFAULT,
6435 sts_state.upgrade_mode);
6436 EXPECT_FALSE(sts_state.include_subdomains);
6437 EXPECT_FALSE(pkp_state.include_subdomains);
6438 EXPECT_TRUE(pkp_state.HasPublicKeyPins());
estark06e0dac2015-08-07 21:56:016439 EXPECT_EQ(report_uri, pkp_state.report_uri);
martijnc0d6b622015-06-30 19:14:406440 EXPECT_NE(sts_state.expiry, pkp_state.expiry);
[email protected]242d8562012-10-30 21:20:466441}
6442
estark06e0dac2015-08-07 21:56:016443// Tests that reports get sent on HPKP violations when a report-uri is set.
dadrian2faf2062016-07-16 00:03:176444TEST_F(URLRequestTestHTTP, ProcessPKPAndSendReport) {
estark06e0dac2015-08-07 21:56:016445 GURL report_uri(kHPKPReportUri);
tommycli59a63432015-11-06 00:10:556446 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6447 https_test_server.SetSSLConfig(
6448 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6449 https_test_server.ServeFilesFromSourceDirectory(
6450 base::FilePath(kTestFilePath));
estark06e0dac2015-08-07 21:56:016451 ASSERT_TRUE(https_test_server.Start());
6452
tommycli59a63432015-11-06 00:10:556453 std::string test_server_hostname = https_test_server.GetURL("/").host();
estark06e0dac2015-08-07 21:56:016454
6455 // Set up a pin for |test_server_hostname|.
6456 TransportSecurityState security_state;
6457 const base::Time current_time(base::Time::Now());
6458 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000);
6459 HashValueVector hashes;
6460 HashValue hash1;
6461 HashValue hash2;
6462 // The values here don't matter, as long as they are different from
6463 // the mocked CertVerifyResult below.
svaldez35d0dca2015-08-24 16:12:446464 ASSERT_TRUE(
6465 hash1.FromString("sha256/1111111111111111111111111111111111111111111="));
6466 ASSERT_TRUE(
6467 hash2.FromString("sha256/2222222222222222222222222222222222222222222="));
estark06e0dac2015-08-07 21:56:016468 hashes.push_back(hash1);
6469 hashes.push_back(hash2);
6470 security_state.AddHPKP(test_server_hostname, expiry,
6471 false, /* include subdomains */
6472 hashes, report_uri);
6473
6474 MockCertificateReportSender mock_report_sender;
6475 security_state.SetReportSender(&mock_report_sender);
6476
6477 // Set up a MockCertVerifier to trigger a violation of the previously
6478 // set pin.
6479 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6480 ASSERT_TRUE(cert);
6481
6482 MockCertVerifier cert_verifier;
6483 CertVerifyResult verify_result;
6484 verify_result.verified_cert = cert;
6485 verify_result.is_issued_by_known_root = true;
6486 HashValue hash3;
svaldez35d0dca2015-08-24 16:12:446487 ASSERT_TRUE(
6488 hash3.FromString("sha256/3333333333333333333333333333333333333333333="));
estark06e0dac2015-08-07 21:56:016489 verify_result.public_key_hashes.push_back(hash3);
6490 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6491
6492 TestNetworkDelegate network_delegate;
6493 TestURLRequestContext context(true);
6494 context.set_transport_security_state(&security_state);
6495 context.set_network_delegate(&network_delegate);
6496 context.set_cert_verifier(&cert_verifier);
6497 context.Init();
6498
6499 // Now send a request to trigger the violation.
6500 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366501 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166502 https_test_server.GetURL("/simple.html"), DEFAULT_PRIORITY, &d,
6503 TRAFFIC_ANNOTATION_FOR_TESTS));
estark06e0dac2015-08-07 21:56:016504 violating_request->Start();
6505 base::RunLoop().Run();
6506
6507 // Check that a report was sent.
6508 EXPECT_EQ(report_uri, mock_report_sender.latest_report_uri());
6509 ASSERT_FALSE(mock_report_sender.latest_report().empty());
estarkb1716e22016-09-28 06:03:446510 EXPECT_EQ("application/json; charset=utf-8",
6511 mock_report_sender.latest_content_type());
danakj8522a25b2016-04-16 00:17:366512 std::unique_ptr<base::Value> value(
estark06e0dac2015-08-07 21:56:016513 base::JSONReader::Read(mock_report_sender.latest_report()));
6514 ASSERT_TRUE(value);
jdoerriee48b26a2017-12-09 14:19:086515 ASSERT_TRUE(value->is_dict());
estark06e0dac2015-08-07 21:56:016516 base::DictionaryValue* report_dict;
6517 ASSERT_TRUE(value->GetAsDictionary(&report_dict));
6518 std::string report_hostname;
6519 EXPECT_TRUE(report_dict->GetString("hostname", &report_hostname));
6520 EXPECT_EQ(test_server_hostname, report_hostname);
6521}
6522
6523// Tests that reports get sent on requests with
6524// Public-Key-Pins-Report-Only headers.
dadrian2faf2062016-07-16 00:03:176525TEST_F(URLRequestTestHTTP, ProcessPKPReportOnly) {
estark06e0dac2015-08-07 21:56:016526 GURL report_uri(kHPKPReportUri);
tommycli59a63432015-11-06 00:10:556527 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6528 https_test_server.SetSSLConfig(
6529 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6530 https_test_server.ServeFilesFromSourceDirectory(
6531 base::FilePath(kTestFilePath));
estark06e0dac2015-08-07 21:56:016532 ASSERT_TRUE(https_test_server.Start());
6533
tommycli59a63432015-11-06 00:10:556534 std::string test_server_hostname = https_test_server.GetURL("/").host();
estark06e0dac2015-08-07 21:56:016535
6536 TransportSecurityState security_state;
6537 MockCertificateReportSender mock_report_sender;
6538 security_state.SetReportSender(&mock_report_sender);
6539
6540 // Set up a MockCertVerifier to violate the pin in the Report-Only
6541 // header.
6542 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6543 ASSERT_TRUE(cert);
6544
6545 MockCertVerifier cert_verifier;
6546 CertVerifyResult verify_result;
6547 verify_result.verified_cert = cert;
6548 verify_result.is_issued_by_known_root = true;
6549 HashValue hash;
6550 // This value doesn't matter, as long as it is different from the pins
6551 // for the request to hpkp-headers-report-only.html.
svaldez35d0dca2015-08-24 16:12:446552 ASSERT_TRUE(
6553 hash.FromString("sha256/1111111111111111111111111111111111111111111="));
estark06e0dac2015-08-07 21:56:016554 verify_result.public_key_hashes.push_back(hash);
6555 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6556
6557 TestNetworkDelegate network_delegate;
6558 TestURLRequestContext context(true);
6559 context.set_transport_security_state(&security_state);
6560 context.set_network_delegate(&network_delegate);
6561 context.set_cert_verifier(&cert_verifier);
6562 context.Init();
6563
6564 // Now send a request to trigger the violation.
6565 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366566 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
tommycli59a63432015-11-06 00:10:556567 https_test_server.GetURL("/hpkp-headers-report-only.html"),
rhalavatib7bd7c792017-04-27 05:25:166568 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark06e0dac2015-08-07 21:56:016569 violating_request->Start();
6570 base::RunLoop().Run();
6571
6572 // Check that a report was sent.
6573 EXPECT_EQ(report_uri, mock_report_sender.latest_report_uri());
6574 ASSERT_FALSE(mock_report_sender.latest_report().empty());
estarkb1716e22016-09-28 06:03:446575 EXPECT_EQ("application/json; charset=utf-8",
6576 mock_report_sender.latest_content_type());
danakj8522a25b2016-04-16 00:17:366577 std::unique_ptr<base::Value> value(
estark06e0dac2015-08-07 21:56:016578 base::JSONReader::Read(mock_report_sender.latest_report()));
6579 ASSERT_TRUE(value);
jdoerriee48b26a2017-12-09 14:19:086580 ASSERT_TRUE(value->is_dict());
estark06e0dac2015-08-07 21:56:016581 base::DictionaryValue* report_dict;
6582 ASSERT_TRUE(value->GetAsDictionary(&report_dict));
6583 std::string report_hostname;
6584 EXPECT_TRUE(report_dict->GetString("hostname", &report_hostname));
6585 EXPECT_EQ(test_server_hostname, report_hostname);
6586}
6587
6588// Tests that reports do not get sent on requests with
6589// Public-Key-Pins-Report-Only headers that don't have pin violations.
dadrian2faf2062016-07-16 00:03:176590TEST_F(URLRequestTestHTTP, ProcessPKPReportOnlyWithNoViolation) {
estark06e0dac2015-08-07 21:56:016591 GURL report_uri(kHPKPReportUri);
tommycli59a63432015-11-06 00:10:556592 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6593 https_test_server.SetSSLConfig(
6594 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6595 https_test_server.ServeFilesFromSourceDirectory(
6596 base::FilePath(kTestFilePath));
estark06e0dac2015-08-07 21:56:016597 ASSERT_TRUE(https_test_server.Start());
6598
tommycli59a63432015-11-06 00:10:556599 std::string test_server_hostname = https_test_server.GetURL("/").host();
estark06e0dac2015-08-07 21:56:016600
6601 TransportSecurityState security_state;
6602 MockCertificateReportSender mock_report_sender;
6603 security_state.SetReportSender(&mock_report_sender);
6604
6605 TestNetworkDelegate network_delegate;
6606 MockCertVerifier mock_cert_verifier;
6607 TestURLRequestContext context(true);
6608 context.set_transport_security_state(&security_state);
6609 context.set_network_delegate(&network_delegate);
6610 context.set_cert_verifier(&mock_cert_verifier);
6611 mock_cert_verifier.set_default_result(OK);
6612 context.Init();
6613
6614 // Now send a request that does not trigger the violation.
6615 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366616 std::unique_ptr<URLRequest> request(context.CreateRequest(
tommycli59a63432015-11-06 00:10:556617 https_test_server.GetURL("/hpkp-headers-report-only.html"),
rhalavatib7bd7c792017-04-27 05:25:166618 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark06e0dac2015-08-07 21:56:016619 request->Start();
6620 base::RunLoop().Run();
6621
6622 // Check that a report was not sent.
6623 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
6624 EXPECT_EQ(std::string(), mock_report_sender.latest_report());
6625}
6626
estarka5da76702015-04-09 04:00:166627TEST_F(URLRequestTestHTTP, PKPNotProcessedOnIP) {
tommycli59a63432015-11-06 00:10:556628 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6629 https_test_server.ServeFilesFromSourceDirectory(
6630 base::FilePath(kTestFilePath));
estarka5da76702015-04-09 04:00:166631 ASSERT_TRUE(https_test_server.Start());
6632 // Make sure this test fails if the test server is changed to not
6633 // listen on an IP by default.
tommycli59a63432015-11-06 00:10:556634 ASSERT_TRUE(https_test_server.GetURL("/").HostIsIPAddress());
6635 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166636
6637 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366638 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166639 https_test_server.GetURL("/hpkp-headers.html"), DEFAULT_PRIORITY, &d,
6640 TRAFFIC_ANNOTATION_FOR_TESTS));
estarka5da76702015-04-09 04:00:166641 request->Start();
6642 base::RunLoop().Run();
6643
6644 TransportSecurityState* security_state =
6645 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406646 TransportSecurityState::PKPState pkp_state;
6647 EXPECT_FALSE(
6648 security_state->GetDynamicPKPState(test_server_hostname, &pkp_state));
estarka5da76702015-04-09 04:00:166649}
6650
dadriandf302c42016-06-10 18:48:596651TEST_F(URLRequestTestHTTP, PKPBypassRecorded) {
6652 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6653 https_test_server.SetSSLConfig(
6654 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6655 https_test_server.ServeFilesFromSourceDirectory(
6656 base::FilePath(kTestFilePath));
6657 ASSERT_TRUE(https_test_server.Start());
6658
6659 // Set up a MockCertVerifier to be a local root that violates the pin
6660 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6661 ASSERT_TRUE(cert);
6662
6663 MockCertVerifier cert_verifier;
6664 CertVerifyResult verify_result;
6665 verify_result.verified_cert = cert;
6666 verify_result.is_issued_by_known_root = false;
6667 HashValue hash;
6668 ASSERT_TRUE(
6669 hash.FromString("sha256/1111111111111111111111111111111111111111111="));
6670 verify_result.public_key_hashes.push_back(hash);
6671 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6672 cert_verifier.set_default_result(OK);
6673
6674 std::string test_server_hostname = https_test_server.GetURL("/").host();
6675
6676 // Set up HPKP
6677 base::Time current_time = base::Time::Now();
6678 const base::Time expiry = current_time + base::TimeDelta::FromSeconds(10000);
6679 HashValue pin;
6680 ASSERT_TRUE(
6681 pin.FromString("sha256/2222222222222222222222222222222222222222222="));
6682 HashValueVector hashes;
6683 hashes.push_back(pin);
6684 GURL report_uri(kHPKPReportUri);
6685 TransportSecurityState security_state;
6686 security_state.AddHPKP(test_server_hostname, expiry,
6687 false, /* include subdomains */
6688 hashes, report_uri);
6689
6690 TestNetworkDelegate network_delegate;
6691 TestURLRequestContext context(true);
6692 context.set_transport_security_state(&security_state);
6693 context.set_network_delegate(&network_delegate);
6694 context.set_cert_verifier(&cert_verifier);
6695 context.Init();
6696
6697 TestDelegate d;
6698 std::unique_ptr<URLRequest> request(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:166699 https_test_server.GetURL("/hpkp-headers.html"), DEFAULT_PRIORITY, &d,
6700 TRAFFIC_ANNOTATION_FOR_TESTS));
dadriandf302c42016-06-10 18:48:596701 request->Start();
6702 base::RunLoop().Run();
6703
6704 TransportSecurityState::PKPState pkp_state;
6705 EXPECT_TRUE(
6706 security_state.GetDynamicPKPState(test_server_hostname, &pkp_state));
6707 EXPECT_TRUE(request->ssl_info().pkp_bypassed);
6708}
6709
[email protected]242d8562012-10-30 21:20:466710TEST_F(URLRequestTestHTTP, ProcessSTSOnce) {
tommycli59a63432015-11-06 00:10:556711 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6712 https_test_server.SetSSLConfig(
6713 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6714 https_test_server.ServeFilesFromSourceDirectory(
6715 base::FilePath(kTestFilePath));
[email protected]242d8562012-10-30 21:20:466716 ASSERT_TRUE(https_test_server.Start());
6717
tommycli59a63432015-11-06 00:10:556718 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166719
[email protected]242d8562012-10-30 21:20:466720 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366721 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:556722 https_test_server.GetURL("/hsts-multiple-headers.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:166723 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196724 request->Start();
[email protected]255620da2013-08-19 13:14:296725 base::RunLoop().Run();
[email protected]242d8562012-10-30 21:20:466726
6727 // We should have set parameters from the first header, not the second.
6728 TransportSecurityState* security_state =
6729 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406730 TransportSecurityState::STSState sts_state;
6731 EXPECT_TRUE(
6732 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
6733 EXPECT_EQ(TransportSecurityState::STSState::MODE_FORCE_HTTPS,
6734 sts_state.upgrade_mode);
6735 EXPECT_FALSE(sts_state.include_subdomains);
6736 EXPECT_FALSE(sts_state.include_subdomains);
[email protected]242d8562012-10-30 21:20:466737}
6738
[email protected]9f972ec2013-04-10 20:24:366739TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP) {
tommycli59a63432015-11-06 00:10:556740 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6741 https_test_server.SetSSLConfig(
6742 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6743 https_test_server.ServeFilesFromSourceDirectory(
6744 base::FilePath(kTestFilePath));
[email protected]9f972ec2013-04-10 20:24:366745 ASSERT_TRUE(https_test_server.Start());
6746
tommycli59a63432015-11-06 00:10:556747 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166748
[email protected]9f972ec2013-04-10 20:24:366749 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366750 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:556751 https_test_server.GetURL("/hsts-and-hpkp-headers.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:166752 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196753 request->Start();
[email protected]255620da2013-08-19 13:14:296754 base::RunLoop().Run();
[email protected]9f972ec2013-04-10 20:24:366755
6756 // We should have set parameters from the first header, not the second.
6757 TransportSecurityState* security_state =
6758 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406759 TransportSecurityState::STSState sts_state;
6760 TransportSecurityState::PKPState pkp_state;
6761 EXPECT_TRUE(
6762 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
6763 EXPECT_TRUE(
6764 security_state->GetDynamicPKPState(test_server_hostname, &pkp_state));
6765 EXPECT_EQ(TransportSecurityState::STSState::MODE_FORCE_HTTPS,
6766 sts_state.upgrade_mode);
mathpc992e602015-10-21 20:34:036767#if defined(OS_ANDROID)
6768 // Android's CertVerifyProc does not (yet) handle pins.
6769#else
martijnc0d6b622015-06-30 19:14:406770 EXPECT_TRUE(pkp_state.HasPublicKeyPins());
mathpc992e602015-10-21 20:34:036771#endif
martijnc0d6b622015-06-30 19:14:406772 EXPECT_NE(sts_state.expiry, pkp_state.expiry);
[email protected]9f972ec2013-04-10 20:24:366773
[email protected]a165f092013-06-12 16:10:056774 // Even though there is an HSTS header asserting includeSubdomains, it is
6775 // the *second* such header, and we MUST process only the first.
martijnc0d6b622015-06-30 19:14:406776 EXPECT_FALSE(sts_state.include_subdomains);
[email protected]a165f092013-06-12 16:10:056777 // includeSubdomains does not occur in the test HPKP header.
martijnc0d6b622015-06-30 19:14:406778 EXPECT_FALSE(pkp_state.include_subdomains);
[email protected]9f972ec2013-04-10 20:24:366779}
6780
[email protected]37fd55fb2013-06-29 13:13:276781// Tests that when multiple HPKP headers are present, asserting different
6782// policies, that only the first such policy is processed.
6783TEST_F(URLRequestTestHTTP, ProcessSTSAndPKP2) {
tommycli59a63432015-11-06 00:10:556784 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6785 https_test_server.SetSSLConfig(
6786 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6787 https_test_server.ServeFilesFromSourceDirectory(
6788 base::FilePath(kTestFilePath));
[email protected]37fd55fb2013-06-29 13:13:276789 ASSERT_TRUE(https_test_server.Start());
6790
tommycli59a63432015-11-06 00:10:556791 std::string test_server_hostname = https_test_server.GetURL("/").host();
estarka5da76702015-04-09 04:00:166792
[email protected]37fd55fb2013-06-29 13:13:276793 TestDelegate d;
danakj8522a25b2016-04-16 00:17:366794 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:556795 https_test_server.GetURL("/hsts-and-hpkp-headers2.html"),
rhalavatib7bd7c792017-04-27 05:25:166796 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:196797 request->Start();
[email protected]255620da2013-08-19 13:14:296798 base::RunLoop().Run();
[email protected]37fd55fb2013-06-29 13:13:276799
6800 TransportSecurityState* security_state =
6801 default_context_.transport_security_state();
martijnc0d6b622015-06-30 19:14:406802 TransportSecurityState::STSState sts_state;
6803 TransportSecurityState::PKPState pkp_state;
6804 EXPECT_TRUE(
6805 security_state->GetDynamicSTSState(test_server_hostname, &sts_state));
6806 EXPECT_TRUE(
6807 security_state->GetDynamicPKPState(test_server_hostname, &pkp_state));
6808 EXPECT_EQ(TransportSecurityState::STSState::MODE_FORCE_HTTPS,
6809 sts_state.upgrade_mode);
mathpc992e602015-10-21 20:34:036810#if defined(OS_ANDROID)
6811 // Android's CertVerifyProc does not (yet) handle pins.
6812#else
martijnc0d6b622015-06-30 19:14:406813 EXPECT_TRUE(pkp_state.HasPublicKeyPins());
mathpc992e602015-10-21 20:34:036814#endif
martijnc0d6b622015-06-30 19:14:406815 EXPECT_NE(sts_state.expiry, pkp_state.expiry);
[email protected]37fd55fb2013-06-29 13:13:276816
martijnc0d6b622015-06-30 19:14:406817 EXPECT_TRUE(sts_state.include_subdomains);
6818 EXPECT_FALSE(pkp_state.include_subdomains);
[email protected]37fd55fb2013-06-29 13:13:276819}
6820
estark1614475f2016-03-10 03:46:476821// An ExpectCTReporter that records the number of times OnExpectCTFailed() was
6822// called.
6823class MockExpectCTReporter : public TransportSecurityState::ExpectCTReporter {
6824 public:
6825 MockExpectCTReporter() : num_failures_(0) {}
Chris Watkins7a41d3552017-12-01 02:13:276826 ~MockExpectCTReporter() override = default;
estark1614475f2016-03-10 03:46:476827
6828 void OnExpectCTFailed(const HostPortPair& host_port_pair,
6829 const GURL& report_uri,
estarkae028b462017-06-20 23:25:016830 base::Time expiration,
estarkbf1b52962017-05-05 17:05:256831 const X509Certificate* validated_certificate_chain,
6832 const X509Certificate* served_certificate_chain,
6833 const SignedCertificateTimestampAndStatusList&
6834 signed_certificate_timestamps) override {
estark1614475f2016-03-10 03:46:476835 num_failures_++;
6836 }
6837
6838 uint32_t num_failures() { return num_failures_; }
6839
6840 private:
6841 uint32_t num_failures_;
6842};
6843
Emily Stark627238f2017-11-29 03:29:546844// A CTPolicyEnforcer that returns a default CTPolicyCompliance value
estark1614475f2016-03-10 03:46:476845// for every certificate.
6846class MockCTPolicyEnforcer : public CTPolicyEnforcer {
6847 public:
6848 MockCTPolicyEnforcer()
Emily Stark627238f2017-11-29 03:29:546849 : default_result_(ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS) {}
Chris Watkins7a41d3552017-12-01 02:13:276850 ~MockCTPolicyEnforcer() override = default;
estark1614475f2016-03-10 03:46:476851
Emily Stark627238f2017-11-29 03:29:546852 ct::CTPolicyCompliance CheckCompliance(
estark1614475f2016-03-10 03:46:476853 X509Certificate* cert,
6854 const SCTList& verified_scts,
tfarina42834112016-09-22 13:38:206855 const NetLogWithSource& net_log) override {
estark1614475f2016-03-10 03:46:476856 return default_result_;
6857 }
6858
Emily Stark627238f2017-11-29 03:29:546859 void set_default_result(ct::CTPolicyCompliance default_result) {
estark1614475f2016-03-10 03:46:476860 default_result_ = default_result;
6861 }
6862
6863 private:
Emily Stark627238f2017-11-29 03:29:546864 ct::CTPolicyCompliance default_result_;
estark1614475f2016-03-10 03:46:476865};
6866
Emily Stark4cfecf072017-08-08 01:05:516867// Tests that Expect CT headers for the preload list are processed correctly.
6868TEST_F(URLRequestTestHTTP, PreloadExpectCTHeader) {
Martijn Croonenb1383da2017-10-11 11:56:356869 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
6870
estark1614475f2016-03-10 03:46:476871 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6872 https_test_server.SetSSLConfig(
6873 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6874 https_test_server.ServeFilesFromSourceDirectory(
6875 base::FilePath(kTestFilePath));
6876 ASSERT_TRUE(https_test_server.Start());
6877
6878 MockExpectCTReporter reporter;
6879 TransportSecurityState transport_security_state;
6880 transport_security_state.enable_static_expect_ct_ = true;
6881 transport_security_state.SetExpectCTReporter(&reporter);
6882
6883 // Set up a MockCertVerifier to accept the certificate that the server sends.
6884 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6885 ASSERT_TRUE(cert);
6886 MockCertVerifier cert_verifier;
6887 CertVerifyResult verify_result;
6888 verify_result.verified_cert = cert;
6889 verify_result.is_issued_by_known_root = true;
6890 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6891
rsleevi22cae1672016-12-28 01:53:366892 // Set up a DoNothingCTVerifier and MockCTPolicyEnforcer to trigger an Expect
6893 // CT violation.
6894 DoNothingCTVerifier ct_verifier;
estark1614475f2016-03-10 03:46:476895 MockCTPolicyEnforcer ct_policy_enforcer;
6896 ct_policy_enforcer.set_default_result(
Emily Stark627238f2017-11-29 03:29:546897 ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS);
estark1614475f2016-03-10 03:46:476898
6899 TestNetworkDelegate network_delegate;
6900 // Use a MockHostResolver (which by default maps all hosts to
6901 // 127.0.0.1) so that the request can be sent to a site on the Expect
6902 // CT preload list.
6903 MockHostResolver host_resolver;
6904 TestURLRequestContext context(true);
6905 context.set_host_resolver(&host_resolver);
6906 context.set_transport_security_state(&transport_security_state);
6907 context.set_network_delegate(&network_delegate);
6908 context.set_cert_verifier(&cert_verifier);
6909 context.set_cert_transparency_verifier(&ct_verifier);
vabr13d00742017-06-05 10:31:466910 context.set_ct_policy_enforcer(&ct_policy_enforcer);
estark1614475f2016-03-10 03:46:476911 context.Init();
6912
6913 // Now send a request to trigger the violation.
6914 TestDelegate d;
Emily Stark4cfecf072017-08-08 01:05:516915 GURL url = https_test_server.GetURL("/expect-ct-header-preload.html");
estark1614475f2016-03-10 03:46:476916 GURL::Replacements replace_host;
6917 replace_host.SetHostStr(kExpectCTStaticHostname);
6918 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:166919 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
6920 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark1614475f2016-03-10 03:46:476921 violating_request->Start();
6922 base::RunLoop().Run();
6923
6924 EXPECT_EQ(1u, reporter.num_failures());
6925}
Emily Stark4cfecf072017-08-08 01:05:516926
6927// Tests that Expect CT HTTP headers are processed correctly.
6928TEST_F(URLRequestTestHTTP, ExpectCTHeader) {
6929 base::test::ScopedFeatureList feature_list;
6930 feature_list.InitAndEnableFeature(
6931 TransportSecurityState::kDynamicExpectCTFeature);
6932
6933 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6934 https_test_server.SetSSLConfig(
6935 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6936 https_test_server.ServeFilesFromSourceDirectory(
6937 base::FilePath(kTestFilePath));
6938 ASSERT_TRUE(https_test_server.Start());
6939
6940 MockExpectCTReporter reporter;
6941 TransportSecurityState transport_security_state;
6942 transport_security_state.SetExpectCTReporter(&reporter);
6943
6944 // Set up a MockCertVerifier to accept the certificate that the server sends.
6945 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
6946 ASSERT_TRUE(cert);
6947 MockCertVerifier cert_verifier;
6948 CertVerifyResult verify_result;
6949 verify_result.verified_cert = cert;
6950 verify_result.is_issued_by_known_root = true;
6951 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
6952
6953 // Set up a DoNothingCTVerifier and MockCTPolicyEnforcer to simulate CT
6954 // compliance.
6955 DoNothingCTVerifier ct_verifier;
6956 MockCTPolicyEnforcer ct_policy_enforcer;
6957 ct_policy_enforcer.set_default_result(
Emily Stark627238f2017-11-29 03:29:546958 ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS);
Emily Stark4cfecf072017-08-08 01:05:516959
6960 TestNetworkDelegate network_delegate;
6961 // Use a MockHostResolver (which by default maps all hosts to
6962 // 127.0.0.1).
6963 MockHostResolver host_resolver;
6964 TestURLRequestContext context(true);
6965 context.set_host_resolver(&host_resolver);
6966 context.set_transport_security_state(&transport_security_state);
6967 context.set_network_delegate(&network_delegate);
6968 context.set_cert_verifier(&cert_verifier);
6969 context.set_cert_transparency_verifier(&ct_verifier);
6970 context.set_ct_policy_enforcer(&ct_policy_enforcer);
6971 context.Init();
6972
6973 // Now send a request to trigger the header processing.
6974 TestDelegate d;
6975 GURL url = https_test_server.GetURL("/expect-ct-header.html");
6976 std::unique_ptr<URLRequest> request(context.CreateRequest(
6977 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
6978 request->Start();
6979 base::RunLoop().Run();
6980
6981 TransportSecurityState::ExpectCTState state;
6982 ASSERT_TRUE(
6983 transport_security_state.GetDynamicExpectCTState(url.host(), &state));
6984 EXPECT_TRUE(state.enforce);
6985 EXPECT_EQ(GURL("https://example.test"), state.report_uri);
6986}
6987
6988// Tests that if multiple Expect CT HTTP headers are sent, they are all
6989// processed.
6990TEST_F(URLRequestTestHTTP, MultipleExpectCTHeaders) {
6991 base::test::ScopedFeatureList feature_list;
6992 feature_list.InitAndEnableFeature(
6993 TransportSecurityState::kDynamicExpectCTFeature);
6994
6995 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
6996 https_test_server.SetSSLConfig(
6997 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
6998 https_test_server.ServeFilesFromSourceDirectory(
6999 base::FilePath(kTestFilePath));
7000 ASSERT_TRUE(https_test_server.Start());
7001
7002 MockExpectCTReporter reporter;
7003 TransportSecurityState transport_security_state;
7004 transport_security_state.SetExpectCTReporter(&reporter);
7005
7006 // Set up a MockCertVerifier to accept the certificate that the server sends.
7007 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
7008 ASSERT_TRUE(cert);
7009 MockCertVerifier cert_verifier;
7010 CertVerifyResult verify_result;
7011 verify_result.verified_cert = cert;
7012 verify_result.is_issued_by_known_root = true;
7013 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
7014
7015 // Set up a DoNothingCTVerifier and MockCTPolicyEnforcer to simulate CT
7016 // compliance.
7017 DoNothingCTVerifier ct_verifier;
7018 MockCTPolicyEnforcer ct_policy_enforcer;
7019 ct_policy_enforcer.set_default_result(
Emily Stark627238f2017-11-29 03:29:547020 ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS);
Emily Stark4cfecf072017-08-08 01:05:517021
7022 TestNetworkDelegate network_delegate;
7023 // Use a MockHostResolver (which by default maps all hosts to
7024 // 127.0.0.1).
7025 MockHostResolver host_resolver;
7026 TestURLRequestContext context(true);
7027 context.set_host_resolver(&host_resolver);
7028 context.set_transport_security_state(&transport_security_state);
7029 context.set_network_delegate(&network_delegate);
7030 context.set_cert_verifier(&cert_verifier);
7031 context.set_cert_transparency_verifier(&ct_verifier);
7032 context.set_ct_policy_enforcer(&ct_policy_enforcer);
7033 context.Init();
7034
7035 // Now send a request to trigger the header processing.
7036 TestDelegate d;
7037 GURL url = https_test_server.GetURL("/expect-ct-header-multiple.html");
7038 std::unique_ptr<URLRequest> request(context.CreateRequest(
7039 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7040 request->Start();
7041 base::RunLoop().Run();
7042
7043 TransportSecurityState::ExpectCTState state;
7044 ASSERT_TRUE(
7045 transport_security_state.GetDynamicExpectCTState(url.host(), &state));
7046 EXPECT_TRUE(state.enforce);
7047 EXPECT_EQ(GURL("https://example.test"), state.report_uri);
7048}
7049
mmenkefd9d15c2017-06-29 13:45:547050#endif // !defined(OS_IOS)
estark1614475f2016-03-10 03:46:477051
mmenkefd9d15c2017-06-29 13:45:547052#if BUILDFLAG(ENABLE_REPORTING)
juliatuttle2b8dd2d12017-04-12 21:27:417053namespace {
7054
7055class TestReportingService : public ReportingService {
7056 public:
7057 struct Header {
7058 GURL url;
7059 std::string header_value;
7060 };
7061
juliatuttle2b8dd2d12017-04-12 21:27:417062 const std::vector<Header>& headers() { return headers_; }
7063
juliatuttle1d92f0152017-04-28 17:19:217064 // ReportingService implementation:
7065
Chris Watkins7a41d3552017-12-01 02:13:277066 ~TestReportingService() override = default;
juliatuttle1d92f0152017-04-28 17:19:217067
juliatuttle2b8dd2d12017-04-12 21:27:417068 void QueueReport(const GURL& url,
7069 const std::string& group,
7070 const std::string& type,
7071 std::unique_ptr<const base::Value> body) override {
7072 NOTIMPLEMENTED();
7073 }
7074
7075 void ProcessHeader(const GURL& url,
7076 const std::string& header_value) override {
7077 headers_.push_back({url, header_value});
7078 }
7079
Julia Tuttle227a6ff2017-12-19 19:44:247080 void RemoveBrowsingData(int data_type_mask,
7081 const base::RepeatingCallback<bool(const GURL&)>&
7082 origin_filter) override {
juliatuttleaeb1abc2017-05-04 21:14:387083 NOTIMPLEMENTED();
7084 }
7085
Julia Tuttle4667c1c2017-12-19 18:27:387086 bool RequestIsUpload(const URLRequest& request) override {
7087 NOTIMPLEMENTED();
7088 return true;
7089 }
7090
Julia Tuttle91a655d2018-01-26 18:03:037091 const ReportingPolicy& GetPolicy() const override {
7092 static ReportingPolicy dummy_policy_;
7093 NOTIMPLEMENTED();
7094 return dummy_policy_;
7095 }
7096
juliatuttle2b8dd2d12017-04-12 21:27:417097 private:
7098 std::vector<Header> headers_;
7099};
7100
7101std::unique_ptr<test_server::HttpResponse> SendReportToHeader(
7102 const test_server::HttpRequest& request) {
7103 std::unique_ptr<test_server::BasicHttpResponse> http_response(
7104 new test_server::BasicHttpResponse);
7105 http_response->set_code(HTTP_OK);
7106 http_response->AddCustomHeader("Report-To", "foo");
7107 http_response->AddCustomHeader("Report-To", "bar");
7108 return std::move(http_response);
7109}
7110
7111} // namespace
7112
7113TEST_F(URLRequestTestHTTP, DontProcessReportToHeaderNoService) {
Julia Tuttle7005a2a2017-12-08 21:01:187114 http_test_server()->RegisterRequestHandler(
7115 base::BindRepeating(&SendReportToHeader));
juliatuttle2b8dd2d12017-04-12 21:27:417116 ASSERT_TRUE(http_test_server()->Start());
7117 GURL request_url = http_test_server()->GetURL("/");
7118
7119 TestNetworkDelegate network_delegate;
7120 TestURLRequestContext context(true);
7121 context.set_network_delegate(&network_delegate);
7122 context.Init();
7123
7124 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167125 std::unique_ptr<URLRequest> request(context.CreateRequest(
7126 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417127 request->Start();
7128 base::RunLoop().Run();
7129}
7130
7131TEST_F(URLRequestTestHTTP, DontProcessReportToHeaderHTTP) {
Julia Tuttle7005a2a2017-12-08 21:01:187132 http_test_server()->RegisterRequestHandler(
7133 base::BindRepeating(&SendReportToHeader));
juliatuttle2b8dd2d12017-04-12 21:27:417134 ASSERT_TRUE(http_test_server()->Start());
7135 GURL request_url = http_test_server()->GetURL("/");
7136
7137 TestNetworkDelegate network_delegate;
7138 TestReportingService reporting_service;
7139 TestURLRequestContext context(true);
7140 context.set_network_delegate(&network_delegate);
7141 context.set_reporting_service(&reporting_service);
7142 context.Init();
7143
7144 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167145 std::unique_ptr<URLRequest> request(context.CreateRequest(
7146 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417147 request->Start();
7148 base::RunLoop().Run();
7149
7150 EXPECT_TRUE(reporting_service.headers().empty());
7151}
7152
7153TEST_F(URLRequestTestHTTP, ProcessReportToHeaderHTTPS) {
7154 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
Julia Tuttle7005a2a2017-12-08 21:01:187155 https_test_server.RegisterRequestHandler(
7156 base::BindRepeating(&SendReportToHeader));
juliatuttle2b8dd2d12017-04-12 21:27:417157 ASSERT_TRUE(https_test_server.Start());
7158 GURL request_url = https_test_server.GetURL("/");
7159
7160 TestNetworkDelegate network_delegate;
7161 TestReportingService reporting_service;
7162 TestURLRequestContext context(true);
7163 context.set_network_delegate(&network_delegate);
7164 context.set_reporting_service(&reporting_service);
7165 context.Init();
7166
7167 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167168 std::unique_ptr<URLRequest> request(context.CreateRequest(
7169 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417170 request->Start();
7171 base::RunLoop().Run();
7172
7173 ASSERT_EQ(1u, reporting_service.headers().size());
7174 EXPECT_EQ(request_url, reporting_service.headers()[0].url);
7175 EXPECT_EQ("foo, bar", reporting_service.headers()[0].header_value);
7176}
7177
Julia Tuttlef9b74062017-07-27 14:44:057178TEST_F(URLRequestTestHTTP, DontProcessReportToHeaderInvalidHttps) {
juliatuttle2b8dd2d12017-04-12 21:27:417179 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7180 https_test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
Julia Tuttle7005a2a2017-12-08 21:01:187181 https_test_server.RegisterRequestHandler(
7182 base::BindRepeating(&SendReportToHeader));
juliatuttle2b8dd2d12017-04-12 21:27:417183 ASSERT_TRUE(https_test_server.Start());
7184 GURL request_url = https_test_server.GetURL("/");
7185
7186 TestNetworkDelegate network_delegate;
7187 TestReportingService reporting_service;
7188 TestURLRequestContext context(true);
7189 context.set_network_delegate(&network_delegate);
7190 context.set_reporting_service(&reporting_service);
7191 context.Init();
7192
7193 TestDelegate d;
7194 d.set_allow_certificate_errors(true);
rhalavatib7bd7c792017-04-27 05:25:167195 std::unique_ptr<URLRequest> request(context.CreateRequest(
7196 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
juliatuttle2b8dd2d12017-04-12 21:27:417197 request->Start();
7198 base::RunLoop().Run();
7199
7200 EXPECT_TRUE(d.have_certificate_errors());
7201 EXPECT_TRUE(IsCertStatusError(request->ssl_info().cert_status));
7202 EXPECT_TRUE(reporting_service.headers().empty());
7203}
Julia Tuttlefadc26d2017-10-13 18:12:297204
7205// Network Error Logging is dependent on the Reporting API, so only run NEL
7206// tests if Reporting is enabled in the build.
tommycli59a63432015-11-06 00:10:557207
Julia Tuttlef9b74062017-07-27 14:44:057208namespace {
7209
Julia Tuttlecba7d222018-02-23 19:37:277210class TestNetworkErrorLoggingService : public NetworkErrorLoggingService {
Julia Tuttlef9b74062017-07-27 14:44:057211 public:
7212 struct Header {
Chris Watkins7a41d3552017-12-01 02:13:277213 Header() = default;
7214 ~Header() = default;
Julia Tuttlef9b74062017-07-27 14:44:057215
7216 url::Origin origin;
7217 std::string value;
7218 };
7219
Julia Tuttlef9b74062017-07-27 14:44:057220 const std::vector<Header>& headers() { return headers_; }
Douglas Creager1f56bbe2018-02-17 03:58:407221 const std::vector<RequestDetails>& errors() { return errors_; }
Julia Tuttlef9b74062017-07-27 14:44:057222
Julia Tuttlecba7d222018-02-23 19:37:277223 // NetworkErrorLoggingService implementation:
Julia Tuttlef9b74062017-07-27 14:44:057224
Julia Tuttlecba7d222018-02-23 19:37:277225 ~TestNetworkErrorLoggingService() override = default;
Julia Tuttlef9b74062017-07-27 14:44:057226
7227 void OnHeader(const url::Origin& origin, const std::string& value) override {
7228 Header header;
7229 header.origin = origin;
7230 header.value = value;
7231 headers_.push_back(header);
7232 }
7233
Douglas Creager1f56bbe2018-02-17 03:58:407234 void OnRequest(const RequestDetails& details) override {
Julia Tuttleb0d45472017-09-25 20:14:437235 errors_.push_back(details);
Julia Tuttlef9b74062017-07-27 14:44:057236 }
7237
Julia Tuttlea059db82018-01-04 18:46:437238 void RemoveBrowsingData(const base::RepeatingCallback<bool(const GURL&)>&
7239 origin_filter) override {
7240 NOTREACHED();
7241 }
7242
Julia Tuttlef9b74062017-07-27 14:44:057243 private:
7244 std::vector<Header> headers_;
Douglas Creager1f56bbe2018-02-17 03:58:407245 std::vector<RequestDetails> errors_;
Julia Tuttlef9b74062017-07-27 14:44:057246};
7247
7248std::unique_ptr<test_server::HttpResponse> SendNelHeader(
7249 const test_server::HttpRequest& request) {
7250 std::unique_ptr<test_server::BasicHttpResponse> http_response(
7251 new test_server::BasicHttpResponse);
7252 http_response->set_code(HTTP_OK);
Julia Tuttlecba7d222018-02-23 19:37:277253 http_response->AddCustomHeader(NetworkErrorLoggingService::kHeaderName,
Julia Tuttlef9b74062017-07-27 14:44:057254 "foo");
7255 return std::move(http_response);
7256}
7257
Julia Tuttle7005a2a2017-12-08 21:01:187258std::unique_ptr<test_server::HttpResponse> SendEmptyResponse(
7259 const test_server::HttpRequest& request) {
Gyuyoung Kimb480aba2018-01-27 07:00:047260 return std::make_unique<test_server::RawHttpResponse>("", "");
Julia Tuttle7005a2a2017-12-08 21:01:187261}
7262
Julia Tuttlef9b74062017-07-27 14:44:057263} // namespace
7264
7265TEST_F(URLRequestTestHTTP, DontProcessNelHeaderNoDelegate) {
Julia Tuttle7005a2a2017-12-08 21:01:187266 http_test_server()->RegisterRequestHandler(
7267 base::BindRepeating(&SendNelHeader));
Julia Tuttlef9b74062017-07-27 14:44:057268 ASSERT_TRUE(http_test_server()->Start());
7269 GURL request_url = http_test_server()->GetURL("/");
7270
7271 TestNetworkDelegate network_delegate;
7272 TestURLRequestContext context(true);
7273 context.set_network_delegate(&network_delegate);
7274 context.Init();
7275
7276 TestDelegate d;
7277 std::unique_ptr<URLRequest> request(context.CreateRequest(
7278 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7279 request->Start();
7280 base::RunLoop().Run();
7281}
7282
7283TEST_F(URLRequestTestHTTP, DontProcessNelHeaderHttp) {
Julia Tuttle7005a2a2017-12-08 21:01:187284 http_test_server()->RegisterRequestHandler(
7285 base::BindRepeating(&SendNelHeader));
Julia Tuttlef9b74062017-07-27 14:44:057286 ASSERT_TRUE(http_test_server()->Start());
7287 GURL request_url = http_test_server()->GetURL("/");
7288
7289 TestNetworkDelegate network_delegate;
Julia Tuttlecba7d222018-02-23 19:37:277290 TestNetworkErrorLoggingService nel_service;
Julia Tuttlef9b74062017-07-27 14:44:057291 TestURLRequestContext context(true);
7292 context.set_network_delegate(&network_delegate);
Julia Tuttlecba7d222018-02-23 19:37:277293 context.set_network_error_logging_service(&nel_service);
Julia Tuttlef9b74062017-07-27 14:44:057294 context.Init();
7295
7296 TestDelegate d;
7297 std::unique_ptr<URLRequest> request(context.CreateRequest(
7298 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7299 request->Start();
7300 base::RunLoop().Run();
7301
Julia Tuttlecba7d222018-02-23 19:37:277302 EXPECT_TRUE(nel_service.headers().empty());
Julia Tuttlef9b74062017-07-27 14:44:057303}
7304
7305TEST_F(URLRequestTestHTTP, ProcessNelHeaderHttps) {
7306 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
Julia Tuttle7005a2a2017-12-08 21:01:187307 https_test_server.RegisterRequestHandler(base::BindRepeating(&SendNelHeader));
Julia Tuttlef9b74062017-07-27 14:44:057308 ASSERT_TRUE(https_test_server.Start());
7309 GURL request_url = https_test_server.GetURL("/");
7310
7311 TestNetworkDelegate network_delegate;
Julia Tuttlecba7d222018-02-23 19:37:277312 TestNetworkErrorLoggingService nel_service;
Julia Tuttlef9b74062017-07-27 14:44:057313 TestURLRequestContext context(true);
7314 context.set_network_delegate(&network_delegate);
Julia Tuttlecba7d222018-02-23 19:37:277315 context.set_network_error_logging_service(&nel_service);
Julia Tuttlef9b74062017-07-27 14:44:057316 context.Init();
7317
7318 TestDelegate d;
7319 std::unique_ptr<URLRequest> request(context.CreateRequest(
7320 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7321 request->Start();
7322 base::RunLoop().Run();
7323
Julia Tuttlecba7d222018-02-23 19:37:277324 ASSERT_EQ(1u, nel_service.headers().size());
7325 EXPECT_EQ(url::Origin::Create(request_url), nel_service.headers()[0].origin);
7326 EXPECT_EQ("foo", nel_service.headers()[0].value);
Julia Tuttlef9b74062017-07-27 14:44:057327}
7328
7329TEST_F(URLRequestTestHTTP, DontProcessNelHeaderInvalidHttps) {
7330 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7331 https_test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
Julia Tuttle7005a2a2017-12-08 21:01:187332 https_test_server.RegisterRequestHandler(base::BindRepeating(&SendNelHeader));
Julia Tuttlef9b74062017-07-27 14:44:057333 ASSERT_TRUE(https_test_server.Start());
7334 GURL request_url = https_test_server.GetURL("/");
7335
7336 TestNetworkDelegate network_delegate;
Julia Tuttlecba7d222018-02-23 19:37:277337 TestNetworkErrorLoggingService nel_service;
Julia Tuttlef9b74062017-07-27 14:44:057338 TestURLRequestContext context(true);
7339 context.set_network_delegate(&network_delegate);
Julia Tuttlecba7d222018-02-23 19:37:277340 context.set_network_error_logging_service(&nel_service);
Julia Tuttlef9b74062017-07-27 14:44:057341 context.Init();
7342
7343 TestDelegate d;
7344 d.set_allow_certificate_errors(true);
7345 std::unique_ptr<URLRequest> request(context.CreateRequest(
7346 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7347 request->Start();
7348 base::RunLoop().Run();
7349
7350 EXPECT_TRUE(d.have_certificate_errors());
7351 EXPECT_TRUE(IsCertStatusError(request->ssl_info().cert_status));
Julia Tuttlecba7d222018-02-23 19:37:277352 EXPECT_TRUE(nel_service.headers().empty());
Julia Tuttlef9b74062017-07-27 14:44:057353}
7354
Julia Tuttlefadc26d2017-10-13 18:12:297355TEST_F(URLRequestTestHTTP, DontForwardErrorToNelNoDelegate) {
7356 URLRequestFailedJob::AddUrlHandler();
7357
7358 GURL request_url =
7359 URLRequestFailedJob::GetMockHttpsUrl(ERR_CONNECTION_REFUSED);
7360
7361 TestNetworkDelegate network_delegate;
7362 TestURLRequestContext context(true);
7363 context.set_network_delegate(&network_delegate);
7364 context.Init();
7365
7366 TestDelegate d;
7367 std::unique_ptr<URLRequest> request(context.CreateRequest(
7368 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7369 request->Start();
7370 base::RunLoop().Run();
7371
7372 URLRequestFilter::GetInstance()->ClearHandlers();
7373}
7374
7375// TODO(juliatuttle): Figure out whether this restriction should be in place,
7376// and either implement it or remove this test.
7377TEST_F(URLRequestTestHTTP, DISABLED_DontForwardErrorToNelHttp) {
7378 URLRequestFailedJob::AddUrlHandler();
7379
7380 GURL request_url =
7381 URLRequestFailedJob::GetMockHttpUrl(ERR_CONNECTION_REFUSED);
7382
7383 TestNetworkDelegate network_delegate;
Julia Tuttlecba7d222018-02-23 19:37:277384 TestNetworkErrorLoggingService nel_service;
Julia Tuttlefadc26d2017-10-13 18:12:297385 TestURLRequestContext context(true);
7386 context.set_network_delegate(&network_delegate);
Julia Tuttlecba7d222018-02-23 19:37:277387 context.set_network_error_logging_service(&nel_service);
Julia Tuttlefadc26d2017-10-13 18:12:297388 context.Init();
7389
7390 TestDelegate d;
7391 std::unique_ptr<URLRequest> request(context.CreateRequest(
7392 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7393 request->Start();
7394 base::RunLoop().Run();
7395
Julia Tuttlecba7d222018-02-23 19:37:277396 EXPECT_TRUE(nel_service.errors().empty());
Julia Tuttlefadc26d2017-10-13 18:12:297397
7398 URLRequestFilter::GetInstance()->ClearHandlers();
7399}
7400
Julia Tuttle7005a2a2017-12-08 21:01:187401TEST_F(URLRequestTestHTTP, ForwardErrorToNelHttps_Mock) {
Julia Tuttlefadc26d2017-10-13 18:12:297402 URLRequestFailedJob::AddUrlHandler();
7403
7404 GURL request_url =
7405 URLRequestFailedJob::GetMockHttpsUrl(ERR_CONNECTION_REFUSED);
7406
7407 TestNetworkDelegate network_delegate;
Julia Tuttlecba7d222018-02-23 19:37:277408 TestNetworkErrorLoggingService nel_service;
Julia Tuttlefadc26d2017-10-13 18:12:297409 TestURLRequestContext context(true);
7410 context.set_network_delegate(&network_delegate);
Julia Tuttlecba7d222018-02-23 19:37:277411 context.set_network_error_logging_service(&nel_service);
Julia Tuttlefadc26d2017-10-13 18:12:297412 context.Init();
7413
7414 TestDelegate d;
7415 std::unique_ptr<URLRequest> request(context.CreateRequest(
7416 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7417 request->Start();
7418 base::RunLoop().Run();
7419
Julia Tuttlecba7d222018-02-23 19:37:277420 ASSERT_EQ(1u, nel_service.errors().size());
7421 EXPECT_EQ(request_url, nel_service.errors()[0].uri);
7422 EXPECT_EQ(0, nel_service.errors()[0].status_code);
7423 EXPECT_EQ(ERR_CONNECTION_REFUSED, nel_service.errors()[0].type);
Julia Tuttlefadc26d2017-10-13 18:12:297424
7425 URLRequestFilter::GetInstance()->ClearHandlers();
7426}
7427
Julia Tuttle7005a2a2017-12-08 21:01:187428// Also test with a real server, to exercise interactions with
7429// URLRequestHttpJob.
7430TEST_F(URLRequestTestHTTP, ForwardErrorToNelHttps_Real) {
7431 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
7432 https_test_server.RegisterRequestHandler(
7433 base::BindRepeating(&SendEmptyResponse));
7434 ASSERT_TRUE(https_test_server.Start());
7435 GURL request_url = https_test_server.GetURL("/");
7436
7437 TestNetworkDelegate network_delegate;
Julia Tuttlecba7d222018-02-23 19:37:277438 TestNetworkErrorLoggingService nel_service;
Julia Tuttle7005a2a2017-12-08 21:01:187439 TestURLRequestContext context(true);
7440 context.set_network_delegate(&network_delegate);
Julia Tuttlecba7d222018-02-23 19:37:277441 context.set_network_error_logging_service(&nel_service);
Julia Tuttle7005a2a2017-12-08 21:01:187442 context.Init();
7443
7444 TestDelegate d;
7445 std::unique_ptr<URLRequest> request(context.CreateRequest(
7446 request_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
7447 request->Start();
7448 base::RunLoop().Run();
7449
Julia Tuttlecba7d222018-02-23 19:37:277450 ASSERT_EQ(1u, nel_service.errors().size());
7451 EXPECT_EQ(request_url, nel_service.errors()[0].uri);
7452 EXPECT_EQ(0, nel_service.errors()[0].status_code);
7453 EXPECT_EQ(ERR_EMPTY_RESPONSE, nel_service.errors()[0].type);
Julia Tuttle7005a2a2017-12-08 21:01:187454}
7455
Julia Tuttlefadc26d2017-10-13 18:12:297456#endif // BUILDFLAG(ENABLE_REPORTING)
7457
[email protected]316c1e5e2012-09-12 15:17:447458TEST_F(URLRequestTestHTTP, ContentTypeNormalizationTest) {
tommycli59a63432015-11-06 00:10:557459 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447460
7461 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367462 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557463 http_test_server()->GetURL("/content-type-normalization.html"),
rhalavatib7bd7c792017-04-27 05:25:167464 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197465 req->Start();
[email protected]255620da2013-08-19 13:14:297466 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447467
7468 std::string mime_type;
[email protected]f7022f32014-08-21 16:32:197469 req->GetMimeType(&mime_type);
[email protected]316c1e5e2012-09-12 15:17:447470 EXPECT_EQ("text/html", mime_type);
7471
7472 std::string charset;
[email protected]f7022f32014-08-21 16:32:197473 req->GetCharset(&charset);
[email protected]316c1e5e2012-09-12 15:17:447474 EXPECT_EQ("utf-8", charset);
[email protected]f7022f32014-08-21 16:32:197475 req->Cancel();
[email protected]316c1e5e2012-09-12 15:17:447476}
7477
[email protected]02494ec2014-05-07 15:05:297478TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictDataRedirects) {
[email protected]e0f35c92013-05-08 16:04:347479 // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget().
[email protected]e0f35c92013-05-08 16:04:347480 GURL data_url("data:,foo");
[email protected]e0f35c92013-05-08 16:04:347481 DataProtocolHandler data_protocol_handler;
[email protected]588614c22013-08-16 00:09:027482 EXPECT_FALSE(data_protocol_handler.IsSafeRedirectTarget(data_url));
[email protected]e0f35c92013-05-08 16:04:347483
7484 // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget().
bengr1bf8e942014-11-07 01:36:507485 EXPECT_FALSE(job_factory_->IsSafeRedirectTarget(data_url));
[email protected]e0f35c92013-05-08 16:04:347486}
7487
brettwa1228ebb2016-10-28 03:51:347488#if !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]02494ec2014-05-07 15:05:297489TEST_F(URLRequestTestHTTP, ProtocolHandlerAndFactoryRestrictFileRedirects) {
7490 // Test URLRequestJobFactory::ProtocolHandler::IsSafeRedirectTarget().
7491 GURL file_url("file:///foo.txt");
skyostil4891b25b2015-06-11 11:43:457492 FileProtocolHandler file_protocol_handler(
7493 base::ThreadTaskRunnerHandle::Get());
[email protected]02494ec2014-05-07 15:05:297494 EXPECT_FALSE(file_protocol_handler.IsSafeRedirectTarget(file_url));
7495
7496 // Test URLRequestJobFactoryImpl::IsSafeRedirectTarget().
bengr1bf8e942014-11-07 01:36:507497 EXPECT_FALSE(job_factory_->IsSafeRedirectTarget(file_url));
[email protected]02494ec2014-05-07 15:05:297498}
7499
[email protected]588614c22013-08-16 00:09:027500TEST_F(URLRequestTestHTTP, RestrictFileRedirects) {
tommycli59a63432015-11-06 00:10:557501 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447502
7503 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367504 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557505 http_test_server()->GetURL("/redirect-to-file.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167506 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197507 req->Start();
[email protected]255620da2013-08-19 13:14:297508 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447509
maksim.sisovb53724b52016-09-16 05:30:507510 EXPECT_EQ(ERR_UNSAFE_REDIRECT, d.request_status());
davidbend894710b2017-06-06 19:28:307511
7512 // The redirect should have been rejected before reporting it to the caller.
7513 EXPECT_EQ(0, d.received_redirect_count());
[email protected]316c1e5e2012-09-12 15:17:447514}
brettwa1228ebb2016-10-28 03:51:347515#endif // !BUILDFLAG(DISABLE_FILE_SUPPORT)
[email protected]316c1e5e2012-09-12 15:17:447516
[email protected]588614c22013-08-16 00:09:027517TEST_F(URLRequestTestHTTP, RestrictDataRedirects) {
tommycli59a63432015-11-06 00:10:557518 ASSERT_TRUE(http_test_server()->Start());
[email protected]588614c22013-08-16 00:09:027519
7520 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367521 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557522 http_test_server()->GetURL("/redirect-to-data.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167523 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197524 req->Start();
fdoray5eeb7642016-06-22 16:11:287525 base::RunLoop().Run();
[email protected]588614c22013-08-16 00:09:027526
maksim.sisovb53724b52016-09-16 05:30:507527 EXPECT_EQ(ERR_UNSAFE_REDIRECT, d.request_status());
davidbend894710b2017-06-06 19:28:307528
7529 // The redirect should have been rejected before reporting it to the
7530 // caller. See https://crbug.com/723796
7531 EXPECT_EQ(0, d.received_redirect_count());
[email protected]588614c22013-08-16 00:09:027532}
7533
davidbend894710b2017-06-06 19:28:307534// Test that redirects to invalid URLs are rejected. See
7535// https://crbug.com/462272.
[email protected]316c1e5e2012-09-12 15:17:447536TEST_F(URLRequestTestHTTP, RedirectToInvalidURL) {
tommycli59a63432015-11-06 00:10:557537 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447538
7539 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367540 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557541 http_test_server()->GetURL("/redirect-to-invalid-url.html"),
rhalavatib7bd7c792017-04-27 05:25:167542 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197543 req->Start();
[email protected]255620da2013-08-19 13:14:297544 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447545
davidbend894710b2017-06-06 19:28:307546 EXPECT_EQ(1, d.response_started_count());
7547 EXPECT_EQ(ERR_INVALID_REDIRECT, d.request_status());
7548
7549 // The redirect should have been rejected before reporting it to the caller.
7550 EXPECT_EQ(0, d.received_redirect_count());
[email protected]316c1e5e2012-09-12 15:17:447551}
7552
[email protected]e50efea2014-03-24 18:41:007553// Make sure redirects are cached, despite not reading their bodies.
7554TEST_F(URLRequestTestHTTP, CacheRedirect) {
tommycli59a63432015-11-06 00:10:557555 ASSERT_TRUE(http_test_server()->Start());
[email protected]e50efea2014-03-24 18:41:007556 GURL redirect_url =
tommycli59a63432015-11-06 00:10:557557 http_test_server()->GetURL("/redirect302-to-echo-cacheable");
[email protected]e50efea2014-03-24 18:41:007558
7559 {
7560 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167561 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7562 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197563 req->Start();
[email protected]e50efea2014-03-24 18:41:007564 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:507565 EXPECT_EQ(OK, d.request_status());
[email protected]e50efea2014-03-24 18:41:007566 EXPECT_EQ(1, d.received_redirect_count());
tommycli59a63432015-11-06 00:10:557567 EXPECT_EQ(http_test_server()->GetURL("/echo"), req->url());
[email protected]e50efea2014-03-24 18:41:007568 }
7569
7570 {
7571 TestDelegate d;
7572 d.set_quit_on_redirect(true);
rhalavatib7bd7c792017-04-27 05:25:167573 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7574 redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197575 req->Start();
[email protected]e50efea2014-03-24 18:41:007576 base::RunLoop().Run();
7577
7578 EXPECT_EQ(1, d.received_redirect_count());
7579 EXPECT_EQ(0, d.response_started_count());
[email protected]f7022f32014-08-21 16:32:197580 EXPECT_TRUE(req->was_cached());
[email protected]e50efea2014-03-24 18:41:007581
[email protected]f7022f32014-08-21 16:32:197582 req->FollowDeferredRedirect();
[email protected]e50efea2014-03-24 18:41:007583 base::RunLoop().Run();
7584 EXPECT_EQ(1, d.received_redirect_count());
7585 EXPECT_EQ(1, d.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:507586 EXPECT_EQ(OK, d.request_status());
tommycli59a63432015-11-06 00:10:557587 EXPECT_EQ(http_test_server()->GetURL("/echo"), req->url());
[email protected]e50efea2014-03-24 18:41:007588 }
7589}
7590
7591// Make sure a request isn't cached when a NetworkDelegate forces a redirect
7592// when the headers are read, since the body won't have been read.
7593TEST_F(URLRequestTestHTTP, NoCacheOnNetworkDelegateRedirect) {
tommycli59a63432015-11-06 00:10:557594 ASSERT_TRUE(http_test_server()->Start());
[email protected]e50efea2014-03-24 18:41:007595 // URL that is normally cached.
tommycli59a63432015-11-06 00:10:557596 GURL initial_url = http_test_server()->GetURL("/cachetime");
[email protected]e50efea2014-03-24 18:41:007597
7598 {
7599 // Set up the TestNetworkDelegate tp force a redirect.
tommycli59a63432015-11-06 00:10:557600 GURL redirect_to_url = http_test_server()->GetURL("/echo");
[email protected]e50efea2014-03-24 18:41:007601 default_network_delegate_.set_redirect_on_headers_received_url(
7602 redirect_to_url);
7603
7604 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167605 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7606 initial_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197607 req->Start();
[email protected]e50efea2014-03-24 18:41:007608 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:507609 EXPECT_EQ(OK, d.request_status());
[email protected]e50efea2014-03-24 18:41:007610 EXPECT_EQ(1, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:197611 EXPECT_EQ(redirect_to_url, req->url());
[email protected]e50efea2014-03-24 18:41:007612 }
7613
7614 {
7615 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167616 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7617 initial_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197618 req->Start();
[email protected]e50efea2014-03-24 18:41:007619 base::RunLoop().Run();
7620
maksim.sisovb53724b52016-09-16 05:30:507621 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197622 EXPECT_FALSE(req->was_cached());
[email protected]e50efea2014-03-24 18:41:007623 EXPECT_EQ(0, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:197624 EXPECT_EQ(initial_url, req->url());
[email protected]e50efea2014-03-24 18:41:007625 }
7626}
7627
[email protected]5f714132014-03-26 10:41:167628// Tests that redirection to an unsafe URL is allowed when it has been marked as
7629// safe.
7630TEST_F(URLRequestTestHTTP, UnsafeRedirectToWhitelistedUnsafeURL) {
tommycli59a63432015-11-06 00:10:557631 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167632
7633 GURL unsafe_url("data:text/html,this-is-considered-an-unsafe-url");
7634 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
7635 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
7636
7637 TestDelegate d;
7638 {
danakj8522a25b2016-04-16 00:17:367639 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167640 http_test_server()->GetURL("/whatever"), DEFAULT_PRIORITY, &d,
7641 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167642
[email protected]f7022f32014-08-21 16:32:197643 r->Start();
[email protected]5f714132014-03-26 10:41:167644 base::RunLoop().Run();
7645
maksim.sisovb53724b52016-09-16 05:30:507646 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197647 EXPECT_EQ(2U, r->url_chain().size());
[email protected]f7022f32014-08-21 16:32:197648 EXPECT_EQ(unsafe_url, r->url());
[email protected]5f714132014-03-26 10:41:167649 EXPECT_EQ("this-is-considered-an-unsafe-url", d.data_received());
7650 }
7651}
7652
7653// Tests that a redirect to a different unsafe URL is blocked, even after adding
7654// some other URL to the whitelist.
7655TEST_F(URLRequestTestHTTP, UnsafeRedirectToDifferentUnsafeURL) {
tommycli59a63432015-11-06 00:10:557656 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167657
7658 GURL unsafe_url("data:text/html,something");
7659 GURL different_unsafe_url("data:text/html,something-else");
7660 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
7661 default_network_delegate_.set_allowed_unsafe_redirect_url(
7662 different_unsafe_url);
7663
7664 TestDelegate d;
7665 {
danakj8522a25b2016-04-16 00:17:367666 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167667 http_test_server()->GetURL("/whatever"), DEFAULT_PRIORITY, &d,
7668 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167669
[email protected]f7022f32014-08-21 16:32:197670 r->Start();
[email protected]5f714132014-03-26 10:41:167671 base::RunLoop().Run();
7672
maksim.sisovb53724b52016-09-16 05:30:507673 EXPECT_EQ(ERR_UNSAFE_REDIRECT, d.request_status());
davidbend894710b2017-06-06 19:28:307674
7675 // The redirect should have been rejected before reporting it to the caller.
7676 EXPECT_EQ(0, d.received_redirect_count());
[email protected]5f714132014-03-26 10:41:167677 }
7678}
7679
[email protected]5f714132014-03-26 10:41:167680// Redirects from an URL with fragment to an unsafe URL with fragment should
7681// be allowed, and the reference fragment of the target URL should be preserved.
7682TEST_F(URLRequestTestHTTP, UnsafeRedirectWithDifferentReferenceFragment) {
tommycli59a63432015-11-06 00:10:557683 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167684
tommycli59a63432015-11-06 00:10:557685 GURL original_url(http_test_server()->GetURL("/original#fragment1"));
[email protected]5f714132014-03-26 10:41:167686 GURL unsafe_url("data:,url-marked-safe-and-used-in-redirect#fragment2");
7687 GURL expected_url("data:,url-marked-safe-and-used-in-redirect#fragment2");
7688
7689 default_network_delegate_.set_redirect_on_headers_received_url(unsafe_url);
7690 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
7691
7692 TestDelegate d;
7693 {
rhalavatib7bd7c792017-04-27 05:25:167694 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7695 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167696
[email protected]f7022f32014-08-21 16:32:197697 r->Start();
[email protected]5f714132014-03-26 10:41:167698 base::RunLoop().Run();
7699
[email protected]f7022f32014-08-21 16:32:197700 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:507701 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197702 EXPECT_EQ(original_url, r->original_url());
7703 EXPECT_EQ(expected_url, r->url());
[email protected]5f714132014-03-26 10:41:167704 }
7705}
7706
7707// When a delegate has specified a safe redirect URL, but it does not match the
7708// redirect target, then do not prevent the reference fragment from being added.
[email protected]f878230e2014-04-03 15:36:147709TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragmentAndUnrelatedUnsafeUrl) {
tommycli59a63432015-11-06 00:10:557710 ASSERT_TRUE(http_test_server()->Start());
[email protected]5f714132014-03-26 10:41:167711
tommycli59a63432015-11-06 00:10:557712 GURL original_url(http_test_server()->GetURL("/original#expected-fragment"));
[email protected]5f714132014-03-26 10:41:167713 GURL unsafe_url("data:text/html,this-url-does-not-match-redirect-url");
tommycli59a63432015-11-06 00:10:557714 GURL redirect_url(http_test_server()->GetURL("/target"));
7715 GURL expected_redirect_url(
7716 http_test_server()->GetURL("/target#expected-fragment"));
[email protected]5f714132014-03-26 10:41:167717
7718 default_network_delegate_.set_redirect_on_headers_received_url(redirect_url);
7719 default_network_delegate_.set_allowed_unsafe_redirect_url(unsafe_url);
7720
7721 TestDelegate d;
7722 {
rhalavatib7bd7c792017-04-27 05:25:167723 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7724 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]5f714132014-03-26 10:41:167725
[email protected]f7022f32014-08-21 16:32:197726 r->Start();
[email protected]5f714132014-03-26 10:41:167727 base::RunLoop().Run();
7728
[email protected]f7022f32014-08-21 16:32:197729 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:507730 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197731 EXPECT_EQ(original_url, r->original_url());
7732 EXPECT_EQ(expected_redirect_url, r->url());
[email protected]5f714132014-03-26 10:41:167733 }
7734}
7735
[email protected]f878230e2014-04-03 15:36:147736// When a delegate has specified a safe redirect URL, assume that the redirect
7737// URL should not be changed. In particular, the reference fragment should not
7738// be modified.
7739TEST_F(URLRequestTestHTTP, RedirectWithReferenceFragment) {
tommycli59a63432015-11-06 00:10:557740 ASSERT_TRUE(http_test_server()->Start());
[email protected]f878230e2014-04-03 15:36:147741
tommycli59a63432015-11-06 00:10:557742 GURL original_url(
7743 http_test_server()->GetURL("/original#should-not-be-appended"));
[email protected]f878230e2014-04-03 15:36:147744 GURL redirect_url("data:text/html,expect-no-reference-fragment");
7745
7746 default_network_delegate_.set_redirect_on_headers_received_url(redirect_url);
7747 default_network_delegate_.set_allowed_unsafe_redirect_url(redirect_url);
7748
7749 TestDelegate d;
7750 {
rhalavatib7bd7c792017-04-27 05:25:167751 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7752 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f878230e2014-04-03 15:36:147753
[email protected]f7022f32014-08-21 16:32:197754 r->Start();
[email protected]f878230e2014-04-03 15:36:147755 base::RunLoop().Run();
7756
[email protected]f7022f32014-08-21 16:32:197757 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:507758 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197759 EXPECT_EQ(original_url, r->original_url());
7760 EXPECT_EQ(redirect_url, r->url());
[email protected]f878230e2014-04-03 15:36:147761 }
7762}
7763
7764// When a URLRequestRedirectJob is created, the redirection must be followed and
7765// the reference fragment of the target URL must not be modified.
7766TEST_F(URLRequestTestHTTP, RedirectJobWithReferenceFragment) {
tommycli59a63432015-11-06 00:10:557767 ASSERT_TRUE(http_test_server()->Start());
[email protected]f878230e2014-04-03 15:36:147768
tommycli59a63432015-11-06 00:10:557769 GURL original_url(
7770 http_test_server()->GetURL("/original#should-not-be-appended"));
7771 GURL redirect_url(http_test_server()->GetURL("/echo"));
[email protected]f878230e2014-04-03 15:36:147772
7773 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:167774 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
7775 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f878230e2014-04-03 15:36:147776
danakj8522a25b2016-04-16 00:17:367777 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
[email protected]f7022f32014-08-21 16:32:197778 r.get(), &default_network_delegate_, redirect_url,
mmenkeed0498b2015-12-08 23:20:427779 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"));
7780 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]f878230e2014-04-03 15:36:147781
[email protected]f7022f32014-08-21 16:32:197782 r->Start();
[email protected]f878230e2014-04-03 15:36:147783 base::RunLoop().Run();
7784
maksim.sisovb53724b52016-09-16 05:30:507785 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:197786 EXPECT_EQ(original_url, r->original_url());
7787 EXPECT_EQ(redirect_url, r->url());
[email protected]f878230e2014-04-03 15:36:147788}
7789
lizeb5120f6dc2016-02-19 09:29:447790TEST_F(URLRequestTestHTTP, UnsupportedReferrerScheme) {
7791 ASSERT_TRUE(http_test_server()->Start());
7792
7793 const std::string referrer("foobar://totally.legit.referrer");
7794 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367795 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167796 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7797 TRAFFIC_ANNOTATION_FOR_TESTS));
lizeb5120f6dc2016-02-19 09:29:447798 req->SetReferrer(referrer);
7799 req->Start();
7800 base::RunLoop().Run();
7801
7802 EXPECT_EQ(std::string("None"), d.data_received());
7803}
7804
[email protected]316c1e5e2012-09-12 15:17:447805TEST_F(URLRequestTestHTTP, NoUserPassInReferrer) {
tommycli59a63432015-11-06 00:10:557806 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447807
7808 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367809 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167810 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7811 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197812 req->SetReferrer("http://user:[email protected]/");
7813 req->Start();
[email protected]255620da2013-08-19 13:14:297814 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447815
7816 EXPECT_EQ(std::string("http://foo.com/"), d.data_received());
7817}
7818
[email protected]99ecf6e2013-04-10 22:46:137819TEST_F(URLRequestTestHTTP, NoFragmentInReferrer) {
tommycli59a63432015-11-06 00:10:557820 ASSERT_TRUE(http_test_server()->Start());
[email protected]99ecf6e2013-04-10 22:46:137821
7822 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367823 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167824 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7825 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197826 req->SetReferrer("http://foo.com/test#fragment");
7827 req->Start();
[email protected]255620da2013-08-19 13:14:297828 base::RunLoop().Run();
[email protected]99ecf6e2013-04-10 22:46:137829
7830 EXPECT_EQ(std::string("http://foo.com/test"), d.data_received());
7831}
7832
7833TEST_F(URLRequestTestHTTP, EmptyReferrerAfterValidReferrer) {
tommycli59a63432015-11-06 00:10:557834 ASSERT_TRUE(http_test_server()->Start());
[email protected]99ecf6e2013-04-10 22:46:137835
7836 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367837 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167838 http_test_server()->GetURL("/echoheader?Referer"), DEFAULT_PRIORITY, &d,
7839 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197840 req->SetReferrer("http://foo.com/test#fragment");
7841 req->SetReferrer("");
7842 req->Start();
[email protected]255620da2013-08-19 13:14:297843 base::RunLoop().Run();
[email protected]99ecf6e2013-04-10 22:46:137844
7845 EXPECT_EQ(std::string("None"), d.data_received());
7846}
7847
[email protected]316c1e5e2012-09-12 15:17:447848TEST_F(URLRequestTestHTTP, CancelRedirect) {
tommycli59a63432015-11-06 00:10:557849 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447850
7851 TestDelegate d;
7852 {
7853 d.set_cancel_in_received_redirect(true);
danakj8522a25b2016-04-16 00:17:367854 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167855 http_test_server()->GetURL("/redirect-test.html"), DEFAULT_PRIORITY, &d,
7856 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197857 req->Start();
[email protected]255620da2013-08-19 13:14:297858 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447859
7860 EXPECT_EQ(1, d.response_started_count());
7861 EXPECT_EQ(0, d.bytes_received());
7862 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507863 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:447864 }
7865}
7866
7867TEST_F(URLRequestTestHTTP, DeferredRedirect) {
tommycli59a63432015-11-06 00:10:557868 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447869
7870 TestDelegate d;
7871 {
7872 d.set_quit_on_redirect(true);
tommycli59a63432015-11-06 00:10:557873 GURL test_url(http_test_server()->GetURL("/redirect-test.html"));
rhalavatib7bd7c792017-04-27 05:25:167874 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7875 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]79e1fd62013-06-20 06:50:047876
[email protected]f7022f32014-08-21 16:32:197877 req->Start();
[email protected]255620da2013-08-19 13:14:297878 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447879
7880 EXPECT_EQ(1, d.received_redirect_count());
Shivani Sharmac18f9762017-10-23 16:43:237881 EXPECT_TRUE(d.have_full_request_headers());
7882 CheckFullRequestHeaders(d.full_request_headers(), test_url);
7883 d.ClearFullRequestHeaders();
[email protected]316c1e5e2012-09-12 15:17:447884
[email protected]f7022f32014-08-21 16:32:197885 req->FollowDeferredRedirect();
[email protected]255620da2013-08-19 13:14:297886 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447887
7888 EXPECT_EQ(1, d.response_started_count());
7889 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507890 EXPECT_EQ(OK, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:447891
[email protected]6cdfd7f2013-02-08 20:40:157892 base::FilePath path;
[email protected]316c1e5e2012-09-12 15:17:447893 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:477894 path = path.Append(kTestFilePath);
[email protected]316c1e5e2012-09-12 15:17:447895 path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
7896
7897 std::string contents;
[email protected]82f84b92013-08-30 18:23:507898 EXPECT_TRUE(base::ReadFileToString(path, &contents));
[email protected]316c1e5e2012-09-12 15:17:447899 EXPECT_EQ(contents, d.data_received());
7900 }
7901}
7902
[email protected]79e1fd62013-06-20 06:50:047903TEST_F(URLRequestTestHTTP, DeferredRedirect_GetFullRequestHeaders) {
tommycli59a63432015-11-06 00:10:557904 ASSERT_TRUE(http_test_server()->Start());
[email protected]79e1fd62013-06-20 06:50:047905
7906 TestDelegate d;
7907 {
7908 d.set_quit_on_redirect(true);
tommycli59a63432015-11-06 00:10:557909 GURL test_url(http_test_server()->GetURL("/redirect-test.html"));
rhalavatib7bd7c792017-04-27 05:25:167910 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
7911 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]79e1fd62013-06-20 06:50:047912
7913 EXPECT_FALSE(d.have_full_request_headers());
7914
[email protected]f7022f32014-08-21 16:32:197915 req->Start();
[email protected]255620da2013-08-19 13:14:297916 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:047917
7918 EXPECT_EQ(1, d.received_redirect_count());
[email protected]79e1fd62013-06-20 06:50:047919
[email protected]f7022f32014-08-21 16:32:197920 req->FollowDeferredRedirect();
[email protected]255620da2013-08-19 13:14:297921 base::RunLoop().Run();
[email protected]79e1fd62013-06-20 06:50:047922
tommycli59a63432015-11-06 00:10:557923 GURL target_url(http_test_server()->GetURL("/with-headers.html"));
[email protected]79e1fd62013-06-20 06:50:047924 EXPECT_EQ(1, d.response_started_count());
7925 EXPECT_TRUE(d.have_full_request_headers());
7926 CheckFullRequestHeaders(d.full_request_headers(), target_url);
7927 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507928 EXPECT_EQ(OK, d.request_status());
[email protected]79e1fd62013-06-20 06:50:047929
7930 base::FilePath path;
7931 PathService::Get(base::DIR_SOURCE_ROOT, &path);
mmenke9f2ec60c2015-06-01 20:59:477932 path = path.Append(kTestFilePath);
[email protected]79e1fd62013-06-20 06:50:047933 path = path.Append(FILE_PATH_LITERAL("with-headers.html"));
7934
7935 std::string contents;
[email protected]82f84b92013-08-30 18:23:507936 EXPECT_TRUE(base::ReadFileToString(path, &contents));
[email protected]79e1fd62013-06-20 06:50:047937 EXPECT_EQ(contents, d.data_received());
7938 }
7939}
7940
[email protected]316c1e5e2012-09-12 15:17:447941TEST_F(URLRequestTestHTTP, CancelDeferredRedirect) {
tommycli59a63432015-11-06 00:10:557942 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447943
7944 TestDelegate d;
7945 {
7946 d.set_quit_on_redirect(true);
danakj8522a25b2016-04-16 00:17:367947 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:167948 http_test_server()->GetURL("/redirect-test.html"), DEFAULT_PRIORITY, &d,
7949 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:197950 req->Start();
[email protected]255620da2013-08-19 13:14:297951 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447952
7953 EXPECT_EQ(1, d.received_redirect_count());
7954
[email protected]f7022f32014-08-21 16:32:197955 req->Cancel();
[email protected]255620da2013-08-19 13:14:297956 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447957
7958 EXPECT_EQ(1, d.response_started_count());
7959 EXPECT_EQ(0, d.bytes_received());
7960 EXPECT_FALSE(d.received_data_before_response());
maksim.sisovb53724b52016-09-16 05:30:507961 EXPECT_EQ(ERR_ABORTED, d.request_status());
[email protected]316c1e5e2012-09-12 15:17:447962 }
7963}
7964
7965TEST_F(URLRequestTestHTTP, VaryHeader) {
tommycli59a63432015-11-06 00:10:557966 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:447967
[email protected]3b23a222013-05-15 21:33:257968 // Populate the cache.
[email protected]316c1e5e2012-09-12 15:17:447969 {
7970 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367971 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557972 http_test_server()->GetURL("/echoheadercache?foo"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167973 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:447974 HttpRequestHeaders headers;
7975 headers.SetHeader("foo", "1");
[email protected]f7022f32014-08-21 16:32:197976 req->SetExtraRequestHeaders(headers);
7977 req->Start();
[email protected]255620da2013-08-19 13:14:297978 base::RunLoop().Run();
[email protected]3b23a222013-05-15 21:33:257979
7980 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:197981 req->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:257982 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
[email protected]316c1e5e2012-09-12 15:17:447983 }
7984
[email protected]3b23a222013-05-15 21:33:257985 // Expect a cache hit.
[email protected]316c1e5e2012-09-12 15:17:447986 {
7987 TestDelegate d;
danakj8522a25b2016-04-16 00:17:367988 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:557989 http_test_server()->GetURL("/echoheadercache?foo"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:167990 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:447991 HttpRequestHeaders headers;
7992 headers.SetHeader("foo", "1");
[email protected]f7022f32014-08-21 16:32:197993 req->SetExtraRequestHeaders(headers);
7994 req->Start();
[email protected]255620da2013-08-19 13:14:297995 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:447996
[email protected]f7022f32014-08-21 16:32:197997 EXPECT_TRUE(req->was_cached());
[email protected]3b23a222013-05-15 21:33:257998
7999 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:198000 req->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:258001 TestLoadTimingCacheHitNoNetwork(load_timing_info);
[email protected]316c1e5e2012-09-12 15:17:448002 }
8003
[email protected]3b23a222013-05-15 21:33:258004 // Expect a cache miss.
[email protected]316c1e5e2012-09-12 15:17:448005 {
8006 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368007 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558008 http_test_server()->GetURL("/echoheadercache?foo"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:168009 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448010 HttpRequestHeaders headers;
8011 headers.SetHeader("foo", "2");
[email protected]f7022f32014-08-21 16:32:198012 req->SetExtraRequestHeaders(headers);
8013 req->Start();
[email protected]255620da2013-08-19 13:14:298014 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448015
[email protected]f7022f32014-08-21 16:32:198016 EXPECT_FALSE(req->was_cached());
[email protected]3b23a222013-05-15 21:33:258017
8018 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:198019 req->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:258020 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
[email protected]316c1e5e2012-09-12 15:17:448021 }
8022}
8023
8024TEST_F(URLRequestTestHTTP, BasicAuth) {
tommycli59a63432015-11-06 00:10:558025 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448026
8027 // populate the cache
8028 {
8029 TestDelegate d;
8030 d.set_credentials(AuthCredentials(kUser, kSecret));
8031
danakj8522a25b2016-04-16 00:17:368032 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168033 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
8034 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198035 r->Start();
[email protected]316c1e5e2012-09-12 15:17:448036
[email protected]255620da2013-08-19 13:14:298037 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448038
8039 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8040 }
8041
8042 // repeat request with end-to-end validation. since auth-basic results in a
8043 // cachable page, we expect this test to result in a 304. in which case, the
8044 // response should be fetched from the cache.
8045 {
8046 TestDelegate d;
8047 d.set_credentials(AuthCredentials(kUser, kSecret));
8048
danakj8522a25b2016-04-16 00:17:368049 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168050 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
8051 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198052 r->SetLoadFlags(LOAD_VALIDATE_CACHE);
8053 r->Start();
[email protected]316c1e5e2012-09-12 15:17:448054
[email protected]255620da2013-08-19 13:14:298055 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448056
8057 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8058
8059 // Should be the same cached document.
[email protected]f7022f32014-08-21 16:32:198060 EXPECT_TRUE(r->was_cached());
[email protected]316c1e5e2012-09-12 15:17:448061 }
8062}
8063
8064// Check that Set-Cookie headers in 401 responses are respected.
8065// http://crbug.com/6450
8066TEST_F(URLRequestTestHTTP, BasicAuthWithCookies) {
tommycli59a63432015-11-06 00:10:558067 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448068
8069 GURL url_requiring_auth =
tommycli59a63432015-11-06 00:10:558070 http_test_server()->GetURL("/auth-basic?set-cookie-if-challenged");
[email protected]316c1e5e2012-09-12 15:17:448071
8072 // Request a page that will give a 401 containing a Set-Cookie header.
8073 // Verify that when the transaction is restarted, it includes the new cookie.
8074 {
[email protected]ceefd7fd2012-11-29 00:36:248075 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:448076 TestURLRequestContext context(true);
8077 context.set_network_delegate(&network_delegate);
8078 context.Init();
8079
8080 TestDelegate d;
8081 d.set_credentials(AuthCredentials(kUser, kSecret));
8082
danakj8522a25b2016-04-16 00:17:368083 std::unique_ptr<URLRequest> r(
rhalavatib7bd7c792017-04-27 05:25:168084 context.CreateRequest(url_requiring_auth, DEFAULT_PRIORITY, &d,
8085 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198086 r->Start();
[email protected]316c1e5e2012-09-12 15:17:448087
[email protected]255620da2013-08-19 13:14:298088 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448089
8090 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8091
8092 // Make sure we sent the cookie in the restarted transaction.
8093 EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
8094 != std::string::npos);
8095 }
8096
8097 // Same test as above, except this time the restart is initiated earlier
8098 // (without user intervention since identity is embedded in the URL).
8099 {
[email protected]ceefd7fd2012-11-29 00:36:248100 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:448101 TestURLRequestContext context(true);
8102 context.set_network_delegate(&network_delegate);
8103 context.Init();
8104
8105 TestDelegate d;
8106
8107 GURL::Replacements replacements;
mgiuca77752c32015-02-05 07:31:188108 replacements.SetUsernameStr("user2");
8109 replacements.SetPasswordStr("secret");
[email protected]316c1e5e2012-09-12 15:17:448110 GURL url_with_identity = url_requiring_auth.ReplaceComponents(replacements);
8111
rhalavatib7bd7c792017-04-27 05:25:168112 std::unique_ptr<URLRequest> r(context.CreateRequest(
8113 url_with_identity, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198114 r->Start();
[email protected]316c1e5e2012-09-12 15:17:448115
[email protected]255620da2013-08-19 13:14:298116 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448117
8118 EXPECT_TRUE(d.data_received().find("user2/secret") != std::string::npos);
8119
8120 // Make sure we sent the cookie in the restarted transaction.
8121 EXPECT_TRUE(d.data_received().find("Cookie: got_challenged=true")
8122 != std::string::npos);
8123 }
8124}
8125
[email protected]58e32bb2013-01-21 18:23:258126// Tests that load timing works as expected with auth and the cache.
8127TEST_F(URLRequestTestHTTP, BasicAuthLoadTiming) {
tommycli59a63432015-11-06 00:10:558128 ASSERT_TRUE(http_test_server()->Start());
[email protected]58e32bb2013-01-21 18:23:258129
8130 // populate the cache
8131 {
8132 TestDelegate d;
8133 d.set_credentials(AuthCredentials(kUser, kSecret));
8134
danakj8522a25b2016-04-16 00:17:368135 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168136 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
8137 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198138 r->Start();
[email protected]58e32bb2013-01-21 18:23:258139
[email protected]255620da2013-08-19 13:14:298140 base::RunLoop().Run();
[email protected]58e32bb2013-01-21 18:23:258141
8142 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8143
8144 LoadTimingInfo load_timing_info_before_auth;
8145 EXPECT_TRUE(default_network_delegate_.GetLoadTimingInfoBeforeAuth(
8146 &load_timing_info_before_auth));
8147 TestLoadTimingNotReused(load_timing_info_before_auth,
8148 CONNECT_TIMING_HAS_DNS_TIMES);
8149
8150 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:198151 r->GetLoadTimingInfo(&load_timing_info);
[email protected]58e32bb2013-01-21 18:23:258152 // The test server does not support keep alive sockets, so the second
8153 // request with auth should use a new socket.
8154 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
8155 EXPECT_NE(load_timing_info_before_auth.socket_log_id,
8156 load_timing_info.socket_log_id);
8157 EXPECT_LE(load_timing_info_before_auth.receive_headers_end,
8158 load_timing_info.connect_timing.connect_start);
8159 }
8160
[email protected]3b23a222013-05-15 21:33:258161 // Repeat request with end-to-end validation. Since auth-basic results in a
8162 // cachable page, we expect this test to result in a 304. In which case, the
[email protected]58e32bb2013-01-21 18:23:258163 // response should be fetched from the cache.
8164 {
8165 TestDelegate d;
8166 d.set_credentials(AuthCredentials(kUser, kSecret));
8167
danakj8522a25b2016-04-16 00:17:368168 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168169 http_test_server()->GetURL("/auth-basic"), DEFAULT_PRIORITY, &d,
8170 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198171 r->SetLoadFlags(LOAD_VALIDATE_CACHE);
8172 r->Start();
[email protected]58e32bb2013-01-21 18:23:258173
[email protected]255620da2013-08-19 13:14:298174 base::RunLoop().Run();
[email protected]58e32bb2013-01-21 18:23:258175
8176 EXPECT_TRUE(d.data_received().find("user/secret") != std::string::npos);
8177
8178 // Should be the same cached document.
[email protected]f7022f32014-08-21 16:32:198179 EXPECT_TRUE(r->was_cached());
[email protected]58e32bb2013-01-21 18:23:258180
[email protected]3b23a222013-05-15 21:33:258181 // Since there was a request that went over the wire, the load timing
8182 // information should include connection times.
[email protected]58e32bb2013-01-21 18:23:258183 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:198184 r->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:258185 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
[email protected]58e32bb2013-01-21 18:23:258186 }
8187}
8188
[email protected]316c1e5e2012-09-12 15:17:448189// In this test, we do a POST which the server will 302 redirect.
8190// The subsequent transaction should use GET, and should not send the
8191// Content-Type header.
8192// http://code.google.com/p/chromium/issues/detail?id=843
8193TEST_F(URLRequestTestHTTP, Post302RedirectGet) {
tommycli59a63432015-11-06 00:10:558194 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448195
8196 const char kData[] = "hello world";
8197
8198 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368199 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168200 http_test_server()->GetURL("/redirect-to-echoall"), DEFAULT_PRIORITY, &d,
8201 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198202 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:078203 req->set_upload(CreateSimpleUploadData(kData));
[email protected]316c1e5e2012-09-12 15:17:448204
8205 // Set headers (some of which are specific to the POST).
8206 HttpRequestHeaders headers;
8207 headers.AddHeadersFromString(
8208 "Content-Type: multipart/form-data; "
8209 "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n"
8210 "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,"
8211 "text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
8212 "Accept-Language: en-US,en\r\n"
8213 "Accept-Charset: ISO-8859-1,*,utf-8\r\n"
8214 "Content-Length: 11\r\n"
8215 "Origin: http://localhost:1337/");
[email protected]f7022f32014-08-21 16:32:198216 req->SetExtraRequestHeaders(headers);
8217 req->Start();
[email protected]255620da2013-08-19 13:14:298218 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448219
8220 std::string mime_type;
[email protected]f7022f32014-08-21 16:32:198221 req->GetMimeType(&mime_type);
[email protected]316c1e5e2012-09-12 15:17:448222 EXPECT_EQ("text/html", mime_type);
8223
8224 const std::string& data = d.data_received();
8225
8226 // Check that the post-specific headers were stripped:
8227 EXPECT_FALSE(ContainsString(data, "Content-Length:"));
8228 EXPECT_FALSE(ContainsString(data, "Content-Type:"));
Yutaka Hirano957d722f2017-08-31 08:40:498229 EXPECT_FALSE(ContainsString(data, "Origin:"));
[email protected]316c1e5e2012-09-12 15:17:448230
8231 // These extra request headers should not have been stripped.
8232 EXPECT_TRUE(ContainsString(data, "Accept:"));
8233 EXPECT_TRUE(ContainsString(data, "Accept-Language:"));
8234 EXPECT_TRUE(ContainsString(data, "Accept-Charset:"));
8235}
8236
jww5fe460ff2015-03-28 00:22:518237// The following tests check that we handle mutating the request for HTTP
8238// redirects as expected.
8239// See https://crbug.com/56373, https://crbug.com/102130, and
8240// https://crbug.com/465517.
[email protected]316c1e5e2012-09-12 15:17:448241
8242TEST_F(URLRequestTestHTTP, Redirect301Tests) {
tommycli59a63432015-11-06 00:10:558243 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448244
tommycli59a63432015-11-06 00:10:558245 const GURL url = http_test_server()->GetURL("/redirect301-to-echo");
jww5fe460ff2015-03-28 00:22:518246 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558247 http_test_server()->GetURL("/redirect301-to-https");
[email protected]316c1e5e2012-09-12 15:17:448248
8249 HTTPRedirectMethodTest(url, "POST", "GET", true);
8250 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8251 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518252
8253 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8254 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
Yutaka Hirano957d722f2017-08-31 08:40:498255 HTTPRedirectOriginHeaderTest(url, "POST", "GET", std::string());
8256 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "GET",
8257 std::string());
Alex Clarke1e08882b32017-10-06 14:22:408258 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8259 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]316c1e5e2012-09-12 15:17:448260}
8261
8262TEST_F(URLRequestTestHTTP, Redirect302Tests) {
tommycli59a63432015-11-06 00:10:558263 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448264
tommycli59a63432015-11-06 00:10:558265 const GURL url = http_test_server()->GetURL("/redirect302-to-echo");
jww5fe460ff2015-03-28 00:22:518266 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558267 http_test_server()->GetURL("/redirect302-to-https");
[email protected]316c1e5e2012-09-12 15:17:448268
8269 HTTPRedirectMethodTest(url, "POST", "GET", true);
8270 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8271 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518272
8273 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8274 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
Yutaka Hirano957d722f2017-08-31 08:40:498275 HTTPRedirectOriginHeaderTest(url, "POST", "GET", std::string());
8276 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "GET",
8277 std::string());
Alex Clarke1e08882b32017-10-06 14:22:408278 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8279 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]316c1e5e2012-09-12 15:17:448280}
8281
8282TEST_F(URLRequestTestHTTP, Redirect303Tests) {
tommycli59a63432015-11-06 00:10:558283 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448284
tommycli59a63432015-11-06 00:10:558285 const GURL url = http_test_server()->GetURL("/redirect303-to-echo");
jww5fe460ff2015-03-28 00:22:518286 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558287 http_test_server()->GetURL("/redirect303-to-https");
[email protected]316c1e5e2012-09-12 15:17:448288
8289 HTTPRedirectMethodTest(url, "POST", "GET", true);
8290 HTTPRedirectMethodTest(url, "PUT", "GET", true);
8291 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518292
Alex Clarke1e08882b32017-10-06 14:22:408293 HTTPRedirectOriginHeaderTest(url, "CONNECT", "GET", std::string());
8294 HTTPRedirectOriginHeaderTest(https_redirect_url, "CONNECT", "GET",
8295 std::string());
8296 HTTPRedirectOriginHeaderTest(url, "DELETE", "GET", std::string());
8297 HTTPRedirectOriginHeaderTest(https_redirect_url, "DELETE", "GET",
8298 std::string());
jww5fe460ff2015-03-28 00:22:518299 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8300 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
Alex Clarke1e08882b32017-10-06 14:22:408301 HTTPRedirectOriginHeaderTest(url, "HEAD", "HEAD", url.GetOrigin().spec());
8302 HTTPRedirectOriginHeaderTest(https_redirect_url, "HEAD", "HEAD", "null");
8303 HTTPRedirectOriginHeaderTest(url, "OPTIONS", "GET", std::string());
8304 HTTPRedirectOriginHeaderTest(https_redirect_url, "OPTIONS", "GET",
8305 std::string());
Yutaka Hirano957d722f2017-08-31 08:40:498306 HTTPRedirectOriginHeaderTest(url, "POST", "GET", std::string());
8307 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "GET",
8308 std::string());
Alex Clarke1e08882b32017-10-06 14:22:408309 HTTPRedirectOriginHeaderTest(url, "PUT", "GET", std::string());
8310 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "GET", std::string());
[email protected]316c1e5e2012-09-12 15:17:448311}
8312
8313TEST_F(URLRequestTestHTTP, Redirect307Tests) {
tommycli59a63432015-11-06 00:10:558314 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448315
tommycli59a63432015-11-06 00:10:558316 const GURL url = http_test_server()->GetURL("/redirect307-to-echo");
jww5fe460ff2015-03-28 00:22:518317 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558318 http_test_server()->GetURL("/redirect307-to-https");
[email protected]316c1e5e2012-09-12 15:17:448319
8320 HTTPRedirectMethodTest(url, "POST", "POST", true);
8321 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8322 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518323
8324 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8325 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
8326 HTTPRedirectOriginHeaderTest(url, "POST", "POST", url.GetOrigin().spec());
8327 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "POST", "null");
Alex Clarke1e08882b32017-10-06 14:22:408328 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8329 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]316c1e5e2012-09-12 15:17:448330}
8331
[email protected]0a17aab32014-04-24 03:32:378332TEST_F(URLRequestTestHTTP, Redirect308Tests) {
tommycli59a63432015-11-06 00:10:558333 ASSERT_TRUE(http_test_server()->Start());
[email protected]0a17aab32014-04-24 03:32:378334
tommycli59a63432015-11-06 00:10:558335 const GURL url = http_test_server()->GetURL("/redirect308-to-echo");
jww5fe460ff2015-03-28 00:22:518336 const GURL https_redirect_url =
tommycli59a63432015-11-06 00:10:558337 http_test_server()->GetURL("/redirect308-to-https");
[email protected]0a17aab32014-04-24 03:32:378338
8339 HTTPRedirectMethodTest(url, "POST", "POST", true);
8340 HTTPRedirectMethodTest(url, "PUT", "PUT", true);
8341 HTTPRedirectMethodTest(url, "HEAD", "HEAD", false);
jww5fe460ff2015-03-28 00:22:518342
8343 HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec());
8344 HTTPRedirectOriginHeaderTest(https_redirect_url, "GET", "GET", "null");
8345 HTTPRedirectOriginHeaderTest(url, "POST", "POST", url.GetOrigin().spec());
8346 HTTPRedirectOriginHeaderTest(https_redirect_url, "POST", "POST", "null");
Alex Clarke1e08882b32017-10-06 14:22:408347 HTTPRedirectOriginHeaderTest(url, "PUT", "PUT", url.GetOrigin().spec());
8348 HTTPRedirectOriginHeaderTest(https_redirect_url, "PUT", "PUT", "null");
[email protected]0a17aab32014-04-24 03:32:378349}
8350
8351// Make sure that 308 responses without bodies are not treated as redirects.
8352// Certain legacy apis that pre-date the response code expect this behavior
8353// (Like Google Drive).
8354TEST_F(URLRequestTestHTTP, NoRedirectOn308WithoutLocationHeader) {
tommycli59a63432015-11-06 00:10:558355 ASSERT_TRUE(http_test_server()->Start());
[email protected]0a17aab32014-04-24 03:32:378356
8357 TestDelegate d;
tommycli59a63432015-11-06 00:10:558358 const GURL url = http_test_server()->GetURL("/308-without-location-header");
[email protected]0a17aab32014-04-24 03:32:378359
rhalavatib7bd7c792017-04-27 05:25:168360 std::unique_ptr<URLRequest> request(default_context_.CreateRequest(
8361 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]0a17aab32014-04-24 03:32:378362
[email protected]f7022f32014-08-21 16:32:198363 request->Start();
[email protected]0a17aab32014-04-24 03:32:378364 base::RunLoop().Run();
maksim.sisovb53724b52016-09-16 05:30:508365 EXPECT_EQ(OK, d.request_status());
[email protected]0a17aab32014-04-24 03:32:378366 EXPECT_EQ(0, d.received_redirect_count());
[email protected]f7022f32014-08-21 16:32:198367 EXPECT_EQ(308, request->response_headers()->response_code());
[email protected]0a17aab32014-04-24 03:32:378368 EXPECT_EQ("This is not a redirect.", d.data_received());
8369}
8370
[email protected]f878230e2014-04-03 15:36:148371TEST_F(URLRequestTestHTTP, Redirect302PreserveReferenceFragment) {
tommycli59a63432015-11-06 00:10:558372 ASSERT_TRUE(http_test_server()->Start());
[email protected]f878230e2014-04-03 15:36:148373
tommycli59a63432015-11-06 00:10:558374 GURL original_url(
8375 http_test_server()->GetURL("/redirect302-to-echo#fragment"));
8376 GURL expected_url(http_test_server()->GetURL("/echo#fragment"));
[email protected]f878230e2014-04-03 15:36:148377
8378 TestDelegate d;
8379 {
rhalavatib7bd7c792017-04-27 05:25:168380 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
8381 original_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f878230e2014-04-03 15:36:148382
[email protected]f7022f32014-08-21 16:32:198383 r->Start();
[email protected]f878230e2014-04-03 15:36:148384 base::RunLoop().Run();
8385
[email protected]f7022f32014-08-21 16:32:198386 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:508387 EXPECT_EQ(OK, d.request_status());
[email protected]f7022f32014-08-21 16:32:198388 EXPECT_EQ(original_url, r->original_url());
8389 EXPECT_EQ(expected_url, r->url());
[email protected]f878230e2014-04-03 15:36:148390 }
8391}
8392
[email protected]cba24642014-08-15 20:49:598393TEST_F(URLRequestTestHTTP, RedirectPreserveFirstPartyURL) {
tommycli59a63432015-11-06 00:10:558394 ASSERT_TRUE(http_test_server()->Start());
[email protected]cba24642014-08-15 20:49:598395
tommycli59a63432015-11-06 00:10:558396 GURL url(http_test_server()->GetURL("/redirect302-to-echo"));
[email protected]cba24642014-08-15 20:49:598397 GURL first_party_url("http://example.com");
8398
8399 TestDelegate d;
8400 {
rhalavatib7bd7c792017-04-27 05:25:168401 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
8402 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:468403 r->set_site_for_cookies(first_party_url);
[email protected]cba24642014-08-15 20:49:598404
[email protected]f7022f32014-08-21 16:32:198405 r->Start();
[email protected]cba24642014-08-15 20:49:598406 base::RunLoop().Run();
8407
[email protected]f7022f32014-08-21 16:32:198408 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:508409 EXPECT_EQ(OK, d.request_status());
Mike Westb85da8ed2017-08-10 14:16:468410 EXPECT_EQ(first_party_url, r->site_for_cookies());
[email protected]cba24642014-08-15 20:49:598411 }
8412}
8413
8414TEST_F(URLRequestTestHTTP, RedirectUpdateFirstPartyURL) {
tommycli59a63432015-11-06 00:10:558415 ASSERT_TRUE(http_test_server()->Start());
[email protected]cba24642014-08-15 20:49:598416
tommycli59a63432015-11-06 00:10:558417 GURL url(http_test_server()->GetURL("/redirect302-to-echo"));
[email protected]cba24642014-08-15 20:49:598418 GURL original_first_party_url("http://example.com");
tommycli59a63432015-11-06 00:10:558419 GURL expected_first_party_url(http_test_server()->GetURL("/echo"));
[email protected]cba24642014-08-15 20:49:598420
8421 TestDelegate d;
8422 {
rhalavatib7bd7c792017-04-27 05:25:168423 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
8424 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
Mike Westb85da8ed2017-08-10 14:16:468425 r->set_site_for_cookies(original_first_party_url);
[email protected]f7022f32014-08-21 16:32:198426 r->set_first_party_url_policy(
[email protected]cba24642014-08-15 20:49:598427 URLRequest::UPDATE_FIRST_PARTY_URL_ON_REDIRECT);
8428
[email protected]f7022f32014-08-21 16:32:198429 r->Start();
[email protected]cba24642014-08-15 20:49:598430 base::RunLoop().Run();
8431
[email protected]f7022f32014-08-21 16:32:198432 EXPECT_EQ(2U, r->url_chain().size());
maksim.sisovb53724b52016-09-16 05:30:508433 EXPECT_EQ(OK, d.request_status());
Mike Westb85da8ed2017-08-10 14:16:468434 EXPECT_EQ(expected_first_party_url, r->site_for_cookies());
[email protected]cba24642014-08-15 20:49:598435 }
8436}
8437
[email protected]316c1e5e2012-09-12 15:17:448438TEST_F(URLRequestTestHTTP, InterceptPost302RedirectGet) {
tommycli59a63432015-11-06 00:10:558439 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448440
8441 const char kData[] = "hello world";
8442
8443 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368444 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168445 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
8446 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198447 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:078448 req->set_upload(CreateSimpleUploadData(kData));
[email protected]316c1e5e2012-09-12 15:17:448449 HttpRequestHeaders headers;
8450 headers.SetHeader(HttpRequestHeaders::kContentLength,
Brett Wilson5accd242017-11-30 22:07:328451 base::NumberToString(arraysize(kData) - 1));
[email protected]f7022f32014-08-21 16:32:198452 req->SetExtraRequestHeaders(headers);
[email protected]316c1e5e2012-09-12 15:17:448453
danakj8522a25b2016-04-16 00:17:368454 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
tommycli59a63432015-11-06 00:10:558455 req.get(), &default_network_delegate_,
8456 http_test_server()->GetURL("/echo"),
mmenkeed0498b2015-12-08 23:20:428457 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"));
8458 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]316c1e5e2012-09-12 15:17:448459
[email protected]f7022f32014-08-21 16:32:198460 req->Start();
[email protected]255620da2013-08-19 13:14:298461 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:198462 EXPECT_EQ("GET", req->method());
[email protected]316c1e5e2012-09-12 15:17:448463}
8464
8465TEST_F(URLRequestTestHTTP, InterceptPost307RedirectPost) {
tommycli59a63432015-11-06 00:10:558466 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448467
8468 const char kData[] = "hello world";
8469
8470 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368471 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168472 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
8473 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198474 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:078475 req->set_upload(CreateSimpleUploadData(kData));
[email protected]316c1e5e2012-09-12 15:17:448476 HttpRequestHeaders headers;
8477 headers.SetHeader(HttpRequestHeaders::kContentLength,
Brett Wilson5accd242017-11-30 22:07:328478 base::NumberToString(arraysize(kData) - 1));
[email protected]f7022f32014-08-21 16:32:198479 req->SetExtraRequestHeaders(headers);
[email protected]316c1e5e2012-09-12 15:17:448480
danakj8522a25b2016-04-16 00:17:368481 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
tommycli59a63432015-11-06 00:10:558482 req.get(), &default_network_delegate_,
8483 http_test_server()->GetURL("/echo"),
[email protected]7983c4a2014-03-12 01:47:098484 URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT,
mmenkeed0498b2015-12-08 23:20:428485 "Very Good Reason"));
8486 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]316c1e5e2012-09-12 15:17:448487
[email protected]f7022f32014-08-21 16:32:198488 req->Start();
[email protected]255620da2013-08-19 13:14:298489 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:198490 EXPECT_EQ("POST", req->method());
[email protected]316c1e5e2012-09-12 15:17:448491 EXPECT_EQ(kData, d.data_received());
8492}
8493
8494// Check that default A-L header is sent.
8495TEST_F(URLRequestTestHTTP, DefaultAcceptLanguage) {
tommycli59a63432015-11-06 00:10:558496 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448497
[email protected]8790210c2013-12-02 05:29:538498 StaticHttpUserAgentSettings settings("en", std::string());
[email protected]ceefd7fd2012-11-29 00:36:248499 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]316c1e5e2012-09-12 15:17:448500 TestURLRequestContext context(true);
8501 context.set_network_delegate(&network_delegate);
[email protected]ee4c30d2012-11-07 15:08:438502 context.set_http_user_agent_settings(&settings);
[email protected]316c1e5e2012-09-12 15:17:448503 context.Init();
8504
8505 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368506 std::unique_ptr<URLRequest> req(context.CreateRequest(
tommycli59a63432015-11-06 00:10:558507 http_test_server()->GetURL("/echoheader?Accept-Language"),
rhalavatib7bd7c792017-04-27 05:25:168508 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198509 req->Start();
[email protected]255620da2013-08-19 13:14:298510 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448511 EXPECT_EQ("en", d.data_received());
8512}
8513
8514// Check that an empty A-L header is not sent. http://crbug.com/77365.
8515TEST_F(URLRequestTestHTTP, EmptyAcceptLanguage) {
tommycli59a63432015-11-06 00:10:558516 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448517
[email protected]8790210c2013-12-02 05:29:538518 std::string empty_string; // Avoid most vexing parse on line below.
8519 StaticHttpUserAgentSettings settings(empty_string, empty_string);
[email protected]ceefd7fd2012-11-29 00:36:248520 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]316c1e5e2012-09-12 15:17:448521 TestURLRequestContext context(true);
8522 context.set_network_delegate(&network_delegate);
8523 context.Init();
8524 // We override the language after initialization because empty entries
8525 // get overridden by Init().
[email protected]ee4c30d2012-11-07 15:08:438526 context.set_http_user_agent_settings(&settings);
[email protected]316c1e5e2012-09-12 15:17:448527
8528 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368529 std::unique_ptr<URLRequest> req(context.CreateRequest(
tommycli59a63432015-11-06 00:10:558530 http_test_server()->GetURL("/echoheader?Accept-Language"),
rhalavatib7bd7c792017-04-27 05:25:168531 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198532 req->Start();
[email protected]255620da2013-08-19 13:14:298533 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448534 EXPECT_EQ("None", d.data_received());
8535}
8536
8537// Check that if request overrides the A-L header, the default is not appended.
8538// See http://crbug.com/20894
8539TEST_F(URLRequestTestHTTP, OverrideAcceptLanguage) {
tommycli59a63432015-11-06 00:10:558540 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448541
8542 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368543 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558544 http_test_server()->GetURL("/echoheader?Accept-Language"),
rhalavatib7bd7c792017-04-27 05:25:168545 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448546 HttpRequestHeaders headers;
8547 headers.SetHeader(HttpRequestHeaders::kAcceptLanguage, "ru");
[email protected]f7022f32014-08-21 16:32:198548 req->SetExtraRequestHeaders(headers);
8549 req->Start();
[email protected]255620da2013-08-19 13:14:298550 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448551 EXPECT_EQ(std::string("ru"), d.data_received());
8552}
8553
8554// Check that default A-E header is sent.
8555TEST_F(URLRequestTestHTTP, DefaultAcceptEncoding) {
tommycli59a63432015-11-06 00:10:558556 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448557
8558 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368559 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558560 http_test_server()->GetURL("/echoheader?Accept-Encoding"),
rhalavatib7bd7c792017-04-27 05:25:168561 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448562 HttpRequestHeaders headers;
[email protected]f7022f32014-08-21 16:32:198563 req->SetExtraRequestHeaders(headers);
8564 req->Start();
[email protected]255620da2013-08-19 13:14:298565 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448566 EXPECT_TRUE(ContainsString(d.data_received(), "gzip"));
8567}
8568
8569// Check that if request overrides the A-E header, the default is not appended.
8570// See http://crbug.com/47381
8571TEST_F(URLRequestTestHTTP, OverrideAcceptEncoding) {
tommycli59a63432015-11-06 00:10:558572 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448573
8574 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368575 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558576 http_test_server()->GetURL("/echoheader?Accept-Encoding"),
rhalavatib7bd7c792017-04-27 05:25:168577 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448578 HttpRequestHeaders headers;
8579 headers.SetHeader(HttpRequestHeaders::kAcceptEncoding, "identity");
[email protected]f7022f32014-08-21 16:32:198580 req->SetExtraRequestHeaders(headers);
8581 req->Start();
[email protected]255620da2013-08-19 13:14:298582 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448583 EXPECT_FALSE(ContainsString(d.data_received(), "gzip"));
8584 EXPECT_TRUE(ContainsString(d.data_received(), "identity"));
8585}
8586
[email protected]84f05432013-03-15 01:00:128587// Check that setting the A-C header sends the proper header.
8588TEST_F(URLRequestTestHTTP, SetAcceptCharset) {
tommycli59a63432015-11-06 00:10:558589 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448590
8591 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368592 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558593 http_test_server()->GetURL("/echoheader?Accept-Charset"),
rhalavatib7bd7c792017-04-27 05:25:168594 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448595 HttpRequestHeaders headers;
8596 headers.SetHeader(HttpRequestHeaders::kAcceptCharset, "koi-8r");
[email protected]f7022f32014-08-21 16:32:198597 req->SetExtraRequestHeaders(headers);
8598 req->Start();
[email protected]255620da2013-08-19 13:14:298599 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:448600 EXPECT_EQ(std::string("koi-8r"), d.data_received());
8601}
8602
8603// Check that default User-Agent header is sent.
8604TEST_F(URLRequestTestHTTP, DefaultUserAgent) {
tommycli59a63432015-11-06 00:10:558605 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448606
8607 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368608 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558609 http_test_server()->GetURL("/echoheader?User-Agent"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:168610 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198611 req->Start();
[email protected]255620da2013-08-19 13:14:298612 base::RunLoop().Run();
[email protected]f7022f32014-08-21 16:32:198613 EXPECT_EQ(default_context_.http_user_agent_settings()->GetUserAgent(),
[email protected]051a4b32014-01-09 04:02:378614 d.data_received());
[email protected]316c1e5e2012-09-12 15:17:448615}
8616
8617// Check that if request overrides the User-Agent header,
8618// the default is not appended.
marqf14fff8d2015-12-02 15:52:298619// TODO(crbug.com/564656) This test is flaky on iOS.
8620#if defined(OS_IOS)
8621#define MAYBE_OverrideUserAgent FLAKY_OverrideUserAgent
8622#else
8623#define MAYBE_OverrideUserAgent OverrideUserAgent
8624#endif
8625TEST_F(URLRequestTestHTTP, MAYBE_OverrideUserAgent) {
tommycli59a63432015-11-06 00:10:558626 ASSERT_TRUE(http_test_server()->Start());
[email protected]316c1e5e2012-09-12 15:17:448627
8628 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368629 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:558630 http_test_server()->GetURL("/echoheader?User-Agent"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:168631 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:448632 HttpRequestHeaders headers;
8633 headers.SetHeader(HttpRequestHeaders::kUserAgent, "Lynx (textmode)");
[email protected]f7022f32014-08-21 16:32:198634 req->SetExtraRequestHeaders(headers);
8635 req->Start();
[email protected]255620da2013-08-19 13:14:298636 base::RunLoop().Run();
[email protected]cd6f2522014-01-16 18:27:358637 EXPECT_EQ(std::string("Lynx (textmode)"), d.data_received());
[email protected]316c1e5e2012-09-12 15:17:448638}
8639
[email protected]ee4c30d2012-11-07 15:08:438640// Check that a NULL HttpUserAgentSettings causes the corresponding empty
8641// User-Agent header to be sent but does not send the Accept-Language and
8642// Accept-Charset headers.
8643TEST_F(URLRequestTestHTTP, EmptyHttpUserAgentSettings) {
tommycli59a63432015-11-06 00:10:558644 ASSERT_TRUE(http_test_server()->Start());
[email protected]ee4c30d2012-11-07 15:08:438645
[email protected]ceefd7fd2012-11-29 00:36:248646 TestNetworkDelegate network_delegate; // Must outlive URLRequests.
[email protected]ee4c30d2012-11-07 15:08:438647 TestURLRequestContext context(true);
8648 context.set_network_delegate(&network_delegate);
8649 context.Init();
8650 // We override the HttpUserAgentSettings after initialization because empty
8651 // entries get overridden by Init().
8652 context.set_http_user_agent_settings(NULL);
8653
8654 struct {
8655 const char* request;
8656 const char* expected_response;
tommycli59a63432015-11-06 00:10:558657 } tests[] = {{"/echoheader?Accept-Language", "None"},
8658 {"/echoheader?Accept-Charset", "None"},
8659 {"/echoheader?User-Agent", ""}};
[email protected]ee4c30d2012-11-07 15:08:438660
viettrungluue4a8b882014-10-16 06:17:388661 for (size_t i = 0; i < arraysize(tests); i++) {
[email protected]ee4c30d2012-11-07 15:08:438662 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368663 std::unique_ptr<URLRequest> req(context.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168664 http_test_server()->GetURL(tests[i].request), DEFAULT_PRIORITY, &d,
8665 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198666 req->Start();
[email protected]255620da2013-08-19 13:14:298667 base::RunLoop().Run();
[email protected]ee4c30d2012-11-07 15:08:438668 EXPECT_EQ(tests[i].expected_response, d.data_received())
8669 << " Request = \"" << tests[i].request << "\"";
8670 }
8671}
8672
[email protected]5033ab82013-03-22 20:17:468673// Make sure that URLRequest passes on its priority updates to
8674// newly-created jobs after the first one.
8675TEST_F(URLRequestTestHTTP, SetSubsequentJobPriority) {
tommycli59a63432015-11-06 00:10:558676 ASSERT_TRUE(http_test_server()->Start());
[email protected]5033ab82013-03-22 20:17:468677
8678 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368679 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168680 http_test_server()->GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
8681 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198682 EXPECT_EQ(DEFAULT_PRIORITY, req->priority());
[email protected]5033ab82013-03-22 20:17:468683
danakj8522a25b2016-04-16 00:17:368684 std::unique_ptr<URLRequestRedirectJob> redirect_job(new URLRequestRedirectJob(
tommycli59a63432015-11-06 00:10:558685 req.get(), &default_network_delegate_,
8686 http_test_server()->GetURL("/echo"),
mmenkeed0498b2015-12-08 23:20:428687 URLRequestRedirectJob::REDIRECT_302_FOUND, "Very Good Reason"));
8688 AddTestInterceptor()->set_main_intercept_job(std::move(redirect_job));
[email protected]5033ab82013-03-22 20:17:468689
[email protected]f7022f32014-08-21 16:32:198690 req->SetPriority(LOW);
8691 req->Start();
8692 EXPECT_TRUE(req->is_pending());
[email protected]5033ab82013-03-22 20:17:468693
mmenkeed0498b2015-12-08 23:20:428694 RequestPriority job_priority;
danakj8522a25b2016-04-16 00:17:368695 std::unique_ptr<URLRequestJob> job(new PriorityMonitoringURLRequestJob(
mmenkeed0498b2015-12-08 23:20:428696 req.get(), &default_network_delegate_, &job_priority));
8697 AddTestInterceptor()->set_main_intercept_job(std::move(job));
[email protected]5033ab82013-03-22 20:17:468698
8699 // Should trigger |job| to be started.
[email protected]255620da2013-08-19 13:14:298700 base::RunLoop().Run();
mmenkeed0498b2015-12-08 23:20:428701 EXPECT_EQ(LOW, job_priority);
[email protected]5033ab82013-03-22 20:17:468702}
8703
[email protected]80abdad2014-03-15 00:20:548704// Check that creating a network request while entering/exiting suspend mode
8705// fails as it should. This is the only case where an HttpTransactionFactory
8706// does not return an HttpTransaction.
8707TEST_F(URLRequestTestHTTP, NetworkSuspendTest) {
8708 // Create a new HttpNetworkLayer that thinks it's suspended.
danakj8522a25b2016-04-16 00:17:368709 std::unique_ptr<HttpNetworkLayer> network_layer(new HttpNetworkLayer(
mmenke2281f3762015-11-02 20:38:178710 default_context_.http_transaction_factory()->GetSession()));
[email protected]80abdad2014-03-15 00:20:548711 network_layer->OnSuspend();
8712
dchengc7eeda422015-12-26 03:56:488713 HttpCache http_cache(std::move(network_layer),
zhongyi3ceab9f2017-02-04 02:06:038714 HttpCache::DefaultBackend::InMemory(0),
zhongyi4928bd52017-02-08 02:16:278715 false /* is_main_cache */);
[email protected]80abdad2014-03-15 00:20:548716
8717 TestURLRequestContext context(true);
8718 context.set_http_transaction_factory(&http_cache);
8719 context.Init();
8720
8721 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368722 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:168723 context.CreateRequest(GURL("http://127.0.0.1/"), DEFAULT_PRIORITY, &d,
8724 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:198725 req->Start();
[email protected]80abdad2014-03-15 00:20:548726 base::RunLoop().Run();
8727
8728 EXPECT_TRUE(d.request_failed());
maksim.sisovb53724b52016-09-16 05:30:508729 EXPECT_EQ(ERR_NETWORK_IO_SUSPENDED, d.request_status());
[email protected]80abdad2014-03-15 00:20:548730}
8731
mmenke2281f3762015-11-02 20:38:178732namespace {
[email protected]80abdad2014-03-15 00:20:548733
mmenke2281f3762015-11-02 20:38:178734// HttpTransactionFactory that synchronously fails to create transactions.
8735class FailingHttpTransactionFactory : public HttpTransactionFactory {
8736 public:
8737 explicit FailingHttpTransactionFactory(HttpNetworkSession* network_session)
8738 : network_session_(network_session) {}
8739
Chris Watkins7a41d3552017-12-01 02:13:278740 ~FailingHttpTransactionFactory() override = default;
mmenke2281f3762015-11-02 20:38:178741
8742 // HttpTransactionFactory methods:
8743 int CreateTransaction(RequestPriority priority,
danakj8522a25b2016-04-16 00:17:368744 std::unique_ptr<HttpTransaction>* trans) override {
mmenke2281f3762015-11-02 20:38:178745 return ERR_FAILED;
8746 }
8747
8748 HttpCache* GetCache() override { return nullptr; }
8749
8750 HttpNetworkSession* GetSession() override { return network_session_; }
8751
8752 private:
8753 HttpNetworkSession* network_session_;
8754
8755 DISALLOW_COPY_AND_ASSIGN(FailingHttpTransactionFactory);
8756};
8757
8758} // namespace
8759
8760// Check that when a request that fails to create an HttpTransaction can be
8761// cancelled while the failure notification is pending, and doesn't send two
8762// failure notifications.
8763//
8764// This currently only happens when in suspend mode and there's no cache, but
8765// just use a special HttpTransactionFactory, to avoid depending on those
8766// behaviors.
8767TEST_F(URLRequestTestHTTP, NetworkCancelAfterCreateTransactionFailsTest) {
8768 FailingHttpTransactionFactory http_transaction_factory(
8769 default_context_.http_transaction_factory()->GetSession());
[email protected]80abdad2014-03-15 00:20:548770 TestURLRequestContext context(true);
mmenke2281f3762015-11-02 20:38:178771 context.set_http_transaction_factory(&http_transaction_factory);
8772 context.set_network_delegate(default_network_delegate());
[email protected]80abdad2014-03-15 00:20:548773 context.Init();
8774
8775 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368776 std::unique_ptr<URLRequest> req(
rhalavatib7bd7c792017-04-27 05:25:168777 context.CreateRequest(GURL("http://127.0.0.1/"), DEFAULT_PRIORITY, &d,
8778 TRAFFIC_ANNOTATION_FOR_TESTS));
mmenke2281f3762015-11-02 20:38:178779 // Don't send cookies (Collecting cookies is asynchronous, and need request to
8780 // try to create an HttpNetworkTransaction synchronously on start).
8781 req->SetLoadFlags(LOAD_DO_NOT_SEND_COOKIES);
[email protected]f7022f32014-08-21 16:32:198782 req->Start();
mmenke2281f3762015-11-02 20:38:178783 req->Cancel();
[email protected]80abdad2014-03-15 00:20:548784 base::RunLoop().Run();
mmenke2281f3762015-11-02 20:38:178785 // Run pending error task, if there is one.
8786 base::RunLoop().RunUntilIdle();
[email protected]80abdad2014-03-15 00:20:548787
8788 EXPECT_TRUE(d.request_failed());
mmenke2281f3762015-11-02 20:38:178789 EXPECT_EQ(1, d.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:508790 EXPECT_EQ(ERR_ABORTED, d.request_status());
mmenke2281f3762015-11-02 20:38:178791
8792 // NetworkDelegate should see the cancellation, but not the error.
8793 EXPECT_EQ(1, default_network_delegate()->canceled_requests());
8794 EXPECT_EQ(0, default_network_delegate()->error_count());
[email protected]80abdad2014-03-15 00:20:548795}
8796
ttuttlec0c828492015-05-15 01:25:558797TEST_F(URLRequestTestHTTP, NetworkAccessedSetOnNetworkRequest) {
tommycli59a63432015-11-06 00:10:558798 ASSERT_TRUE(http_test_server()->Start());
ttuttlec0c828492015-05-15 01:25:558799
8800 TestDelegate d;
tommycli59a63432015-11-06 00:10:558801 GURL test_url(http_test_server()->GetURL("/"));
rhalavatib7bd7c792017-04-27 05:25:168802 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
8803 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:558804
8805 req->Start();
8806 base::RunLoop().Run();
8807
8808 EXPECT_TRUE(req->response_info().network_accessed);
8809}
8810
8811TEST_F(URLRequestTestHTTP, NetworkAccessedClearOnCachedResponse) {
tommycli59a63432015-11-06 00:10:558812 ASSERT_TRUE(http_test_server()->Start());
ttuttlec0c828492015-05-15 01:25:558813
8814 // Populate the cache.
8815 TestDelegate d;
danakj8522a25b2016-04-16 00:17:368816 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:168817 http_test_server()->GetURL("/cachetime"), DEFAULT_PRIORITY, &d,
8818 TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:558819 req->Start();
8820 base::RunLoop().Run();
8821
maksim.sisovb53724b52016-09-16 05:30:508822 EXPECT_EQ(OK, d.request_status());
ttuttlec0c828492015-05-15 01:25:558823 EXPECT_TRUE(req->response_info().network_accessed);
8824 EXPECT_FALSE(req->response_info().was_cached);
8825
tommycli59a63432015-11-06 00:10:558826 req = default_context_.CreateRequest(http_test_server()->GetURL("/cachetime"),
rhalavatib7bd7c792017-04-27 05:25:168827 DEFAULT_PRIORITY, &d,
8828 TRAFFIC_ANNOTATION_FOR_TESTS);
ttuttlec0c828492015-05-15 01:25:558829 req->Start();
8830 base::RunLoop().Run();
8831
maksim.sisovb53724b52016-09-16 05:30:508832 EXPECT_EQ(OK, d.request_status());
ttuttlec0c828492015-05-15 01:25:558833 EXPECT_FALSE(req->response_info().network_accessed);
8834 EXPECT_TRUE(req->response_info().was_cached);
8835}
8836
8837TEST_F(URLRequestTestHTTP, NetworkAccessedClearOnLoadOnlyFromCache) {
tommycli59a63432015-11-06 00:10:558838 ASSERT_TRUE(http_test_server()->Start());
ttuttlec0c828492015-05-15 01:25:558839
8840 TestDelegate d;
tommycli59a63432015-11-06 00:10:558841 GURL test_url(http_test_server()->GetURL("/"));
rhalavatib7bd7c792017-04-27 05:25:168842 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
8843 test_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
jkarlina067deed2016-10-27 14:48:338844 req->SetLoadFlags(LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION);
ttuttlec0c828492015-05-15 01:25:558845
8846 req->Start();
8847 base::RunLoop().Run();
8848
8849 EXPECT_FALSE(req->response_info().network_accessed);
8850}
8851
rdsmithbf8c3c12016-11-18 18:16:248852// Test that a single job with a THROTTLED priority completes
rdsmith5eb6fbc2016-10-21 17:36:088853// correctly in the absence of contention.
8854TEST_F(URLRequestTestHTTP, ThrottledPriority) {
8855 ASSERT_TRUE(http_test_server()->Start());
8856
8857 TestDelegate d;
8858 GURL test_url(http_test_server()->GetURL("/"));
rhalavatib7bd7c792017-04-27 05:25:168859 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
8860 test_url, THROTTLED, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmith5eb6fbc2016-10-21 17:36:088861 req->Start();
8862 base::RunLoop().Run();
8863
8864 EXPECT_TRUE(req->status().is_success());
8865}
8866
rdsmithbf8c3c12016-11-18 18:16:248867// A class to hold state for responding to USER_NOTIFY callbacks from
8868// BlockingNetworkDelegate. It also accepts a RunLoop that will be
8869// signaled via QuitWhenIdle() when any request is blocked.
8870//
8871class NotificationCallbackHandler {
8872 public:
8873 // Default constructed object doesn't block anything.
8874 NotificationCallbackHandler() : run_loop_(nullptr) {}
8875
8876 void AddURLRequestToBlockList(const URLRequest* request) {
8877 requests_to_block_.insert(request);
8878 }
8879
8880 Error ShouldBlockRequest(const CompletionCallback& callback,
8881 const URLRequest* request) {
8882 if (requests_to_block_.find(request) == requests_to_block_.end()) {
8883 return OK;
8884 }
8885
8886 DCHECK(blocked_callbacks_.find(request) == blocked_callbacks_.end());
8887 blocked_callbacks_[request] = callback;
8888 if (run_loop_ && blocked_callbacks_.size() == requests_to_block_.size())
8889 run_loop_->QuitWhenIdle();
8890 return ERR_IO_PENDING;
8891 }
8892
8893 // Erases object's memory of blocked callbacks as a side effect.
8894 void GetBlockedCallbacks(
8895 std::map<const URLRequest*, CompletionCallback>* blocked_callbacks) {
8896 blocked_callbacks_.swap(*blocked_callbacks);
8897 }
8898
8899 // Set a RunLoop that, if non-null, will be signaled if any request
8900 // is blocked. It is the callers responsibility to make sure the
8901 // passed object lives past the destruction of this class or
8902 // next call to SetRunLoop().
8903 void SetRunLoop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
8904
8905 private:
8906 std::set<const URLRequest*> requests_to_block_;
8907 std::map<const URLRequest*, CompletionCallback> blocked_callbacks_;
8908
8909 base::RunLoop* run_loop_;
8910
8911 DISALLOW_COPY_AND_ASSIGN(NotificationCallbackHandler);
8912};
8913
8914TEST_F(URLRequestTestHTTP, MultiThrottledPriority) {
8915 ASSERT_TRUE(http_test_server()->Start());
8916
8917 base::RunLoop run_until_request_blocked;
8918
8919 NotificationCallbackHandler notification_handler;
8920 notification_handler.SetRunLoop(&run_until_request_blocked);
8921 BlockingNetworkDelegate network_delegate(
8922 BlockingNetworkDelegate::USER_NOTIFY);
8923 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
8924 network_delegate.set_notification_callback(
8925 base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
8926 // Both objects are owned by this function, and
8927 // |*network_delegate| will be destroyed first, so
8928 // it's safe to pass it an unretained pointer.
8929 base::Unretained(&notification_handler)));
8930
8931 TestURLRequestContext context(true);
8932 context.set_network_delegate(&network_delegate);
8933 context.Init();
8934
8935 // Use different test URLs to make sure all three requests turn into
8936 // HttpNetworkTransacations. Use different URLRequest::Delegates so that
8937 // the requests may be waited on separately.
8938 TestDelegate d1;
rhalavatib7bd7c792017-04-27 05:25:168939 std::unique_ptr<URLRequest> req1(
8940 context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
8941 &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248942 notification_handler.AddURLRequestToBlockList(req1.get());
8943
8944 TestDelegate d2;
rhalavatib7bd7c792017-04-27 05:25:168945 std::unique_ptr<URLRequest> req2(
8946 context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
8947 &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248948 notification_handler.AddURLRequestToBlockList(req2.get());
8949
8950 TestDelegate d3;
rhalavatib7bd7c792017-04-27 05:25:168951 std::unique_ptr<URLRequest> req3(
8952 context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
8953 &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:248954 req1->Start();
8955 req2->Start();
8956 req3->Start();
8957 run_until_request_blocked.Run();
8958 notification_handler.SetRunLoop(nullptr);
8959
8960 // The first two requests should be blocked based on the notification
8961 // callback, and their status should have blocked the third request
8962 // through throttling.
8963 EXPECT_TRUE(req1->status().is_io_pending());
8964 EXPECT_TRUE(req2->status().is_io_pending());
8965 EXPECT_TRUE(req3->status().is_io_pending());
8966
8967 std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
8968 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
8969 ASSERT_EQ(2u, blocked_callbacks.size());
8970 ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
8971 ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
8972
8973 // Unblocking one of the requests blocked on the notification callback
8974 // should let it complete, which should then let the third request
8975 // complete. Unblock the second request, then wait for the third
8976 // request to complete.
8977 // TODO(rdsmith): Find something to wait on other than the third
8978 // requests completion; if there's a bug in throttling, that will
8979 // result in this test hanging rather than failing quickly.
8980 d1.set_quit_on_complete(false);
8981 d2.set_quit_on_complete(false);
8982 d3.set_quit_on_complete(true);
8983 blocked_callbacks[req2.get()].Run(OK);
8984 base::RunLoop().Run();
8985
8986 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
8987 EXPECT_EQ(0u, blocked_callbacks.size());
8988 EXPECT_TRUE(req1->status().is_io_pending());
8989 // req3 is only unblocked after req2 completes, so req2's
8990 // success is guaranteed at this point in the function.
8991 EXPECT_EQ(URLRequestStatus::SUCCESS, req2->status().status());
8992 EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
8993}
8994
8995// Confirm that failing a request unblocks following requests.
8996TEST_F(URLRequestTestHTTP, ThrottledFailure) {
8997 ASSERT_TRUE(http_test_server()->Start());
8998
8999 base::RunLoop run_until_request_blocked;
9000
9001 NotificationCallbackHandler notification_handler;
9002 notification_handler.SetRunLoop(&run_until_request_blocked);
9003 BlockingNetworkDelegate network_delegate(
9004 BlockingNetworkDelegate::USER_NOTIFY);
9005 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
9006 network_delegate.set_notification_callback(
9007 base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
9008 // Both objects are owned by this function, and
9009 // |*network_delegate| will be destroyed first, so
9010 // it's safe to pass it an unretained pointer.
9011 base::Unretained(&notification_handler)));
9012
9013 TestURLRequestContext context(true);
9014 context.set_network_delegate(&network_delegate);
9015 context.Init();
9016
9017 // Use different test URLs to make sure all three requests turn into
9018 // HttpNetworkTransacations. Use different URLRequest::Delegates so that
9019 // the requests may be waited on separately.
9020 TestDelegate d1;
rhalavatib7bd7c792017-04-27 05:25:169021 std::unique_ptr<URLRequest> req1(
9022 context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
9023 &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249024 notification_handler.AddURLRequestToBlockList(req1.get());
9025
9026 TestDelegate d2;
rhalavatib7bd7c792017-04-27 05:25:169027 std::unique_ptr<URLRequest> req2(
9028 context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
9029 &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249030 notification_handler.AddURLRequestToBlockList(req2.get());
9031
9032 TestDelegate d3;
rhalavatib7bd7c792017-04-27 05:25:169033 std::unique_ptr<URLRequest> req3(
9034 context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
9035 &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249036 req1->Start();
9037 req2->Start();
9038 req3->Start();
9039 run_until_request_blocked.Run();
9040 notification_handler.SetRunLoop(nullptr);
9041
9042 // The first two requests should be blocked based on the notification
9043 // callback, and their status should have blocked the third request
9044 // through throttling.
9045 EXPECT_TRUE(req1->status().is_io_pending());
9046 EXPECT_TRUE(req2->status().is_io_pending());
9047 EXPECT_TRUE(req3->status().is_io_pending());
9048
9049 std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
9050 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
9051 ASSERT_EQ(2u, blocked_callbacks.size());
9052 ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
9053 ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
9054
9055 // Confirm canceling one of the outstanding requests allows the
9056 // blocked request to complete.
9057
9058 // TODO(rdsmith): Find something to wait on other than the third
9059 // requests completion; if there's a bug in throttling, that will
9060 // result in this test hanging rather than failing quickly.
9061 d1.set_quit_on_complete(false);
9062 d2.set_quit_on_complete(false);
9063 d3.set_quit_on_complete(true);
9064 req2->Cancel();
9065 base::RunLoop().Run();
9066
9067 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
9068 EXPECT_EQ(0u, blocked_callbacks.size());
9069 EXPECT_TRUE(req1->status().is_io_pending());
9070 EXPECT_EQ(URLRequestStatus::CANCELED, req2->status().status());
9071 EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
9072}
9073
9074TEST_F(URLRequestTestHTTP, ThrottledRepriUnblock) {
9075 ASSERT_TRUE(http_test_server()->Start());
9076
9077 base::RunLoop run_until_request_blocked;
9078
9079 NotificationCallbackHandler notification_handler;
9080 notification_handler.SetRunLoop(&run_until_request_blocked);
9081 BlockingNetworkDelegate network_delegate(
9082 BlockingNetworkDelegate::USER_NOTIFY);
9083 network_delegate.set_block_on(BlockingNetworkDelegate::ON_HEADERS_RECEIVED);
9084 network_delegate.set_notification_callback(
9085 base::Bind(&NotificationCallbackHandler::ShouldBlockRequest,
9086 // Both objects are owned by this function, and
9087 // |*network_delegate| will be destroyed first, so
9088 // it's safe to pass it an unretained pointer.
9089 base::Unretained(&notification_handler)));
9090
9091 TestURLRequestContext context(true);
9092 context.set_network_delegate(&network_delegate);
9093 context.Init();
9094
9095 // Use different test URLs to make sure all three requests turn into
9096 // HttpNetworkTransacations. Use different URLRequest::Delegates so that
9097 // the requests may be waited on separately.
9098 TestDelegate d1;
rhalavatib7bd7c792017-04-27 05:25:169099 std::unique_ptr<URLRequest> req1(
9100 context.CreateRequest(http_test_server()->GetURL("/echoall/l"), THROTTLED,
9101 &d1, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249102 notification_handler.AddURLRequestToBlockList(req1.get());
9103
9104 TestDelegate d2;
rhalavatib7bd7c792017-04-27 05:25:169105 std::unique_ptr<URLRequest> req2(
9106 context.CreateRequest(http_test_server()->GetURL("/echoall/2"), THROTTLED,
9107 &d2, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249108 notification_handler.AddURLRequestToBlockList(req2.get());
9109
9110 TestDelegate d3;
rhalavatib7bd7c792017-04-27 05:25:169111 std::unique_ptr<URLRequest> req3(
9112 context.CreateRequest(http_test_server()->GetURL("/echoall/3"), THROTTLED,
9113 &d3, TRAFFIC_ANNOTATION_FOR_TESTS));
rdsmithbf8c3c12016-11-18 18:16:249114 req1->Start();
9115 req2->Start();
9116 req3->Start();
9117 run_until_request_blocked.Run();
9118 notification_handler.SetRunLoop(nullptr);
9119
9120 // The first two requests should be blocked based on the notification
9121 // callback, and their status should have blocked the third request
9122 // through throttling.
9123 EXPECT_TRUE(req1->status().is_io_pending());
9124 EXPECT_TRUE(req2->status().is_io_pending());
9125 EXPECT_TRUE(req3->status().is_io_pending());
9126
9127 std::map<const URLRequest*, CompletionCallback> blocked_callbacks;
9128 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
9129 ASSERT_EQ(2u, blocked_callbacks.size());
9130 ASSERT_TRUE(blocked_callbacks.find(req1.get()) != blocked_callbacks.end());
9131 ASSERT_TRUE(blocked_callbacks.find(req2.get()) != blocked_callbacks.end());
9132
9133 // Confirm raising the priority of the third request allows it to complete.
9134
9135 // TODO(rdsmith): Find something to wait on other than the third
9136 // requests completion; if there's a bug in throttling, that will
9137 // result in this test hanging rather than failing quickly.
9138 d1.set_quit_on_complete(false);
9139 d2.set_quit_on_complete(false);
9140 d3.set_quit_on_complete(true);
9141 req3->SetPriority(IDLE);
9142 base::RunLoop().Run();
9143
9144 notification_handler.GetBlockedCallbacks(&blocked_callbacks);
9145 EXPECT_EQ(0u, blocked_callbacks.size());
9146 EXPECT_TRUE(req1->status().is_io_pending());
9147 EXPECT_TRUE(req2->status().is_io_pending());
9148 EXPECT_EQ(URLRequestStatus::SUCCESS, req3->status().status());
9149}
9150
ricea3a1c71f2016-06-17 10:05:269151TEST_F(URLRequestTestHTTP, RawBodyBytesNoContentEncoding) {
9152 ASSERT_TRUE(http_test_server()->Start());
9153
9154 TestDelegate d;
9155 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169156 http_test_server()->GetURL("/simple.html"), DEFAULT_PRIORITY, &d,
9157 TRAFFIC_ANNOTATION_FOR_TESTS));
ricea3a1c71f2016-06-17 10:05:269158 req->Start();
9159 base::RunLoop().Run();
9160
9161 EXPECT_EQ(5, req->GetRawBodyBytes());
9162}
9163
9164TEST_F(URLRequestTestHTTP, RawBodyBytesGzipEncoding) {
9165 ASSERT_TRUE(http_test_server()->Start());
9166
9167 TestDelegate d;
9168 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169169 http_test_server()->GetURL("/gzip-encoded"), DEFAULT_PRIORITY, &d,
9170 TRAFFIC_ANNOTATION_FOR_TESTS));
ricea3a1c71f2016-06-17 10:05:269171 req->Start();
9172 base::RunLoop().Run();
9173
9174 EXPECT_EQ(30, req->GetRawBodyBytes());
9175}
9176
jamd3f5a3c2016-10-27 18:52:029177// Check that if NetworkDelegate::OnBeforeStartTransaction returns an error,
9178// the delegate isn't called back synchronously.
9179TEST_F(URLRequestTestHTTP, TesBeforeStartTransactionFails) {
9180 ASSERT_TRUE(http_test_server()->Start());
9181 default_network_delegate_.set_before_start_transaction_fails();
9182
9183 TestDelegate d;
9184 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169185 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &d,
9186 TRAFFIC_ANNOTATION_FOR_TESTS));
jamd3f5a3c2016-10-27 18:52:029187 req->Start();
9188 DCHECK(!d.response_completed());
9189 base::RunLoop().Run();
9190 DCHECK(d.response_completed());
9191 EXPECT_EQ(ERR_FAILED, d.request_status());
9192}
9193
bengr1bf8e942014-11-07 01:36:509194class URLRequestInterceptorTestHTTP : public URLRequestTestHTTP {
9195 public:
9196 // TODO(bengr): Merge this with the URLRequestInterceptorHTTPTest fixture,
9197 // ideally remove the dependency on URLRequestTestJob, and maybe move these
9198 // tests into the factory tests.
9199 URLRequestInterceptorTestHTTP() : URLRequestTestHTTP(), interceptor_(NULL) {
9200 }
9201
9202 void SetUpFactory() override {
9203 interceptor_ = new MockURLRequestInterceptor();
9204 job_factory_.reset(new URLRequestInterceptingJobFactory(
danakj8522a25b2016-04-16 00:17:369205 std::move(job_factory_), base::WrapUnique(interceptor_)));
bengr1bf8e942014-11-07 01:36:509206 }
9207
9208 MockURLRequestInterceptor* interceptor() const {
9209 return interceptor_;
9210 }
9211
9212 private:
9213 MockURLRequestInterceptor* interceptor_;
9214};
9215
9216TEST_F(URLRequestInterceptorTestHTTP,
9217 NetworkDelegateNotificationOnRedirectIntercept) {
9218 interceptor()->set_intercept_redirect(true);
9219 interceptor()->set_redirect_headers(MockURLRequestInterceptor::ok_headers());
9220 interceptor()->set_redirect_data(MockURLRequestInterceptor::ok_data());
9221
tommycli59a63432015-11-06 00:10:559222 ASSERT_TRUE(http_test_server()->Start());
bengr1bf8e942014-11-07 01:36:509223
9224 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369225 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169226 http_test_server()->GetURL("/redirect-test.html"), DEFAULT_PRIORITY, &d,
9227 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:509228 req->Start();
9229 base::RunLoop().Run();
9230
9231 EXPECT_TRUE(interceptor()->did_intercept_redirect());
9232 // Check we got one good response
maksim.sisovb53724b52016-09-16 05:30:509233 int status = d.request_status();
9234 EXPECT_EQ(OK, status);
9235 if (status == OK)
bengr1bf8e942014-11-07 01:36:509236 EXPECT_EQ(200, req->response_headers()->response_code());
9237
9238 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
9239 EXPECT_EQ(1, d.response_started_count());
9240 EXPECT_EQ(0, d.received_redirect_count());
9241
9242 EXPECT_EQ(1, default_network_delegate()->created_requests());
ryansturm2343cb62016-06-15 01:09:009243 EXPECT_EQ(1, default_network_delegate()->before_start_transaction_count());
bengr1bf8e942014-11-07 01:36:509244 EXPECT_EQ(1, default_network_delegate()->headers_received_count());
9245}
9246
9247TEST_F(URLRequestInterceptorTestHTTP,
9248 NetworkDelegateNotificationOnErrorIntercept) {
9249 // Intercept that error and respond with an OK response.
9250 interceptor()->set_intercept_final_response(true);
9251 interceptor()->set_final_headers(MockURLRequestInterceptor::ok_headers());
9252 interceptor()->set_final_data(MockURLRequestInterceptor::ok_data());
9253 default_network_delegate()->set_can_be_intercepted_on_error(true);
9254
tommycli59a63432015-11-06 00:10:559255 ASSERT_TRUE(http_test_server()->Start());
bengr1bf8e942014-11-07 01:36:509256
9257 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369258 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
tommycli59a63432015-11-06 00:10:559259 http_test_server()->GetURL("/two-content-lengths.html"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:169260 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:509261 req->set_method("GET");
9262 req->Start();
9263 base::RunLoop().Run();
9264
9265 EXPECT_TRUE(interceptor()->did_intercept_final());
9266
9267 // Check we received one good response.
maksim.sisovb53724b52016-09-16 05:30:509268 int status = d.request_status();
9269 EXPECT_EQ(OK, status);
9270 if (status == OK)
bengr1bf8e942014-11-07 01:36:509271 EXPECT_EQ(200, req->response_headers()->response_code());
9272 EXPECT_EQ(MockURLRequestInterceptor::ok_data(), d.data_received());
9273 EXPECT_EQ(1, d.response_started_count());
9274 EXPECT_EQ(0, d.received_redirect_count());
9275
9276 EXPECT_EQ(1, default_network_delegate()->created_requests());
ryansturm2343cb62016-06-15 01:09:009277 EXPECT_EQ(1, default_network_delegate()->before_start_transaction_count());
bengr1bf8e942014-11-07 01:36:509278 EXPECT_EQ(0, default_network_delegate()->headers_received_count());
9279}
9280
9281TEST_F(URLRequestInterceptorTestHTTP,
9282 NetworkDelegateNotificationOnResponseIntercept) {
9283 // Intercept that error and respond with an OK response.
9284 interceptor()->set_intercept_final_response(true);
9285
9286 // Intercept with a real URLRequestHttpJob.
9287 interceptor()->set_use_url_request_http_job(true);
9288
tommycli59a63432015-11-06 00:10:559289 ASSERT_TRUE(http_test_server()->Start());
bengr1bf8e942014-11-07 01:36:509290
9291 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369292 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169293 http_test_server()->GetURL("/simple.html"), DEFAULT_PRIORITY, &d,
9294 TRAFFIC_ANNOTATION_FOR_TESTS));
bengr1bf8e942014-11-07 01:36:509295 req->set_method("GET");
9296 req->Start();
9297 base::RunLoop().Run();
9298
9299 EXPECT_TRUE(interceptor()->did_intercept_final());
9300
9301 // Check we received one good response.
maksim.sisovb53724b52016-09-16 05:30:509302 int status = d.request_status();
9303 EXPECT_EQ(OK, status);
9304 if (status == OK)
bengr1bf8e942014-11-07 01:36:509305 EXPECT_EQ(200, req->response_headers()->response_code());
9306 EXPECT_EQ("hello", d.data_received());
9307 EXPECT_EQ(1, d.response_started_count());
9308 EXPECT_EQ(0, d.received_redirect_count());
9309
9310 EXPECT_EQ(1, default_network_delegate()->created_requests());
ryansturm2343cb62016-06-15 01:09:009311 EXPECT_EQ(2, default_network_delegate()->before_start_transaction_count());
bengr1bf8e942014-11-07 01:36:509312 EXPECT_EQ(2, default_network_delegate()->headers_received_count());
9313}
9314
mkwst0c5eab872014-11-21 14:18:549315class URLRequestTestReferrerPolicy : public URLRequestTest {
9316 public:
Chris Watkins7a41d3552017-12-01 02:13:279317 URLRequestTestReferrerPolicy() = default;
mkwst0c5eab872014-11-21 14:18:549318
tommycli59a63432015-11-06 00:10:559319 void InstantiateSameOriginServers(net::EmbeddedTestServer::Type type) {
9320 origin_server_.reset(new EmbeddedTestServer(type));
9321 if (type == net::EmbeddedTestServer::TYPE_HTTPS) {
9322 origin_server_->AddDefaultHandlers(
9323 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
9324 } else {
9325 origin_server_->AddDefaultHandlers(base::FilePath(kTestFilePath));
9326 }
mkwst0c5eab872014-11-21 14:18:549327 ASSERT_TRUE(origin_server_->Start());
9328 }
9329
tommycli59a63432015-11-06 00:10:559330 void InstantiateCrossOriginServers(net::EmbeddedTestServer::Type origin_type,
9331 net::EmbeddedTestServer::Type dest_type) {
9332 origin_server_.reset(new EmbeddedTestServer(origin_type));
9333 if (origin_type == net::EmbeddedTestServer::TYPE_HTTPS) {
9334 origin_server_->AddDefaultHandlers(
9335 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
9336 } else {
9337 origin_server_->AddDefaultHandlers(base::FilePath(kTestFilePath));
9338 }
mkwst0c5eab872014-11-21 14:18:549339 ASSERT_TRUE(origin_server_->Start());
9340
tommycli59a63432015-11-06 00:10:559341 destination_server_.reset(new EmbeddedTestServer(dest_type));
9342 if (dest_type == net::EmbeddedTestServer::TYPE_HTTPS) {
9343 destination_server_->AddDefaultHandlers(
9344 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
9345 } else {
9346 destination_server_->AddDefaultHandlers(base::FilePath(kTestFilePath));
9347 }
mkwst0c5eab872014-11-21 14:18:549348 ASSERT_TRUE(destination_server_->Start());
9349 }
9350
9351 void VerifyReferrerAfterRedirect(URLRequest::ReferrerPolicy policy,
9352 const GURL& referrer,
9353 const GURL& expected) {
9354 // Create and execute the request: we'll only have a |destination_server_|
9355 // if the origins are meant to be distinct. Otherwise, we'll use the
9356 // |origin_server_| for both endpoints.
9357 GURL destination_url =
tommycli59a63432015-11-06 00:10:559358 destination_server_ ? destination_server_->GetURL("/echoheader?Referer")
9359 : origin_server_->GetURL("/echoheader?Referer");
mkwst0c5eab872014-11-21 14:18:549360 GURL origin_url =
tommycli59a63432015-11-06 00:10:559361 origin_server_->GetURL("/server-redirect?" + destination_url.spec());
mkwst0c5eab872014-11-21 14:18:549362
9363 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:169364 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
9365 origin_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
mkwst0c5eab872014-11-21 14:18:549366 req->set_referrer_policy(policy);
9367 req->SetReferrer(referrer.spec());
9368 req->Start();
9369 base::RunLoop().Run();
9370
9371 EXPECT_EQ(1, d.response_started_count());
9372 EXPECT_EQ(1, d.received_redirect_count());
9373 EXPECT_EQ(destination_url, req->url());
maksim.sisovb53724b52016-09-16 05:30:509374 EXPECT_EQ(OK, d.request_status());
mkwst0c5eab872014-11-21 14:18:549375 EXPECT_EQ(200, req->response_headers()->response_code());
9376
9377 EXPECT_EQ(expected.spec(), req->referrer());
9378 if (expected.is_empty())
9379 EXPECT_EQ("None", d.data_received());
9380 else
9381 EXPECT_EQ(expected.spec(), d.data_received());
9382 }
9383
tommycli59a63432015-11-06 00:10:559384 EmbeddedTestServer* origin_server() const { return origin_server_.get(); }
mkwst0c5eab872014-11-21 14:18:549385
9386 private:
danakj8522a25b2016-04-16 00:17:369387 std::unique_ptr<EmbeddedTestServer> origin_server_;
9388 std::unique_ptr<EmbeddedTestServer> destination_server_;
mkwst0c5eab872014-11-21 14:18:549389};
9390
9391TEST_F(URLRequestTestReferrerPolicy, HTTPToSameOriginHTTP) {
tommycli59a63432015-11-06 00:10:559392 InstantiateSameOriginServers(net::EmbeddedTestServer::TYPE_HTTP);
mkwst0c5eab872014-11-21 14:18:549393
estarkc8ccba82017-06-13 22:37:409394 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549395 VerifyReferrerAfterRedirect(
9396 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409397 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549398
9399 VerifyReferrerAfterRedirect(
9400 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409401 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549402
9403 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409404 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549405
estarkc8ccba82017-06-13 22:37:409406 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9407 referrer);
9408
9409 // The original referrer set on the request is expected to obey the referrer
9410 // policy and already be stripped to the origin; thus this test case just
9411 // checks that this policy doesn't cause the referrer to change when following
9412 // a redirect.
9413 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9414 referrer.GetOrigin());
9415
9416 VerifyReferrerAfterRedirect(
9417 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer,
9418 referrer);
9419
9420 // The original referrer set on the request is expected to obey the referrer
9421 // policy and already be stripped to the origin; thus this test case just
9422 // checks that this policy doesn't cause the referrer to change when following
9423 // a redirect.
9424 VerifyReferrerAfterRedirect(
9425 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9426 referrer.GetOrigin(), referrer.GetOrigin());
9427
9428 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549429}
9430
tommycli59a63432015-11-06 00:10:559431TEST_F(URLRequestTestReferrerPolicy, HTTPToCrossOriginHTTP) {
9432 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTP,
9433 net::EmbeddedTestServer::TYPE_HTTP);
estarkc8ccba82017-06-13 22:37:409434 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549435
9436 VerifyReferrerAfterRedirect(
9437 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409438 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549439
9440 VerifyReferrerAfterRedirect(
9441 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409442 referrer, referrer.GetOrigin());
mkwst0c5eab872014-11-21 14:18:549443
9444 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409445 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
9446 referrer.GetOrigin());
mkwst0c5eab872014-11-21 14:18:549447
estarkc8ccba82017-06-13 22:37:409448 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9449 referrer);
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(URLRequest::ORIGIN, referrer.GetOrigin(),
9456 referrer.GetOrigin());
9457
9458 VerifyReferrerAfterRedirect(
9459 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9460
9461 // The original referrer set on the request is expected to obey the referrer
9462 // policy and already be stripped to the origin; thus this test case just
9463 // checks that this policy doesn't cause the referrer to change when following
9464 // a redirect.
9465 VerifyReferrerAfterRedirect(
9466 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9467 referrer.GetOrigin(), referrer.GetOrigin());
9468
9469 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549470}
9471
9472TEST_F(URLRequestTestReferrerPolicy, HTTPSToSameOriginHTTPS) {
tommycli59a63432015-11-06 00:10:559473 InstantiateSameOriginServers(net::EmbeddedTestServer::TYPE_HTTPS);
estarkc8ccba82017-06-13 22:37:409474 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549475
9476 VerifyReferrerAfterRedirect(
9477 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409478 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549479
9480 VerifyReferrerAfterRedirect(
9481 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409482 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549483
9484 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409485 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549486
estarkc8ccba82017-06-13 22:37:409487 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9488 referrer);
9489
9490 // The original referrer set on the request is expected to obey the referrer
9491 // policy and already be stripped to the origin; thus this test case just
9492 // checks that this policy doesn't cause the referrer to change when following
9493 // a redirect.
9494 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9495 referrer.GetOrigin());
9496
9497 VerifyReferrerAfterRedirect(
9498 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer,
9499 referrer);
9500
9501 // The original referrer set on the request is expected to obey the referrer
9502 // policy and already be stripped to the origin; thus this test case just
9503 // checks that this policy doesn't cause the referrer to change when following
9504 // a redirect.
9505 VerifyReferrerAfterRedirect(
9506 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9507 referrer.GetOrigin(), referrer.GetOrigin());
9508
9509 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549510}
9511
tommycli59a63432015-11-06 00:10:559512TEST_F(URLRequestTestReferrerPolicy, HTTPSToCrossOriginHTTPS) {
9513 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTPS,
9514 net::EmbeddedTestServer::TYPE_HTTPS);
estarkc8ccba82017-06-13 22:37:409515 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549516
9517 VerifyReferrerAfterRedirect(
9518 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409519 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549520
9521 VerifyReferrerAfterRedirect(
9522 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409523 referrer, origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549524
9525 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409526 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
tommycli59a63432015-11-06 00:10:559527 origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549528
estarkc8ccba82017-06-13 22:37:409529 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9530 referrer);
9531
9532 // The original referrer set on the request is expected to obey the referrer
9533 // policy and already be stripped to the origin; thus this test case just
9534 // checks that this policy doesn't cause the referrer to change when following
9535 // a redirect.
9536 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9537 referrer.GetOrigin());
9538
9539 VerifyReferrerAfterRedirect(
9540 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9541
9542 // The original referrer set on the request is expected to obey the referrer
9543 // policy and already be stripped to the origin; thus this test case just
9544 // checks that this policy doesn't cause the referrer to change when following
9545 // a redirect.
9546 VerifyReferrerAfterRedirect(
9547 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9548 referrer.GetOrigin(), referrer.GetOrigin());
9549
9550 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549551}
9552
tommycli59a63432015-11-06 00:10:559553TEST_F(URLRequestTestReferrerPolicy, HTTPToHTTPS) {
9554 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTP,
9555 net::EmbeddedTestServer::TYPE_HTTPS);
estarkc8ccba82017-06-13 22:37:409556 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549557
9558 VerifyReferrerAfterRedirect(
9559 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409560 referrer, referrer);
mkwst0c5eab872014-11-21 14:18:549561
9562 VerifyReferrerAfterRedirect(
9563 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409564 referrer, origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549565
9566 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409567 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
tommycli59a63432015-11-06 00:10:559568 origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549569
estarkc8ccba82017-06-13 22:37:409570 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9571 referrer);
9572
9573 // The original referrer set on the request is expected to obey the referrer
9574 // policy and already be stripped to the origin; thus this test case just
9575 // checks that this policy doesn't cause the referrer to change when following
9576 // a redirect.
9577 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9578 referrer.GetOrigin());
9579
9580 VerifyReferrerAfterRedirect(
9581 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9582
9583 // The original referrer set on the request is expected to obey the referrer
9584 // policy and already be stripped to the origin; thus this test case just
9585 // checks that this policy doesn't cause the referrer to change when following
9586 // a redirect.
9587 VerifyReferrerAfterRedirect(
9588 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9589 referrer.GetOrigin(), referrer.GetOrigin());
9590
9591 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549592}
9593
tommycli59a63432015-11-06 00:10:559594TEST_F(URLRequestTestReferrerPolicy, HTTPSToHTTP) {
9595 InstantiateCrossOriginServers(net::EmbeddedTestServer::TYPE_HTTPS,
9596 net::EmbeddedTestServer::TYPE_HTTP);
estarkc8ccba82017-06-13 22:37:409597 GURL referrer = origin_server()->GetURL("/path/to/file.html");
mkwst0c5eab872014-11-21 14:18:549598
9599 VerifyReferrerAfterRedirect(
9600 URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
estarkc8ccba82017-06-13 22:37:409601 referrer, GURL());
mkwst0c5eab872014-11-21 14:18:549602
9603 VerifyReferrerAfterRedirect(
9604 URLRequest::REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN,
estarkc8ccba82017-06-13 22:37:409605 referrer, GURL());
mkwst0c5eab872014-11-21 14:18:549606
9607 VerifyReferrerAfterRedirect(
estarkc8ccba82017-06-13 22:37:409608 URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN, referrer,
tommycli59a63432015-11-06 00:10:559609 origin_server()->GetURL("/"));
mkwst0c5eab872014-11-21 14:18:549610
estarkc8ccba82017-06-13 22:37:409611 VerifyReferrerAfterRedirect(URLRequest::NEVER_CLEAR_REFERRER, referrer,
9612 referrer);
9613
9614 // The original referrer set on the request is expected to obey the referrer
9615 // policy and already be stripped to the origin; thus this test case just
9616 // checks that this policy doesn't cause the referrer to change when following
9617 // a redirect.
9618 VerifyReferrerAfterRedirect(URLRequest::ORIGIN, referrer.GetOrigin(),
9619 referrer.GetOrigin());
9620
9621 VerifyReferrerAfterRedirect(
9622 URLRequest::CLEAR_REFERRER_ON_TRANSITION_CROSS_ORIGIN, referrer, GURL());
9623
9624 // The original referrer set on the request is expected to obey the referrer
9625 // policy and already be stripped to the origin, though it should be
9626 // subsequently cleared during the downgrading redirect.
9627 VerifyReferrerAfterRedirect(
9628 URLRequest::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
9629 referrer.GetOrigin(), GURL());
9630
9631 VerifyReferrerAfterRedirect(URLRequest::NO_REFERRER, GURL(), GURL());
mkwst0c5eab872014-11-21 14:18:549632}
9633
[email protected]73e0bba2009-02-19 22:57:099634class HTTPSRequestTest : public testing::Test {
[email protected]87a09a92011-07-14 15:50:509635 public:
fdorayf33fede2017-05-11 21:18:109636 HTTPSRequestTest() : default_context_(true) {
[email protected]ef2bf422012-05-11 03:27:099637 default_context_.set_network_delegate(&default_network_delegate_);
9638 default_context_.Init();
[email protected]87a09a92011-07-14 15:50:509639 }
Martijn Croonenb1383da2017-10-11 11:56:359640 ~HTTPSRequestTest() override {
9641 SetTransportSecurityStateSourceForTesting(nullptr);
9642 }
[email protected]87a09a92011-07-14 15:50:509643
9644 protected:
[email protected]ceefd7fd2012-11-29 00:36:249645 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest.
[email protected]ef2bf422012-05-11 03:27:099646 TestURLRequestContext default_context_;
[email protected]ea224582008-12-07 20:25:469647};
9648
[email protected]c044616e2013-02-20 02:01:269649TEST_F(HTTPSRequestTest, HTTPSGetTest) {
tommycli59a63432015-11-06 00:10:559650 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9651 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229652 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]95409e12010-08-17 20:07:119653 ASSERT_TRUE(test_server.Start());
[email protected]ea224582008-12-07 20:25:469654
[email protected]ea224582008-12-07 20:25:469655 TestDelegate d;
9656 {
danakj8522a25b2016-04-16 00:17:369657 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169658 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9659 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:199660 r->Start();
9661 EXPECT_TRUE(r->is_pending());
[email protected]ea224582008-12-07 20:25:469662
[email protected]255620da2013-08-19 13:14:299663 base::RunLoop().Run();
[email protected]ea224582008-12-07 20:25:469664
9665 EXPECT_EQ(1, d.response_started_count());
9666 EXPECT_FALSE(d.received_data_before_response());
9667 EXPECT_NE(0, d.bytes_received());
[email protected]f7022f32014-08-21 16:32:199668 CheckSSLInfo(r->ssl_info());
[email protected]6d81b482011-02-22 19:47:199669 EXPECT_EQ(test_server.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:199670 r->GetSocketAddress().host());
[email protected]6d81b482011-02-22 19:47:199671 EXPECT_EQ(test_server.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:199672 r->GetSocketAddress().port());
[email protected]ea224582008-12-07 20:25:469673 }
[email protected]ea224582008-12-07 20:25:469674}
9675
[email protected]5774ada2010-07-15 06:30:549676TEST_F(HTTPSRequestTest, HTTPSMismatchedTest) {
tommycli59a63432015-11-06 00:10:559677 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9678 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
9679 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229680 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]95409e12010-08-17 20:07:119681 ASSERT_TRUE(test_server.Start());
[email protected]bacff652009-03-31 17:50:339682
9683 bool err_allowed = true;
9684 for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
9685 TestDelegate d;
9686 {
9687 d.set_allow_certificate_errors(err_allowed);
danakj8522a25b2016-04-16 00:17:369688 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169689 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9690 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]bacff652009-03-31 17:50:339691
[email protected]f7022f32014-08-21 16:32:199692 r->Start();
9693 EXPECT_TRUE(r->is_pending());
[email protected]bacff652009-03-31 17:50:339694
[email protected]255620da2013-08-19 13:14:299695 base::RunLoop().Run();
[email protected]bacff652009-03-31 17:50:339696
9697 EXPECT_EQ(1, d.response_started_count());
9698 EXPECT_FALSE(d.received_data_before_response());
9699 EXPECT_TRUE(d.have_certificate_errors());
[email protected]96adadb2010-08-28 01:16:179700 if (err_allowed) {
[email protected]bacff652009-03-31 17:50:339701 EXPECT_NE(0, d.bytes_received());
[email protected]f7022f32014-08-21 16:32:199702 CheckSSLInfo(r->ssl_info());
[email protected]96adadb2010-08-28 01:16:179703 } else {
[email protected]bacff652009-03-31 17:50:339704 EXPECT_EQ(0, d.bytes_received());
[email protected]96adadb2010-08-28 01:16:179705 }
[email protected]bacff652009-03-31 17:50:339706 }
9707 }
9708}
9709
[email protected]5774ada2010-07-15 06:30:549710TEST_F(HTTPSRequestTest, HTTPSExpiredTest) {
tommycli59a63432015-11-06 00:10:559711 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9712 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED);
9713 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229714 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]95409e12010-08-17 20:07:119715 ASSERT_TRUE(test_server.Start());
[email protected]bacff652009-03-31 17:50:339716
9717 // Iterate from false to true, just so that we do the opposite of the
9718 // previous test in order to increase test coverage.
9719 bool err_allowed = false;
9720 for (int i = 0; i < 2 ; i++, err_allowed = !err_allowed) {
9721 TestDelegate d;
9722 {
9723 d.set_allow_certificate_errors(err_allowed);
danakj8522a25b2016-04-16 00:17:369724 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:169725 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
9726 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]bacff652009-03-31 17:50:339727
[email protected]f7022f32014-08-21 16:32:199728 r->Start();
9729 EXPECT_TRUE(r->is_pending());
[email protected]bacff652009-03-31 17:50:339730
[email protected]255620da2013-08-19 13:14:299731 base::RunLoop().Run();
[email protected]bacff652009-03-31 17:50:339732
9733 EXPECT_EQ(1, d.response_started_count());
9734 EXPECT_FALSE(d.received_data_before_response());
9735 EXPECT_TRUE(d.have_certificate_errors());
[email protected]96adadb2010-08-28 01:16:179736 if (err_allowed) {
[email protected]bacff652009-03-31 17:50:339737 EXPECT_NE(0, d.bytes_received());
[email protected]f7022f32014-08-21 16:32:199738 CheckSSLInfo(r->ssl_info());
[email protected]96adadb2010-08-28 01:16:179739 } else {
[email protected]bacff652009-03-31 17:50:339740 EXPECT_EQ(0, d.bytes_received());
[email protected]96adadb2010-08-28 01:16:179741 }
[email protected]bacff652009-03-31 17:50:339742 }
9743 }
9744}
[email protected]73e0bba2009-02-19 22:57:099745
tommycli59a63432015-11-06 00:10:559746// TODO(svaldez): iOS tests are flaky with EmbeddedTestServer and transport
9747// security state. (see http://crbug.com/550977).
9748#if !defined(OS_IOS)
Martijn Croonenb1383da2017-10-11 11:56:359749// This tests that a load of a domain with preloaded HSTS and HPKP with a
9750// certificate error sets the |certificate_errors_are_fatal| flag correctly.
9751// This flag will cause the interstitial to be fatal.
[email protected]316c1e5e2012-09-12 15:17:449752TEST_F(HTTPSRequestTest, HTTPSPreloadedHSTSTest) {
Martijn Croonenb1383da2017-10-11 11:56:359753 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
9754
tommycli59a63432015-11-06 00:10:559755 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9756 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
9757 test_server.ServeFilesFromSourceDirectory("net/data/ssl");
[email protected]316c1e5e2012-09-12 15:17:449758 ASSERT_TRUE(test_server.Start());
9759
Martijn Croonenb1383da2017-10-11 11:56:359760 // We require that the URL be hsts-hpkp-preloaded.test. This is a test domain
9761 // that has a preloaded HSTS+HPKP entry in the TransportSecurityState. This
9762 // means that we have to use a MockHostResolver in order to direct
9763 // hsts-hpkp-preloaded.test to the testserver. By default, MockHostResolver
9764 // maps all hosts to 127.0.0.1.
[email protected]316c1e5e2012-09-12 15:17:449765
9766 MockHostResolver host_resolver;
[email protected]ceefd7fd2012-11-29 00:36:249767 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:449768 TestURLRequestContext context(true);
9769 context.set_network_delegate(&network_delegate);
9770 context.set_host_resolver(&host_resolver);
9771 TransportSecurityState transport_security_state;
9772 context.set_transport_security_state(&transport_security_state);
9773 context.Init();
9774
9775 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369776 std::unique_ptr<URLRequest> r(context.CreateRequest(
Martijn Croonenb1383da2017-10-11 11:56:359777 GURL(base::StringPrintf("https://hsts-hpkp-preloaded.test:%d",
davidben151423e2015-03-23 18:48:369778 test_server.host_port_pair().port())),
rhalavatib7bd7c792017-04-27 05:25:169779 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449780
[email protected]f7022f32014-08-21 16:32:199781 r->Start();
9782 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:449783
[email protected]255620da2013-08-19 13:14:299784 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449785
9786 EXPECT_EQ(1, d.response_started_count());
9787 EXPECT_FALSE(d.received_data_before_response());
9788 EXPECT_TRUE(d.have_certificate_errors());
9789 EXPECT_TRUE(d.certificate_errors_are_fatal());
9790}
9791
9792// This tests that cached HTTPS page loads do not cause any updates to the
9793// TransportSecurityState.
9794TEST_F(HTTPSRequestTest, HTTPSErrorsNoClobberTSSTest) {
Martijn Croonenb1383da2017-10-11 11:56:359795 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
9796
[email protected]316c1e5e2012-09-12 15:17:449797 // The actual problem -- CERT_MISMATCHED_NAME in this case -- doesn't
9798 // matter. It just has to be any error.
tommycli59a63432015-11-06 00:10:559799 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9800 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_MISMATCHED_NAME);
9801 test_server.ServeFilesFromSourceDirectory("net/data/ssl");
[email protected]316c1e5e2012-09-12 15:17:449802 ASSERT_TRUE(test_server.Start());
9803
Martijn Croonenb1383da2017-10-11 11:56:359804 // We require that the URL be hsts-hpkp-preloaded.test. This is a test domain
9805 // that has a preloaded HSTS+HPKP entry in the TransportSecurityState. This
9806 // means that we have to use a MockHostResolver in order to direct
9807 // hsts-hpkp-preloaded.test to the testserver. By default, MockHostResolver
9808 // maps all hosts to 127.0.0.1.
[email protected]316c1e5e2012-09-12 15:17:449809
9810 MockHostResolver host_resolver;
[email protected]ceefd7fd2012-11-29 00:36:249811 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
[email protected]316c1e5e2012-09-12 15:17:449812 TestURLRequestContext context(true);
9813 context.set_network_delegate(&network_delegate);
9814 context.set_host_resolver(&host_resolver);
9815 TransportSecurityState transport_security_state;
[email protected]9e6968d2014-05-07 21:46:269816
martijnc0d6b622015-06-30 19:14:409817 TransportSecurityState::STSState static_sts_state;
9818 TransportSecurityState::PKPState static_pkp_state;
[email protected]9e6968d2014-05-07 21:46:269819 EXPECT_TRUE(transport_security_state.GetStaticDomainState(
Martijn Croonenb1383da2017-10-11 11:56:359820 "hsts-hpkp-preloaded.test", &static_sts_state, &static_pkp_state));
[email protected]316c1e5e2012-09-12 15:17:449821 context.set_transport_security_state(&transport_security_state);
9822 context.Init();
9823
martijnc0d6b622015-06-30 19:14:409824 TransportSecurityState::STSState dynamic_sts_state;
9825 TransportSecurityState::PKPState dynamic_pkp_state;
Martijn Croonenb1383da2017-10-11 11:56:359826 EXPECT_FALSE(transport_security_state.GetDynamicSTSState(
9827 "hsts-hpkp-preloaded.test", &dynamic_sts_state));
9828 EXPECT_FALSE(transport_security_state.GetDynamicPKPState(
9829 "hsts-hpkp-preloaded.test", &dynamic_pkp_state));
[email protected]9e6968d2014-05-07 21:46:269830
[email protected]316c1e5e2012-09-12 15:17:449831 TestDelegate d;
danakj8522a25b2016-04-16 00:17:369832 std::unique_ptr<URLRequest> r(context.CreateRequest(
Martijn Croonenb1383da2017-10-11 11:56:359833 GURL(base::StringPrintf("https://hsts-hpkp-preloaded.test:%d",
davidben151423e2015-03-23 18:48:369834 test_server.host_port_pair().port())),
rhalavatib7bd7c792017-04-27 05:25:169835 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:449836
[email protected]f7022f32014-08-21 16:32:199837 r->Start();
9838 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:449839
[email protected]255620da2013-08-19 13:14:299840 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:449841
9842 EXPECT_EQ(1, d.response_started_count());
9843 EXPECT_FALSE(d.received_data_before_response());
9844 EXPECT_TRUE(d.have_certificate_errors());
9845 EXPECT_TRUE(d.certificate_errors_are_fatal());
9846
[email protected]9e6968d2014-05-07 21:46:269847 // Get a fresh copy of the states, and check that they haven't changed.
martijnc0d6b622015-06-30 19:14:409848 TransportSecurityState::STSState new_static_sts_state;
9849 TransportSecurityState::PKPState new_static_pkp_state;
[email protected]9e6968d2014-05-07 21:46:269850 EXPECT_TRUE(transport_security_state.GetStaticDomainState(
Martijn Croonenb1383da2017-10-11 11:56:359851 "hsts-hpkp-preloaded.test", &new_static_sts_state,
9852 &new_static_pkp_state));
martijnc0d6b622015-06-30 19:14:409853 TransportSecurityState::STSState new_dynamic_sts_state;
9854 TransportSecurityState::PKPState new_dynamic_pkp_state;
9855 EXPECT_FALSE(transport_security_state.GetDynamicSTSState(
Martijn Croonenb1383da2017-10-11 11:56:359856 "hsts-hpkp-preloaded.test", &new_dynamic_sts_state));
martijnc0d6b622015-06-30 19:14:409857 EXPECT_FALSE(transport_security_state.GetDynamicPKPState(
Martijn Croonenb1383da2017-10-11 11:56:359858 "hsts-hpkp-preloaded.test", &new_dynamic_pkp_state));
[email protected]9e6968d2014-05-07 21:46:269859
martijnc0d6b622015-06-30 19:14:409860 EXPECT_EQ(new_static_sts_state.upgrade_mode, static_sts_state.upgrade_mode);
9861 EXPECT_EQ(new_static_sts_state.include_subdomains,
9862 static_sts_state.include_subdomains);
9863 EXPECT_EQ(new_static_pkp_state.include_subdomains,
9864 static_pkp_state.include_subdomains);
rsleevi91d4c9c2016-05-14 20:28:489865 EXPECT_EQ(new_static_pkp_state.spki_hashes, static_pkp_state.spki_hashes);
9866 EXPECT_EQ(new_static_pkp_state.bad_spki_hashes,
9867 static_pkp_state.bad_spki_hashes);
[email protected]316c1e5e2012-09-12 15:17:449868}
9869
[email protected]8ccc69f2012-11-28 19:52:149870// Make sure HSTS preserves a POST request's method and body.
9871TEST_F(HTTPSRequestTest, HSTSPreservesPosts) {
9872 static const char kData[] = "hello world";
9873
tommycli59a63432015-11-06 00:10:559874 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9875 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:229876 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]8ccc69f2012-11-28 19:52:149877 ASSERT_TRUE(test_server.Start());
9878
9879
9880 // Per spec, TransportSecurityState expects a domain name, rather than an IP
9881 // address, so a MockHostResolver is needed to redirect www.somewhere.com to
tommycli59a63432015-11-06 00:10:559882 // the EmbeddedTestServer. By default, MockHostResolver maps all hosts
[email protected]ce7d0cbc2013-05-03 18:57:229883 // to 127.0.0.1.
[email protected]8ccc69f2012-11-28 19:52:149884 MockHostResolver host_resolver;
[email protected]8ccc69f2012-11-28 19:52:149885
9886 // Force https for www.somewhere.com.
9887 TransportSecurityState transport_security_state;
[email protected]474f079e2013-03-02 19:11:209888 base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1000);
9889 bool include_subdomains = false;
9890 transport_security_state.AddHSTS("www.somewhere.com", expiry,
9891 include_subdomains);
[email protected]8ccc69f2012-11-28 19:52:149892
9893 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
9894
9895 TestURLRequestContext context(true);
9896 context.set_host_resolver(&host_resolver);
9897 context.set_transport_security_state(&transport_security_state);
9898 context.set_network_delegate(&network_delegate);
9899 context.Init();
9900
9901 TestDelegate d;
9902 // Navigating to https://www.somewhere.com instead of https://127.0.0.1 will
9903 // cause a certificate error. Ignore the error.
9904 d.set_allow_certificate_errors(true);
9905
danakj8522a25b2016-04-16 00:17:369906 std::unique_ptr<URLRequest> req(context.CreateRequest(
[email protected]f7022f32014-08-21 16:32:199907 GURL(base::StringPrintf("http://www.somewhere.com:%d/echo",
davidben151423e2015-03-23 18:48:369908 test_server.host_port_pair().port())),
rhalavatib7bd7c792017-04-27 05:25:169909 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:199910 req->set_method("POST");
mmenkecbc2b712014-10-09 20:29:079911 req->set_upload(CreateSimpleUploadData(kData));
[email protected]8ccc69f2012-11-28 19:52:149912
[email protected]f7022f32014-08-21 16:32:199913 req->Start();
[email protected]255620da2013-08-19 13:14:299914 base::RunLoop().Run();
[email protected]8ccc69f2012-11-28 19:52:149915
[email protected]f7022f32014-08-21 16:32:199916 EXPECT_EQ("https", req->url().scheme());
9917 EXPECT_EQ("POST", req->method());
[email protected]8ccc69f2012-11-28 19:52:149918 EXPECT_EQ(kData, d.data_received());
[email protected]07d9bfd2013-06-27 14:16:409919
9920 LoadTimingInfo load_timing_info;
9921 network_delegate.GetLoadTimingInfoBeforeRedirect(&load_timing_info);
9922 // LoadTimingInfo of HSTS redirects is similar to that of network cache hits
9923 TestLoadTimingCacheHitNoNetwork(load_timing_info);
[email protected]8ccc69f2012-11-28 19:52:149924}
9925
rob4e0be1f2014-09-11 23:40:229926// Make sure that the CORS headers are added to cross-origin HSTS redirects.
9927TEST_F(HTTPSRequestTest, HSTSCrossOriginAddHeaders) {
9928 static const char kOriginHeaderValue[] = "http://www.example.com";
9929
tommycli59a63432015-11-06 00:10:559930 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
9931 test_server.ServeFilesFromSourceDirectory("net/data/ssl");
rob4e0be1f2014-09-11 23:40:229932 ASSERT_TRUE(test_server.Start());
9933
9934 // Per spec, TransportSecurityState expects a domain name, rather than an IP
9935 // address, so a MockHostResolver is needed to redirect example.net to the
tommycli59a63432015-11-06 00:10:559936 // EmbeddedTestServer. MockHostResolver maps all hosts to 127.0.0.1 by
9937 // default.
rob4e0be1f2014-09-11 23:40:229938 MockHostResolver host_resolver;
9939
9940 TransportSecurityState transport_security_state;
9941 base::Time expiry = base::Time::Now() + base::TimeDelta::FromDays(1);
9942 bool include_subdomains = false;
9943 transport_security_state.AddHSTS("example.net", expiry, include_subdomains);
9944
9945 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
9946
9947 MockCertVerifier cert_verifier;
9948 cert_verifier.set_default_result(OK);
9949
9950 TestURLRequestContext context(true);
9951 context.set_host_resolver(&host_resolver);
9952 context.set_transport_security_state(&transport_security_state);
9953 context.set_network_delegate(&network_delegate);
9954 context.set_cert_verifier(&cert_verifier);
9955 context.Init();
9956
9957 GURL hsts_http_url(base::StringPrintf("http://example.net:%d/somehstssite",
9958 test_server.host_port_pair().port()));
9959 url::Replacements<char> replacements;
9960 const char kNewScheme[] = "https";
9961 replacements.SetScheme(kNewScheme, url::Component(0, strlen(kNewScheme)));
9962 GURL hsts_https_url = hsts_http_url.ReplaceComponents(replacements);
9963
9964 TestDelegate d;
9965 // Quit on redirect to allow response header inspection upon redirect.
9966 d.set_quit_on_redirect(true);
9967
rhalavatib7bd7c792017-04-27 05:25:169968 std::unique_ptr<URLRequest> req(context.CreateRequest(
9969 hsts_http_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
rob4e0be1f2014-09-11 23:40:229970 // Set Origin header to simulate a cross-origin request.
9971 HttpRequestHeaders request_headers;
9972 request_headers.SetHeader("Origin", kOriginHeaderValue);
9973 req->SetExtraRequestHeaders(request_headers);
9974
9975 req->Start();
9976 base::RunLoop().Run();
9977
9978 EXPECT_EQ(1, d.received_redirect_count());
9979
9980 const HttpResponseHeaders* headers = req->response_headers();
9981 std::string redirect_location;
9982 EXPECT_TRUE(headers->EnumerateHeader(NULL, "Location", &redirect_location));
9983 EXPECT_EQ(hsts_https_url.spec(), redirect_location);
9984
9985 std::string received_cors_header;
9986 EXPECT_TRUE(headers->EnumerateHeader(NULL, "Access-Control-Allow-Origin",
9987 &received_cors_header));
9988 EXPECT_EQ(kOriginHeaderValue, received_cors_header);
9989}
9990
[email protected]316c1e5e2012-09-12 15:17:449991namespace {
9992
9993class SSLClientAuthTestDelegate : public TestDelegate {
9994 public:
9995 SSLClientAuthTestDelegate() : on_certificate_requested_count_(0) {
9996 }
dchengb03027d2014-10-21 12:00:209997 void OnCertificateRequested(URLRequest* request,
9998 SSLCertRequestInfo* cert_request_info) override {
[email protected]316c1e5e2012-09-12 15:17:449999 on_certificate_requested_count_++;
Gabriel Charette53a9ef812017-07-26 12:36:2310000 base::RunLoop::QuitCurrentWhenIdleDeprecated();
[email protected]316c1e5e2012-09-12 15:17:4410001 }
10002 int on_certificate_requested_count() {
10003 return on_certificate_requested_count_;
10004 }
10005 private:
10006 int on_certificate_requested_count_;
10007};
10008
10009} // namespace
10010
10011// TODO(davidben): Test the rest of the code. Specifically,
10012// - Filtering which certificates to select.
10013// - Sending a certificate back.
10014// - Getting a certificate request in an SSL renegotiation sending the
10015// HTTP request.
10016TEST_F(HTTPSRequestTest, ClientAuthTest) {
tommycli59a63432015-11-06 00:10:5510017 EmbeddedTestServer test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10018 net::SSLServerConfig ssl_config;
ryanchung987b2ff2016-02-19 00:17:1210019 ssl_config.client_cert_type =
10020 SSLServerConfig::ClientCertType::OPTIONAL_CLIENT_CERT;
tommycli59a63432015-11-06 00:10:5510021 test_server.SetSSLConfig(net::EmbeddedTestServer::CERT_OK, ssl_config);
10022 test_server.AddDefaultHandlers(
[email protected]ce7d0cbc2013-05-03 18:57:2210023 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]316c1e5e2012-09-12 15:17:4410024 ASSERT_TRUE(test_server.Start());
10025
10026 SSLClientAuthTestDelegate d;
10027 {
danakj8522a25b2016-04-16 00:17:3610028 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610029 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
10030 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:4410031
[email protected]f7022f32014-08-21 16:32:1910032 r->Start();
10033 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410034
[email protected]255620da2013-08-19 13:14:2910035 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410036
10037 EXPECT_EQ(1, d.on_certificate_requested_count());
10038 EXPECT_FALSE(d.received_data_before_response());
10039 EXPECT_EQ(0, d.bytes_received());
10040
10041 // Send no certificate.
10042 // TODO(davidben): Get temporary client cert import (with keys) working on
10043 // all platforms so we can test sending a cert as well.
svaldez7872fd02015-11-19 21:10:5410044 r->ContinueWithCertificate(nullptr, nullptr);
[email protected]316c1e5e2012-09-12 15:17:4410045
[email protected]255620da2013-08-19 13:14:2910046 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410047
10048 EXPECT_EQ(1, d.response_started_count());
10049 EXPECT_FALSE(d.received_data_before_response());
10050 EXPECT_NE(0, d.bytes_received());
10051 }
10052}
10053
10054TEST_F(HTTPSRequestTest, ResumeTest) {
10055 // Test that we attempt a session resume when making two connections to the
10056 // same host.
[email protected]ce7d0cbc2013-05-03 18:57:2210057 SpawnedTestServer::SSLOptions ssl_options;
[email protected]316c1e5e2012-09-12 15:17:4410058 ssl_options.record_resume = true;
[email protected]ce7d0cbc2013-05-03 18:57:2210059 SpawnedTestServer test_server(
10060 SpawnedTestServer::TYPE_HTTPS,
10061 ssl_options,
10062 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]316c1e5e2012-09-12 15:17:4410063 ASSERT_TRUE(test_server.Start());
10064
10065 SSLClientSocket::ClearSessionCache();
10066
10067 {
10068 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610069 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610070 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10071 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:4410072
[email protected]f7022f32014-08-21 16:32:1910073 r->Start();
10074 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410075
[email protected]255620da2013-08-19 13:14:2910076 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410077
10078 EXPECT_EQ(1, d.response_started_count());
10079 }
10080
10081 reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())->
10082 CloseAllConnections();
10083
10084 {
10085 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610086 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610087 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10088 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:4410089
[email protected]f7022f32014-08-21 16:32:1910090 r->Start();
10091 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410092
[email protected]255620da2013-08-19 13:14:2910093 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410094
10095 // The response will look like;
10096 // insert abc
10097 // lookup abc
10098 // insert xyz
10099 //
10100 // With a newline at the end which makes the split think that there are
10101 // four lines.
10102
10103 EXPECT_EQ(1, d.response_started_count());
brettw3a2c6902015-07-06 19:43:2910104 std::vector<std::string> lines = base::SplitString(
10105 d.data_received(), "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]316c1e5e2012-09-12 15:17:4410106 ASSERT_EQ(4u, lines.size()) << d.data_received();
10107
10108 std::string session_id;
10109
10110 for (size_t i = 0; i < 2; i++) {
brettw3a2c6902015-07-06 19:43:2910111 std::vector<std::string> parts = base::SplitString(
10112 lines[i], "\t", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
[email protected]316c1e5e2012-09-12 15:17:4410113 ASSERT_EQ(2u, parts.size());
10114 if (i == 0) {
10115 EXPECT_EQ("insert", parts[0]);
10116 session_id = parts[1];
10117 } else {
10118 EXPECT_EQ("lookup", parts[0]);
10119 EXPECT_EQ(session_id, parts[1]);
10120 }
10121 }
10122 }
10123}
10124
Adam Langley32352ad2014-10-14 22:31:0010125// AssertTwoDistinctSessionsInserted checks that |session_info|, which must be
10126// the result of fetching "ssl-session-cache" from the test server, indicates
10127// that exactly two different sessions were inserted, with no lookups etc.
10128static void AssertTwoDistinctSessionsInserted(const string& session_info) {
brettw3a2c6902015-07-06 19:43:2910129 std::vector<std::string> lines = base::SplitString(
10130 session_info, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
Adam Langley32352ad2014-10-14 22:31:0010131 ASSERT_EQ(3u, lines.size()) << session_info;
10132
10133 std::string session_id;
10134 for (size_t i = 0; i < 2; i++) {
brettw3a2c6902015-07-06 19:43:2910135 std::vector<std::string> parts = base::SplitString(
10136 lines[i], "\t", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
Adam Langley32352ad2014-10-14 22:31:0010137 ASSERT_EQ(2u, parts.size());
10138 EXPECT_EQ("insert", parts[0]);
10139 if (i == 0) {
10140 session_id = parts[1];
10141 } else {
10142 EXPECT_NE(session_id, parts[1]);
10143 }
10144 }
10145}
10146
[email protected]316c1e5e2012-09-12 15:17:4410147TEST_F(HTTPSRequestTest, SSLSessionCacheShardTest) {
10148 // Test that sessions aren't resumed when the value of ssl_session_cache_shard
10149 // differs.
[email protected]ce7d0cbc2013-05-03 18:57:2210150 SpawnedTestServer::SSLOptions ssl_options;
[email protected]316c1e5e2012-09-12 15:17:4410151 ssl_options.record_resume = true;
[email protected]ce7d0cbc2013-05-03 18:57:2210152 SpawnedTestServer test_server(
10153 SpawnedTestServer::TYPE_HTTPS,
10154 ssl_options,
10155 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]316c1e5e2012-09-12 15:17:4410156 ASSERT_TRUE(test_server.Start());
10157
10158 SSLClientSocket::ClearSessionCache();
10159
10160 {
10161 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610162 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610163 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10164 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:4410165
[email protected]f7022f32014-08-21 16:32:1910166 r->Start();
10167 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410168
[email protected]255620da2013-08-19 13:14:2910169 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410170
10171 EXPECT_EQ(1, d.response_started_count());
10172 }
10173
10174 // Now create a new HttpCache with a different ssl_session_cache_shard value.
mmenke6ddfbea2017-05-31 21:48:4110175 HttpNetworkSession::Context session_context;
10176 session_context.host_resolver = default_context_.host_resolver();
10177 session_context.cert_verifier = default_context_.cert_verifier();
10178 session_context.transport_security_state =
10179 default_context_.transport_security_state();
10180 session_context.cert_transparency_verifier =
rsleevid6de8302016-06-21 01:33:2010181 default_context_.cert_transparency_verifier();
mmenke6ddfbea2017-05-31 21:48:4110182 session_context.ct_policy_enforcer = default_context_.ct_policy_enforcer();
Lily Houghton8c2f97d2018-01-22 05:06:5910183 session_context.proxy_resolution_service = default_context_.proxy_resolution_service();
mmenke6ddfbea2017-05-31 21:48:4110184 session_context.ssl_config_service = default_context_.ssl_config_service();
10185 session_context.http_auth_handler_factory =
[email protected]316c1e5e2012-09-12 15:17:4410186 default_context_.http_auth_handler_factory();
mmenke6ddfbea2017-05-31 21:48:4110187 session_context.http_server_properties =
10188 default_context_.http_server_properties();
[email protected]316c1e5e2012-09-12 15:17:4410189
mmenke6ddfbea2017-05-31 21:48:4110190 HttpNetworkSession network_session(HttpNetworkSession::Params(),
10191 session_context);
zhongyi4928bd52017-02-08 02:16:2710192 std::unique_ptr<HttpCache> cache(
10193 new HttpCache(&network_session, HttpCache::DefaultBackend::InMemory(0),
10194 false /* is_main_cache */));
[email protected]316c1e5e2012-09-12 15:17:4410195
10196 default_context_.set_http_transaction_factory(cache.get());
10197
10198 {
10199 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610200 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610201 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10202 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]316c1e5e2012-09-12 15:17:4410203
[email protected]f7022f32014-08-21 16:32:1910204 r->Start();
10205 EXPECT_TRUE(r->is_pending());
[email protected]316c1e5e2012-09-12 15:17:4410206
[email protected]255620da2013-08-19 13:14:2910207 base::RunLoop().Run();
[email protected]316c1e5e2012-09-12 15:17:4410208
10209 // The response will look like;
10210 // insert abc
10211 // insert xyz
10212 //
10213 // With a newline at the end which makes the split think that there are
10214 // three lines.
10215
10216 EXPECT_EQ(1, d.response_started_count());
Adam Langley32352ad2014-10-14 22:31:0010217 AssertTwoDistinctSessionsInserted(d.data_received());
[email protected]316c1e5e2012-09-12 15:17:4410218 }
10219}
10220
[email protected]48d2b7c52014-06-27 01:16:5510221class HTTPSFallbackTest : public testing::Test {
10222 public:
fdorayf33fede2017-05-11 21:18:1010223 HTTPSFallbackTest() : context_(true) {
davidben095ebb52017-04-12 22:23:3410224 ssl_config_service_ = new TestSSLConfigService(
10225 true /* check for EV */, false /* online revocation checking */,
10226 false /* require rev. checking for local anchors */,
10227 false /* token binding enabled */);
10228 context_.set_ssl_config_service(ssl_config_service_.get());
10229 }
Chris Watkins7a41d3552017-12-01 02:13:2710230 ~HTTPSFallbackTest() override = default;
[email protected]48d2b7c52014-06-27 01:16:5510231
10232 protected:
davidben095ebb52017-04-12 22:23:3410233 TestSSLConfigService* ssl_config_service() {
10234 return ssl_config_service_.get();
10235 }
10236
[email protected]48d2b7c52014-06-27 01:16:5510237 void DoFallbackTest(const SpawnedTestServer::SSLOptions& ssl_options) {
10238 DCHECK(!request_);
Adam Langley32352ad2014-10-14 22:31:0010239 context_.Init();
10240 delegate_.set_allow_certificate_errors(true);
10241
[email protected]48d2b7c52014-06-27 01:16:5510242 SpawnedTestServer test_server(
10243 SpawnedTestServer::TYPE_HTTPS,
10244 ssl_options,
10245 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
10246 ASSERT_TRUE(test_server.Start());
10247
tommycli59a63432015-11-06 00:10:5510248 request_ = context_.CreateRequest(test_server.GetURL("/"), DEFAULT_PRIORITY,
rhalavatib7bd7c792017-04-27 05:25:1610249 &delegate_, TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]48d2b7c52014-06-27 01:16:5510250 request_->Start();
10251
10252 base::RunLoop().Run();
10253 }
10254
davidben095ebb52017-04-12 22:23:3410255 void ExpectConnection(int version) {
10256 EXPECT_EQ(1, delegate_.response_started_count());
10257 EXPECT_NE(0, delegate_.bytes_received());
10258 EXPECT_EQ(version, SSLConnectionStatusToVersion(
10259 request_->ssl_info().connection_status));
10260 }
10261
[email protected]48d2b7c52014-06-27 01:16:5510262 void ExpectFailure(int error) {
10263 EXPECT_EQ(1, delegate_.response_started_count());
maksim.sisovb53724b52016-09-16 05:30:5010264 EXPECT_EQ(error, delegate_.request_status());
[email protected]48d2b7c52014-06-27 01:16:5510265 }
10266
10267 private:
10268 TestDelegate delegate_;
davidben5a312152016-06-27 22:11:4710269 TestURLRequestContext context_;
danakj8522a25b2016-04-16 00:17:3610270 std::unique_ptr<URLRequest> request_;
davidben095ebb52017-04-12 22:23:3410271 scoped_refptr<TestSSLConfigService> ssl_config_service_;
[email protected]48d2b7c52014-06-27 01:16:5510272};
10273
davidbenb127ca82015-06-15 19:05:4210274// Tests the TLS 1.0 fallback doesn't happen.
10275TEST_F(HTTPSFallbackTest, TLSv1NoFallback) {
[email protected]48d2b7c52014-06-27 01:16:5510276 SpawnedTestServer::SSLOptions ssl_options(
10277 SpawnedTestServer::SSLOptions::CERT_OK);
10278 ssl_options.tls_intolerant =
10279 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_1;
10280
10281 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
davidben3b267512016-02-24 19:46:5510282 ExpectFailure(ERR_SSL_VERSION_OR_CIPHER_MISMATCH);
davidbenb127ca82015-06-15 19:05:4210283}
10284
davidben5a312152016-06-27 22:11:4710285// Tests the TLS 1.1 fallback doesn't happen.
davidben3b267512016-02-24 19:46:5510286TEST_F(HTTPSFallbackTest, TLSv1_1NoFallback) {
davidbenb127ca82015-06-15 19:05:4210287 SpawnedTestServer::SSLOptions ssl_options(
10288 SpawnedTestServer::SSLOptions::CERT_OK);
10289 ssl_options.tls_intolerant =
10290 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_2;
10291
10292 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
[email protected]48d2b7c52014-06-27 01:16:5510293 ExpectFailure(ERR_SSL_VERSION_OR_CIPHER_MISMATCH);
10294}
10295
davidben095ebb52017-04-12 22:23:3410296// Tests that TLS 1.3 interference results in a dedicated error code.
10297TEST_F(HTTPSFallbackTest, TLSv1_3Interference) {
10298 SpawnedTestServer::SSLOptions ssl_options(
10299 SpawnedTestServer::SSLOptions::CERT_OK);
10300 ssl_options.tls_intolerant =
10301 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_3;
10302 ssl_config_service()->set_max_version(SSL_PROTOCOL_VERSION_TLS1_3);
10303
10304 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
10305 ExpectFailure(ERR_SSL_VERSION_INTERFERENCE);
10306}
10307
10308// Tests that disabling TLS 1.3 leaves TLS 1.3 interference unnoticed.
10309TEST_F(HTTPSFallbackTest, TLSv1_3InterferenceDisableVersion) {
10310 SpawnedTestServer::SSLOptions ssl_options(
10311 SpawnedTestServer::SSLOptions::CERT_OK);
10312 ssl_options.tls_intolerant =
10313 SpawnedTestServer::SSLOptions::TLS_INTOLERANT_TLS1_3;
10314 ssl_config_service()->set_max_version(SSL_PROTOCOL_VERSION_TLS1_2);
10315
10316 ASSERT_NO_FATAL_FAILURE(DoFallbackTest(ssl_options));
10317 ExpectConnection(SSL_CONNECTION_VERSION_TLS1_2);
10318}
10319
[email protected]a8fed1742013-12-27 02:14:2410320class HTTPSSessionTest : public testing::Test {
10321 public:
fdorayf33fede2017-05-11 21:18:1010322 HTTPSSessionTest() : default_context_(true) {
[email protected]cba24642014-08-15 20:49:5910323 cert_verifier_.set_default_result(OK);
[email protected]a8fed1742013-12-27 02:14:2410324
10325 default_context_.set_network_delegate(&default_network_delegate_);
10326 default_context_.set_cert_verifier(&cert_verifier_);
10327 default_context_.Init();
10328 }
Chris Watkins7a41d3552017-12-01 02:13:2710329 ~HTTPSSessionTest() override = default;
[email protected]a8fed1742013-12-27 02:14:2410330
10331 protected:
10332 MockCertVerifier cert_verifier_;
10333 TestNetworkDelegate default_network_delegate_; // Must outlive URLRequest.
10334 TestURLRequestContext default_context_;
10335};
10336
10337// Tests that session resumption is not attempted if an invalid certificate
10338// is presented.
10339TEST_F(HTTPSSessionTest, DontResumeSessionsForInvalidCertificates) {
10340 SpawnedTestServer::SSLOptions ssl_options;
10341 ssl_options.record_resume = true;
10342 SpawnedTestServer test_server(
10343 SpawnedTestServer::TYPE_HTTPS,
10344 ssl_options,
10345 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
10346 ASSERT_TRUE(test_server.Start());
10347
10348 SSLClientSocket::ClearSessionCache();
10349
10350 // Simulate the certificate being expired and attempt a connection.
[email protected]cba24642014-08-15 20:49:5910351 cert_verifier_.set_default_result(ERR_CERT_DATE_INVALID);
[email protected]a8fed1742013-12-27 02:14:2410352 {
10353 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610354 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610355 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10356 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]a8fed1742013-12-27 02:14:2410357
[email protected]f7022f32014-08-21 16:32:1910358 r->Start();
10359 EXPECT_TRUE(r->is_pending());
[email protected]a8fed1742013-12-27 02:14:2410360
10361 base::RunLoop().Run();
10362
10363 EXPECT_EQ(1, d.response_started_count());
10364 }
10365
10366 reinterpret_cast<HttpCache*>(default_context_.http_transaction_factory())->
10367 CloseAllConnections();
10368
10369 // Now change the certificate to be acceptable (so that the response is
10370 // loaded), and ensure that no session id is presented to the peer.
[email protected]cba24642014-08-15 20:49:5910371 cert_verifier_.set_default_result(OK);
[email protected]a8fed1742013-12-27 02:14:2410372 {
10373 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3610374 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1610375 test_server.GetURL("ssl-session-cache"), DEFAULT_PRIORITY, &d,
10376 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]a8fed1742013-12-27 02:14:2410377
[email protected]f7022f32014-08-21 16:32:1910378 r->Start();
10379 EXPECT_TRUE(r->is_pending());
[email protected]a8fed1742013-12-27 02:14:2410380
10381 base::RunLoop().Run();
10382
10383 // The response will look like;
10384 // insert abc
10385 // insert xyz
10386 //
10387 // With a newline at the end which makes the split think that there are
10388 // three lines.
10389 //
10390 // If a session was presented (eg: a bug), then the response would look
10391 // like;
10392 // insert abc
10393 // lookup abc
10394 // insert xyz
10395
10396 EXPECT_EQ(1, d.response_started_count());
Adam Langley32352ad2014-10-14 22:31:0010397 AssertTwoDistinctSessionsInserted(d.data_received());
[email protected]a8fed1742013-12-27 02:14:2410398 }
10399}
10400
[email protected]dffe8242012-03-20 15:14:2710401// This the fingerprint of the "Testing CA" certificate used by the testserver.
10402// See net/data/ssl/certificates/ocsp-test-root.pem.
David Benjamin9cedc3a52017-08-20 21:30:5810403static const SHA256HashValue kOCSPTestCertFingerprint = {{
10404 0x0c, 0xa9, 0x05, 0x11, 0xb0, 0xa2, 0xc0, 0x1d, 0x40, 0x6a, 0x99,
10405 0x04, 0x21, 0x36, 0x45, 0x3f, 0x59, 0x12, 0x5c, 0x80, 0x64, 0x2d,
10406 0x46, 0x6a, 0x3b, 0x78, 0x9e, 0x84, 0xea, 0x54, 0x0f, 0x8b,
mattm3b4376f12016-10-03 21:07:1510407}};
[email protected]dffe8242012-03-20 15:14:2710408
[email protected]51523f52013-07-31 21:57:2810409// This is the SHA256, SPKI hash of the "Testing CA" certificate used by the
10410// testserver.
mattm0b12a6f2016-11-29 19:57:1610411static const SHA256HashValue kOCSPTestCertSPKI = {{
10412 0x05, 0xa8, 0xf6, 0xfd, 0x8e, 0x10, 0xfe, 0x92, 0x2f, 0x22, 0x75,
10413 0x46, 0x40, 0xf4, 0xc4, 0x57, 0x06, 0x0d, 0x95, 0xfd, 0x60, 0x31,
10414 0x3b, 0xf3, 0xfc, 0x12, 0x47, 0xe7, 0x66, 0x1a, 0x82, 0xa3,
10415}};
[email protected]51523f52013-07-31 21:57:2810416
[email protected]dffe8242012-03-20 15:14:2710417// This is the policy OID contained in the certificates that testserver
10418// generates.
10419static const char kOCSPTestCertPolicy[] = "1.3.6.1.4.1.11129.2.4.1";
10420
10421class HTTPSOCSPTest : public HTTPSRequestTest {
10422 public:
10423 HTTPSOCSPTest()
[email protected]ef2bf422012-05-11 03:27:0910424 : context_(true),
[email protected]b6f2de32012-08-17 04:35:0810425 ev_test_policy_(
10426 new ScopedTestEVPolicy(EVRootCAMetadata::GetInstance(),
10427 kOCSPTestCertFingerprint,
10428 kOCSPTestCertPolicy)) {
[email protected]a13234c2012-03-20 21:45:0210429 }
10430
dcheng67be2b1f2014-10-27 21:47:2910431 void SetUp() override {
rsleevid6de8302016-06-21 01:33:2010432 context_.SetCTPolicyEnforcer(
Jeremy Roman0579ed62017-08-29 15:56:1910433 std::make_unique<AllowAnyCertCTPolicyEnforcer>());
rsleevid6de8302016-06-21 01:33:2010434 SetupContext();
[email protected]ef2bf422012-05-11 03:27:0910435 context_.Init();
[email protected]dffe8242012-03-20 15:14:2710436
[email protected]cba24642014-08-15 20:49:5910437 scoped_refptr<X509Certificate> root_cert =
[email protected]3a86a712013-07-30 07:16:2010438 ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem");
dchengc2e01e82014-08-27 00:24:4210439 CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert.get());
[email protected]90499482013-06-01 00:39:5010440 test_root_.reset(new ScopedTestRoot(root_cert.get()));
[email protected]dffe8242012-03-20 15:14:2710441
Matt Muellerfb271992018-01-30 18:10:4810442#if defined(OS_ANDROID) || defined(USE_BUILTIN_CERT_VERIFIER)
Eric Romanefddd0a2017-10-10 02:14:2510443 SetGlobalCertNetFetcherForTesting(net::CreateCertNetFetcher(&context_));
10444#endif
10445
svaldez2135be52016-04-20 16:34:5310446#if defined(USE_NSS_CERTS)
[email protected]ef2bf422012-05-11 03:27:0910447 SetURLRequestContextForNSSHttpIO(&context_);
[email protected]dffe8242012-03-20 15:14:2710448 EnsureNSSHttpIOInit();
10449#endif
10450 }
10451
dadrian612337a2016-07-20 22:36:5810452 void DoConnectionWithDelegate(
10453 const SpawnedTestServer::SSLOptions& ssl_options,
10454 TestDelegate* delegate,
10455 SSLInfo* out_ssl_info) {
10456 // Always overwrite |out_ssl_info|.
10457 out_ssl_info->Reset();
10458
[email protected]ce7d0cbc2013-05-03 18:57:2210459 SpawnedTestServer test_server(
10460 SpawnedTestServer::TYPE_HTTPS,
10461 ssl_options,
10462 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
[email protected]dffe8242012-03-20 15:14:2710463 ASSERT_TRUE(test_server.Start());
10464
dadrian612337a2016-07-20 22:36:5810465 delegate->set_allow_certificate_errors(true);
rhalavatib7bd7c792017-04-27 05:25:1610466 std::unique_ptr<URLRequest> r(
10467 context_.CreateRequest(test_server.GetURL("/"), DEFAULT_PRIORITY,
10468 delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1910469 r->Start();
[email protected]dffe8242012-03-20 15:14:2710470
[email protected]255620da2013-08-19 13:14:2910471 base::RunLoop().Run();
dadrian612337a2016-07-20 22:36:5810472 EXPECT_EQ(1, delegate->response_started_count());
[email protected]dffe8242012-03-20 15:14:2710473
dadrian612337a2016-07-20 22:36:5810474 *out_ssl_info = r->ssl_info();
10475 }
10476
10477 void DoConnection(const SpawnedTestServer::SSLOptions& ssl_options,
10478 CertStatus* out_cert_status) {
10479 // Always overwrite |out_cert_status|.
10480 *out_cert_status = 0;
10481
10482 TestDelegate d;
10483 SSLInfo ssl_info;
10484 ASSERT_NO_FATAL_FAILURE(
10485 DoConnectionWithDelegate(ssl_options, &d, &ssl_info));
10486
10487 *out_cert_status = ssl_info.cert_status;
[email protected]dffe8242012-03-20 15:14:2710488 }
10489
dcheng67be2b1f2014-10-27 21:47:2910490 ~HTTPSOCSPTest() override {
Matt Muellerfb271992018-01-30 18:10:4810491#if defined(OS_ANDROID) || defined(USE_BUILTIN_CERT_VERIFIER)
Eric Romanefddd0a2017-10-10 02:14:2510492 ShutdownGlobalCertNetFetcher();
10493#endif
10494
svaldez2135be52016-04-20 16:34:5310495#if defined(USE_NSS_CERTS)
[email protected]dffe8242012-03-20 15:14:2710496 ShutdownNSSHttpIO();
10497#endif
10498 }
10499
[email protected]a13234c2012-03-20 21:45:0210500 protected:
rsleevid6de8302016-06-21 01:33:2010501 class AllowAnyCertCTPolicyEnforcer : public CTPolicyEnforcer {
10502 public:
10503 AllowAnyCertCTPolicyEnforcer() = default;
10504 ~AllowAnyCertCTPolicyEnforcer() override = default;
10505
Emily Stark627238f2017-11-29 03:29:5410506 ct::CTPolicyCompliance CheckCompliance(
rsleevid6de8302016-06-21 01:33:2010507 X509Certificate* cert,
10508 const SCTList& verified_scts,
tfarina42834112016-09-22 13:38:2010509 const NetLogWithSource& net_log) override {
Emily Stark627238f2017-11-29 03:29:5410510 return ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS;
rsleevid6de8302016-06-21 01:33:2010511 }
rsleevid6de8302016-06-21 01:33:2010512 };
[email protected]a13234c2012-03-20 21:45:0210513 // SetupContext configures the URLRequestContext that will be used for making
10514 // connetions to testserver. This can be overridden in test subclasses for
10515 // different behaviour.
rsleevid6de8302016-06-21 01:33:2010516 virtual void SetupContext() {
10517 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1410518 true /* check for EV */, true /* online revocation checking */,
10519 false /* require rev. checking for local
10520 anchors */,
10521 false /* token binding enabled */));
[email protected]a13234c2012-03-20 21:45:0210522 }
10523
danakj8522a25b2016-04-16 00:17:3610524 std::unique_ptr<ScopedTestRoot> test_root_;
[email protected]ef2bf422012-05-11 03:27:0910525 TestURLRequestContext context_;
danakj8522a25b2016-04-16 00:17:3610526 std::unique_ptr<ScopedTestEVPolicy> ev_test_policy_;
[email protected]dffe8242012-03-20 15:14:2710527};
10528
[email protected]a13234c2012-03-20 21:45:0210529static CertStatus ExpectedCertStatusForFailedOnlineRevocationCheck() {
mattmaf868e72016-09-23 23:25:2010530#if defined(OS_WIN) || defined(OS_MACOSX)
[email protected]a13234c2012-03-20 21:45:0210531 // Windows can return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION but we don't
10532 // have that ability on other platforms.
Eric Roman1b628daa2017-10-19 19:52:0410533 // TODO(eroman): Should this also be the return value for
10534 // CertVerifyProcBuiltin?
[email protected]a13234c2012-03-20 21:45:0210535 return CERT_STATUS_UNABLE_TO_CHECK_REVOCATION;
10536#else
10537 return 0;
10538#endif
10539}
10540
[email protected]3a86a712013-07-30 07:16:2010541// SystemSupportsHardFailRevocationChecking returns true iff the current
10542// operating system supports revocation checking and can distinguish between
10543// situations where a given certificate lacks any revocation information (eg:
10544// no CRLDistributionPoints and no OCSP Responder AuthorityInfoAccess) and when
10545// revocation information cannot be obtained (eg: the CRL was unreachable).
10546// If it does not, then tests which rely on 'hard fail' behaviour should be
10547// skipped.
10548static bool SystemSupportsHardFailRevocationChecking() {
Eric Roman1b628daa2017-10-19 19:52:0410549#if defined(OS_WIN) || defined(USE_NSS_CERTS) || \
10550 defined(USE_BUILTIN_CERT_VERIFIER)
[email protected]3a86a712013-07-30 07:16:2010551 return true;
10552#else
10553 return false;
10554#endif
10555}
10556
[email protected]a13234c2012-03-20 21:45:0210557// SystemUsesChromiumEVMetadata returns true iff the current operating system
10558// uses Chromium's EV metadata (i.e. EVRootCAMetadata). If it does not, then
10559// several tests are effected because our testing EV certificate won't be
10560// recognised as EV.
10561static bool SystemUsesChromiumEVMetadata() {
Eric Roman5f8d9d22017-10-17 02:32:5210562#if defined(PLATFORM_USES_CHROMIUM_EV_METADATA)
[email protected]05454a432012-03-20 20:04:0110563 return true;
Eric Roman5f8d9d22017-10-17 02:32:5210564#else
10565 return false;
[email protected]05454a432012-03-20 20:04:0110566#endif
10567}
10568
mattmaf868e72016-09-23 23:25:2010569// Returns the expected CertStatus for tests that expect an online revocation
10570// check failure as a result of checking a test EV cert, which will not
10571// actually trigger an online revocation check on some platforms.
10572static CertStatus ExpectedCertStatusForFailedOnlineEVRevocationCheck() {
10573 if (SystemUsesChromiumEVMetadata()) {
10574 return ExpectedCertStatusForFailedOnlineRevocationCheck();
10575 } else {
10576 // If SystemUsesChromiumEVMetadata is false, revocation checking will not
10577 // be enabled, and thus there will not be a revocation check to fail.
10578 return 0u;
10579 }
10580}
10581
[email protected]b6f2de32012-08-17 04:35:0810582static bool SystemSupportsOCSP() {
Sergey Ulanovee7c8db2017-12-08 00:18:3910583#if defined(OS_ANDROID)
[email protected]a13234c2012-03-20 21:45:0210584 // TODO(jnd): http://crbug.com/117478 - EV verification is not yet supported.
10585 return false;
10586#else
10587 return true;
10588#endif
10589}
10590
davidbend1fb2f12014-11-08 02:51:0010591static bool SystemSupportsOCSPStapling() {
Eric Roman1b628daa2017-10-19 19:52:0410592#if defined(USE_NSS_CERTS) || defined(OS_WIN) || \
10593 defined(USE_BUILTIN_CERT_VERIFIER)
mathpc992e602015-10-21 20:34:0310594 return true;
mathpc992e602015-10-21 20:34:0310595#else
10596 return false;
10597#endif
davidbend1fb2f12014-11-08 02:51:0010598}
10599
[email protected]dffe8242012-03-20 15:14:2710600TEST_F(HTTPSOCSPTest, Valid) {
10601 if (!SystemSupportsOCSP()) {
10602 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
10603 return;
10604 }
10605
[email protected]ce7d0cbc2013-05-03 18:57:2210606 SpawnedTestServer::SSLOptions ssl_options(
10607 SpawnedTestServer::SSLOptions::CERT_AUTO);
10608 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
[email protected]dffe8242012-03-20 15:14:2710609
[email protected]924e9f92012-12-16 22:00:5310610 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1210611 DoConnection(ssl_options, &cert_status);
[email protected]dffe8242012-03-20 15:14:2710612
10613 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
10614
[email protected]a13234c2012-03-20 21:45:0210615 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
10616 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
[email protected]dffe8242012-03-20 15:14:2710617
10618 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10619}
10620
10621TEST_F(HTTPSOCSPTest, Revoked) {
10622 if (!SystemSupportsOCSP()) {
10623 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
10624 return;
10625 }
10626
[email protected]ce7d0cbc2013-05-03 18:57:2210627 SpawnedTestServer::SSLOptions ssl_options(
10628 SpawnedTestServer::SSLOptions::CERT_AUTO);
10629 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
[email protected]dffe8242012-03-20 15:14:2710630
10631 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1210632 DoConnection(ssl_options, &cert_status);
[email protected]dffe8242012-03-20 15:14:2710633
[email protected]dffe8242012-03-20 15:14:2710634 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
[email protected]dffe8242012-03-20 15:14:2710635 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
10636 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10637}
10638
10639TEST_F(HTTPSOCSPTest, Invalid) {
10640 if (!SystemSupportsOCSP()) {
10641 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
10642 return;
10643 }
10644
[email protected]ce7d0cbc2013-05-03 18:57:2210645 SpawnedTestServer::SSLOptions ssl_options(
10646 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5810647 ssl_options.ocsp_status =
10648 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
[email protected]dffe8242012-03-20 15:14:2710649
[email protected]924e9f92012-12-16 22:00:5310650 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1210651 DoConnection(ssl_options, &cert_status);
[email protected]dffe8242012-03-20 15:14:2710652
Eric Roman1b628daa2017-10-19 19:52:0410653#if defined(USE_BUILTIN_CERT_VERIFIER)
10654 // TODO(649017): This test uses soft-fail revocation checking, but returns an
10655 // invalid OCSP response (can't parse). CertVerifyProcBuiltin currently
10656 // doesn't consider this a candidate for soft-fail (only considers
10657 // network-level failures as skippable).
10658 EXPECT_EQ(CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
10659 cert_status & CERT_STATUS_UNABLE_TO_CHECK_REVOCATION);
10660#else
[email protected]a13234c2012-03-20 21:45:0210661 EXPECT_EQ(ExpectedCertStatusForFailedOnlineRevocationCheck(),
[email protected]dffe8242012-03-20 15:14:2710662 cert_status & CERT_STATUS_ALL_ERRORS);
Eric Roman1b628daa2017-10-19 19:52:0410663#endif
[email protected]dffe8242012-03-20 15:14:2710664
10665 // Without a positive OCSP response, we shouldn't show the EV status.
10666 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
10667 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10668}
[email protected]a13234c2012-03-20 21:45:0210669
davidbend1fb2f12014-11-08 02:51:0010670TEST_F(HTTPSOCSPTest, ValidStapled) {
mathpc992e602015-10-21 20:34:0310671 if (!SystemSupportsOCSPStapling()) {
davidbend1fb2f12014-11-08 02:51:0010672 LOG(WARNING)
10673 << "Skipping test because system doesn't support OCSP stapling";
10674 return;
10675 }
10676
10677 SpawnedTestServer::SSLOptions ssl_options(
10678 SpawnedTestServer::SSLOptions::CERT_AUTO);
10679 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
10680 ssl_options.staple_ocsp_response = true;
10681 ssl_options.ocsp_server_unavailable = true;
10682
10683 CertStatus cert_status;
10684 DoConnection(ssl_options, &cert_status);
10685
10686 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
10687
10688 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
10689 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
10690
10691 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10692}
10693
davidben6c3191b2014-11-21 22:38:0410694// Disabled on NSS ports. See https://crbug.com/431716.
davidben71f35ff2015-04-17 20:54:4810695#if defined(USE_NSS_CERTS)
davidben6c3191b2014-11-21 22:38:0410696#define MAYBE_RevokedStapled DISABLED_RevokedStapled
10697#else
10698#define MAYBE_RevokedStapled RevokedStapled
10699#endif
10700TEST_F(HTTPSOCSPTest, MAYBE_RevokedStapled) {
mathpc992e602015-10-21 20:34:0310701 if (!SystemSupportsOCSPStapling()) {
davidbend1fb2f12014-11-08 02:51:0010702 LOG(WARNING)
10703 << "Skipping test because system doesn't support OCSP stapling";
10704 return;
10705 }
10706
10707 SpawnedTestServer::SSLOptions ssl_options(
10708 SpawnedTestServer::SSLOptions::CERT_AUTO);
10709 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
10710 ssl_options.staple_ocsp_response = true;
10711 ssl_options.ocsp_server_unavailable = true;
10712
10713 CertStatus cert_status;
10714 DoConnection(ssl_options, &cert_status);
10715
10716 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
10717 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
10718 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
10719}
10720
dadriand476e652016-07-26 21:33:2410721TEST_F(HTTPSOCSPTest, ExpectStapleReportSentOnMissing) {
Martijn Croonenb1383da2017-10-11 11:56:3510722 SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
10723
dadriand476e652016-07-26 21:33:2410724 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10725 https_test_server.SetSSLConfig(
10726 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10727 https_test_server.ServeFilesFromSourceDirectory(
10728 base::FilePath(kTestFilePath));
10729 ASSERT_TRUE(https_test_server.Start());
10730
10731 // Set up a MockCertVerifier to accept the certificate that the server sends,
10732 // but not provide any OCSP information.
10733 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10734 ASSERT_TRUE(cert);
10735 MockCertVerifier cert_verifier;
10736 CertVerifyResult verify_result;
10737 verify_result.verified_cert = cert;
10738 verify_result.is_issued_by_known_root = true;
10739 verify_result.ocsp_result.response_status = OCSPVerifyResult::MISSING;
10740 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
10741
10742 // Catch the Expect-Staple report.
10743 TransportSecurityState transport_security_state;
10744 MockCertificateReportSender mock_report_sender;
10745 transport_security_state.SetReportSender(&mock_report_sender);
10746
10747 // Use a MockHostResolver (which by default maps all hosts to 127.0.0.1) so
10748 // that the request can be sent to a site on the Expect-Staple preload list.
10749 MockHostResolver host_resolver;
10750 TestNetworkDelegate network_delegate;
10751 TestURLRequestContext context(true);
10752 context.set_host_resolver(&host_resolver);
10753 context.set_transport_security_state(&transport_security_state);
10754 context.set_network_delegate(&network_delegate);
10755 context.set_cert_verifier(&cert_verifier);
10756 context.Init();
10757
10758 // Now send a request to trigger the violation.
10759 TestDelegate d;
10760 GURL url = https_test_server.GetURL("/");
10761 GURL::Replacements replace_host;
10762 replace_host.SetHostStr(kExpectStapleStaticHostname);
10763 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610764 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
10765 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
dadriand476e652016-07-26 21:33:2410766 violating_request->Start();
10767 base::RunLoop().Run();
10768
10769 // Confirm a report was sent.
10770 EXPECT_FALSE(mock_report_sender.latest_report().empty());
10771 EXPECT_EQ(GURL(kExpectStapleReportURI),
10772 mock_report_sender.latest_report_uri());
10773}
10774
estark13e0b312016-12-22 23:52:3210775// Tests that Expect-Staple reports are not sent for connections on which there
10776// is a certificate error.
10777TEST_F(HTTPSOCSPTest, ExpectStapleReportNotSentOnMissingWithCertError) {
10778 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10779 https_test_server.SetSSLConfig(
10780 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10781 https_test_server.ServeFilesFromSourceDirectory(
10782 base::FilePath(kTestFilePath));
10783 ASSERT_TRUE(https_test_server.Start());
10784
10785 // Set up a MockCertVerifier to report an error for the certificate
10786 // and indicate that there was no stapled OCSP response.
10787 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10788 ASSERT_TRUE(cert);
10789 MockCertVerifier cert_verifier;
10790 CertVerifyResult verify_result;
10791 verify_result.cert_status = CERT_STATUS_DATE_INVALID;
10792 verify_result.verified_cert = cert;
10793 verify_result.is_issued_by_known_root = true;
10794 verify_result.ocsp_result.response_status = OCSPVerifyResult::MISSING;
10795 cert_verifier.AddResultForCert(cert.get(), verify_result,
10796 ERR_CERT_DATE_INVALID);
10797
10798 // Set up a mock report sender so that the test can check that an
10799 // Expect-Staple report is not sent.
10800 TransportSecurityState transport_security_state;
10801 MockCertificateReportSender mock_report_sender;
10802 transport_security_state.SetReportSender(&mock_report_sender);
10803
10804 TestNetworkDelegate network_delegate;
10805 TestURLRequestContext context(true);
10806
10807 // Force |kExpectStapleStaticHostname| to resolve to |https_test_server|.
10808 MockHostResolver host_resolver;
10809 context.set_host_resolver(&host_resolver);
10810
10811 context.set_transport_security_state(&transport_security_state);
10812 context.set_network_delegate(&network_delegate);
10813 context.set_cert_verifier(&cert_verifier);
10814 context.Init();
10815
10816 // Make a connection to |kExpectStapleStaticHostname|. Because the
10817 // |verify_result| used with the |cert_verifier| will indicate a certificate
10818 // error, an Expect-Staple report should not be sent.
10819 TestDelegate d;
10820 GURL url = https_test_server.GetURL("/");
10821 GURL::Replacements replace_host;
10822 replace_host.SetHostStr(kExpectStapleStaticHostname);
10823 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610824 std::unique_ptr<URLRequest> violating_request(context.CreateRequest(
10825 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark13e0b312016-12-22 23:52:3210826 violating_request->Start();
10827 base::RunLoop().Run();
10828
10829 // Confirm a report was not sent.
10830 EXPECT_TRUE(mock_report_sender.latest_report().empty());
10831 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
10832}
10833
dadriand476e652016-07-26 21:33:2410834TEST_F(HTTPSOCSPTest, ExpectStapleReportNotSentOnValid) {
10835 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10836 https_test_server.SetSSLConfig(
10837 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10838 https_test_server.ServeFilesFromSourceDirectory(
10839 base::FilePath(kTestFilePath));
10840 ASSERT_TRUE(https_test_server.Start());
10841
10842 // Set up a MockCertVerifier to accept the certificate that the server sends,
10843 // and provide GOOD revocation status.
10844 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10845 ASSERT_TRUE(cert);
10846 MockCertVerifier cert_verifier;
10847 CertVerifyResult verify_result;
10848 verify_result.verified_cert = cert;
10849 verify_result.is_issued_by_known_root = true;
10850 verify_result.ocsp_result.response_status = OCSPVerifyResult::PROVIDED;
10851 verify_result.ocsp_result.revocation_status = OCSPRevocationStatus::GOOD;
10852 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
10853
10854 // Catch the Expect-Staple report.
10855 TransportSecurityState transport_security_state;
10856 MockCertificateReportSender mock_report_sender;
10857 transport_security_state.SetReportSender(&mock_report_sender);
10858
10859 // Use a MockHostResolver (which by default maps all hosts to 127.0.0.1) so
10860 // that the request can be sent to a site on the Expect-Staple preload list.
10861 MockHostResolver host_resolver;
10862 TestNetworkDelegate network_delegate;
10863 TestURLRequestContext context(true);
10864 context.set_host_resolver(&host_resolver);
10865 context.set_transport_security_state(&transport_security_state);
10866 context.set_network_delegate(&network_delegate);
10867 context.set_cert_verifier(&cert_verifier);
10868 context.Init();
10869
10870 // This request should not not trigger an Expect-Staple violation.
10871 TestDelegate d;
10872 GURL url = https_test_server.GetURL("/");
10873 GURL::Replacements replace_host;
10874 replace_host.SetHostStr(kExpectStapleStaticHostname);
10875 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610876 std::unique_ptr<URLRequest> ok_request(context.CreateRequest(
10877 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
dadriand476e652016-07-26 21:33:2410878 ok_request->Start();
10879 base::RunLoop().Run();
10880
10881 // Check that no report was sent.
10882 EXPECT_TRUE(mock_report_sender.latest_report().empty());
10883 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
10884}
10885
estark13e0b312016-12-22 23:52:3210886// Tests that an Expect-Staple report is not sent when OCSP details are not
10887// checked on the connection.
10888TEST_F(HTTPSOCSPTest, ExpectStapleReportNotSentOnNotChecked) {
10889 EmbeddedTestServer https_test_server(net::EmbeddedTestServer::TYPE_HTTPS);
10890 https_test_server.SetSSLConfig(
10891 net::EmbeddedTestServer::CERT_COMMON_NAME_IS_DOMAIN);
10892 https_test_server.ServeFilesFromSourceDirectory(
10893 base::FilePath(kTestFilePath));
10894 ASSERT_TRUE(https_test_server.Start());
10895
10896 // Set up a MockCertVerifier to accept the certificate that the server sends,
10897 // and set |ocsp_result| to indicate that OCSP stapling details were not
10898 // checked on the connection.
10899 scoped_refptr<X509Certificate> cert = https_test_server.GetCertificate();
10900 ASSERT_TRUE(cert);
10901 MockCertVerifier cert_verifier;
10902 CertVerifyResult verify_result;
10903 verify_result.verified_cert = cert;
10904 verify_result.is_issued_by_known_root = true;
10905 verify_result.ocsp_result.response_status = OCSPVerifyResult::NOT_CHECKED;
10906 cert_verifier.AddResultForCert(cert.get(), verify_result, OK);
10907
10908 // Set up a mock report sender so that the test can check that an
10909 // Expect-Staple report is not sent.
10910 TransportSecurityState transport_security_state;
10911 MockCertificateReportSender mock_report_sender;
10912 transport_security_state.SetReportSender(&mock_report_sender);
10913
10914 TestNetworkDelegate network_delegate;
10915 TestURLRequestContext context(true);
10916
10917 // Force |kExpectStapleStaticHostname| to resolve to |https_test_server|.
10918 MockHostResolver host_resolver;
10919 context.set_host_resolver(&host_resolver);
10920
10921 context.set_transport_security_state(&transport_security_state);
10922 context.set_network_delegate(&network_delegate);
10923 context.set_cert_verifier(&cert_verifier);
10924 context.Init();
10925
10926 // Make a connection to |kExpectStapleStaticHostname|. Because the
10927 // |verify_result| used with the |cert_verifier| will indicate that OCSP
10928 // stapling details were not checked on the connection, an Expect-Staple
10929 // report should not be sent.
10930 TestDelegate d;
10931 GURL url = https_test_server.GetURL("/");
10932 GURL::Replacements replace_host;
10933 replace_host.SetHostStr(kExpectStapleStaticHostname);
10934 url = url.ReplaceComponents(replace_host);
rhalavatib7bd7c792017-04-27 05:25:1610935 std::unique_ptr<URLRequest> ok_request(context.CreateRequest(
10936 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
estark13e0b312016-12-22 23:52:3210937 ok_request->Start();
10938 base::RunLoop().Run();
10939
10940 // Check that no report was sent.
10941 EXPECT_TRUE(mock_report_sender.latest_report().empty());
10942 EXPECT_EQ(GURL(), mock_report_sender.latest_report_uri());
10943}
10944
dadrian612337a2016-07-20 22:36:5810945static const struct OCSPVerifyTestData {
10946 std::vector<SpawnedTestServer::SSLOptions::OCSPSingleResponse> ocsp_responses;
10947 SpawnedTestServer::SSLOptions::OCSPProduced ocsp_produced;
10948 OCSPVerifyResult::ResponseStatus response_status;
10949 bool has_revocation_status;
10950 OCSPRevocationStatus cert_status;
10951} kOCSPVerifyData[] = {
Eric Roman8673b812017-09-20 18:57:3110952 // 0
dadrian612337a2016-07-20 22:36:5810953 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10954 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10955 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10956 OCSPVerifyResult::PROVIDED,
10957 true,
10958 OCSPRevocationStatus::GOOD},
10959
Eric Roman8673b812017-09-20 18:57:3110960 // 1
dadrian612337a2016-07-20 22:36:5810961 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10962 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD}},
10963 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10964 OCSPVerifyResult::INVALID_DATE,
10965 false,
10966 OCSPRevocationStatus::UNKNOWN},
10967
Eric Roman8673b812017-09-20 18:57:3110968 // 2
dadrian612337a2016-07-20 22:36:5810969 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10970 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
10971 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10972 OCSPVerifyResult::INVALID_DATE,
10973 false,
10974 OCSPRevocationStatus::UNKNOWN},
10975
Eric Roman8673b812017-09-20 18:57:3110976 // 3
dadrian612337a2016-07-20 22:36:5810977 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10978 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
10979 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10980 OCSPVerifyResult::INVALID_DATE,
10981 false,
10982 OCSPRevocationStatus::UNKNOWN},
10983
Eric Roman8673b812017-09-20 18:57:3110984 // 4
dadrian612337a2016-07-20 22:36:5810985 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
10986 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
10987 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10988 OCSPVerifyResult::INVALID_DATE,
10989 false,
10990 OCSPRevocationStatus::UNKNOWN},
10991
Eric Roman8673b812017-09-20 18:57:3110992 // 5
dadrian612337a2016-07-20 22:36:5810993 {{{SpawnedTestServer::SSLOptions::OCSP_TRY_LATER,
10994 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
10995 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
10996 OCSPVerifyResult::ERROR_RESPONSE,
10997 false,
10998 OCSPRevocationStatus::UNKNOWN},
10999
Eric Roman8673b812017-09-20 18:57:3111000 // 6
dadrian612337a2016-07-20 22:36:5811001 {{{SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE,
11002 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11003 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11004 OCSPVerifyResult::PARSE_RESPONSE_ERROR,
11005 false,
11006 OCSPRevocationStatus::UNKNOWN},
11007
Eric Roman8673b812017-09-20 18:57:3111008 // 7
dadrian612337a2016-07-20 22:36:5811009 {{{SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE_DATA,
11010 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11011 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11012 OCSPVerifyResult::PARSE_RESPONSE_DATA_ERROR,
11013 false,
11014 OCSPRevocationStatus::UNKNOWN},
11015
Eric Roman8673b812017-09-20 18:57:3111016 // 8
dadrian612337a2016-07-20 22:36:5811017 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11018 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
11019 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11020 OCSPVerifyResult::INVALID_DATE,
11021 false,
11022 OCSPRevocationStatus::UNKNOWN},
11023
Eric Roman8673b812017-09-20 18:57:3111024 // 9
dadrian612337a2016-07-20 22:36:5811025 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11026 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11027 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11028 OCSPVerifyResult::PROVIDED,
11029 true,
11030 OCSPRevocationStatus::UNKNOWN},
11031
Eric Roman8673b812017-09-20 18:57:3111032 // 10
dadrian612337a2016-07-20 22:36:5811033 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11034 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD}},
11035 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11036 OCSPVerifyResult::INVALID_DATE,
11037 false,
11038 OCSPRevocationStatus::UNKNOWN},
11039
Eric Roman8673b812017-09-20 18:57:3111040 // 11
dadrian612337a2016-07-20 22:36:5811041 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11042 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
11043 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11044 OCSPVerifyResult::INVALID_DATE,
11045 false,
11046 OCSPRevocationStatus::UNKNOWN},
11047
Eric Roman8673b812017-09-20 18:57:3111048 // 12
dadrian612337a2016-07-20 22:36:5811049 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11050 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11051 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_BEFORE_CERT,
11052 OCSPVerifyResult::BAD_PRODUCED_AT,
11053 false,
11054 OCSPRevocationStatus::UNKNOWN},
11055
Eric Roman8673b812017-09-20 18:57:3111056 // 13
dadrian612337a2016-07-20 22:36:5811057 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11058 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11059 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_AFTER_CERT,
11060 OCSPVerifyResult::BAD_PRODUCED_AT,
11061 false,
11062 OCSPRevocationStatus::UNKNOWN},
11063
Eric Roman8673b812017-09-20 18:57:3111064 // 14
dadrian612337a2016-07-20 22:36:5811065 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11066 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11067 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_AFTER_CERT,
11068 OCSPVerifyResult::BAD_PRODUCED_AT,
11069 false,
11070 OCSPRevocationStatus::UNKNOWN},
11071
Eric Roman8673b812017-09-20 18:57:3111072 // 15
dadrian612337a2016-07-20 22:36:5811073 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11074 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11075 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11076 OCSPVerifyResult::PROVIDED,
11077 true,
11078 OCSPRevocationStatus::GOOD},
11079
Eric Roman8673b812017-09-20 18:57:3111080 // 16
dadrian612337a2016-07-20 22:36:5811081 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11082 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD},
11083 {SpawnedTestServer::SSLOptions::OCSP_OK,
11084 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11085 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11086 OCSPVerifyResult::PROVIDED,
11087 true,
11088 OCSPRevocationStatus::GOOD},
11089
Eric Roman8673b812017-09-20 18:57:3111090 // 17
dadrian612337a2016-07-20 22:36:5811091 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11092 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY},
11093 {SpawnedTestServer::SSLOptions::OCSP_OK,
11094 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11095 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11096 OCSPVerifyResult::PROVIDED,
11097 true,
11098 OCSPRevocationStatus::GOOD},
11099
Eric Roman8673b812017-09-20 18:57:3111100 // 18
dadrian612337a2016-07-20 22:36:5811101 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11102 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG},
11103 {SpawnedTestServer::SSLOptions::OCSP_OK,
11104 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11105 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11106 OCSPVerifyResult::PROVIDED,
11107 true,
11108 OCSPRevocationStatus::GOOD},
11109
Eric Roman8673b812017-09-20 18:57:3111110 // 19
dadrian612337a2016-07-20 22:36:5811111 {{{SpawnedTestServer::SSLOptions::OCSP_OK,
11112 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY},
11113 {SpawnedTestServer::SSLOptions::OCSP_OK,
11114 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD},
11115 {SpawnedTestServer::SSLOptions::OCSP_OK,
11116 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
11117 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11118 OCSPVerifyResult::INVALID_DATE,
11119 false,
11120 OCSPRevocationStatus::UNKNOWN},
11121
Eric Roman8673b812017-09-20 18:57:3111122 // 20
dadrian612337a2016-07-20 22:36:5811123 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11124 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11125 {SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11126 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11127 {SpawnedTestServer::SSLOptions::OCSP_OK,
11128 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11129 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11130 OCSPVerifyResult::PROVIDED,
11131 true,
11132 OCSPRevocationStatus::REVOKED},
11133
Eric Roman8673b812017-09-20 18:57:3111134 // 21
dadrian612337a2016-07-20 22:36:5811135 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11136 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11137 {SpawnedTestServer::SSLOptions::OCSP_OK,
11138 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11139 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11140 OCSPVerifyResult::PROVIDED,
11141 true,
11142 OCSPRevocationStatus::UNKNOWN},
11143
Eric Roman8673b812017-09-20 18:57:3111144 // 22
dadrian612337a2016-07-20 22:36:5811145 {{{SpawnedTestServer::SSLOptions::OCSP_UNKNOWN,
11146 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID},
11147 {SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11148 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG},
11149 {SpawnedTestServer::SSLOptions::OCSP_OK,
11150 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11151 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11152 OCSPVerifyResult::PROVIDED,
11153 true,
11154 OCSPRevocationStatus::UNKNOWN},
11155
Eric Roman8673b812017-09-20 18:57:3111156 // 23
dadrian612337a2016-07-20 22:36:5811157 {{{SpawnedTestServer::SSLOptions::OCSP_MISMATCHED_SERIAL,
11158 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11159 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11160 OCSPVerifyResult::NO_MATCHING_RESPONSE,
11161 false,
11162 OCSPRevocationStatus::UNKNOWN},
11163
Eric Roman8673b812017-09-20 18:57:3111164 // 24
dadrian612337a2016-07-20 22:36:5811165 {{{SpawnedTestServer::SSLOptions::OCSP_MISMATCHED_SERIAL,
11166 SpawnedTestServer::SSLOptions::OCSP_DATE_EARLY}},
11167 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11168 OCSPVerifyResult::NO_MATCHING_RESPONSE,
11169 false,
11170 OCSPRevocationStatus::UNKNOWN},
11171
Eric Roman8673b812017-09-20 18:57:3111172// These tests fail when using NSS for certificate verification, as NSS fails
11173// and doesn't return the partial path. As a result the OCSP checks being done
11174// at the CertVerifyProc layer cannot access the issuer certificate.
11175#if !defined(USE_NSS_CERTS)
11176 // 25
11177 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11178 SpawnedTestServer::SSLOptions::OCSP_DATE_VALID}},
11179 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11180 OCSPVerifyResult::PROVIDED,
11181 true,
11182 OCSPRevocationStatus::REVOKED},
11183
11184 // 26
11185 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11186 SpawnedTestServer::SSLOptions::OCSP_DATE_OLD}},
11187 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11188 OCSPVerifyResult::INVALID_DATE,
11189 false,
11190 OCSPRevocationStatus::UNKNOWN},
11191
11192 // 27
11193 {{{SpawnedTestServer::SSLOptions::OCSP_REVOKED,
11194 SpawnedTestServer::SSLOptions::OCSP_DATE_LONG}},
11195 SpawnedTestServer::SSLOptions::OCSP_PRODUCED_VALID,
11196 OCSPVerifyResult::INVALID_DATE,
11197 false,
11198 OCSPRevocationStatus::UNKNOWN},
11199#endif
dadrian612337a2016-07-20 22:36:5811200};
11201
11202class HTTPSOCSPVerifyTest
11203 : public HTTPSOCSPTest,
11204 public testing::WithParamInterface<OCSPVerifyTestData> {};
11205
11206TEST_P(HTTPSOCSPVerifyTest, VerifyResult) {
11207 SpawnedTestServer::SSLOptions ssl_options(
11208 SpawnedTestServer::SSLOptions::CERT_AUTO);
11209 OCSPVerifyTestData test = GetParam();
11210
11211 ssl_options.ocsp_responses = test.ocsp_responses;
11212 ssl_options.ocsp_produced = test.ocsp_produced;
11213 ssl_options.staple_ocsp_response = true;
11214
11215 SSLInfo ssl_info;
11216 OCSPErrorTestDelegate delegate;
11217 ASSERT_NO_FATAL_FAILURE(
11218 DoConnectionWithDelegate(ssl_options, &delegate, &ssl_info));
11219
11220 // The SSLInfo must be extracted from |delegate| on error, due to how
11221 // URLRequest caches certificate errors.
11222 if (delegate.have_certificate_errors()) {
11223 ASSERT_TRUE(delegate.on_ssl_certificate_error_called());
11224 ssl_info = delegate.ssl_info();
11225 }
11226
11227 EXPECT_EQ(test.response_status, ssl_info.ocsp_result.response_status);
11228
11229 if (test.has_revocation_status)
11230 EXPECT_EQ(test.cert_status, ssl_info.ocsp_result.revocation_status);
11231}
11232
11233INSTANTIATE_TEST_CASE_P(OCSPVerify,
11234 HTTPSOCSPVerifyTest,
11235 testing::ValuesIn(kOCSPVerifyData));
11236
mattm0b12a6f2016-11-29 19:57:1611237class HTTPSAIATest : public HTTPSOCSPTest {
11238 public:
11239 void SetupContext() override {
11240 context_.set_ssl_config_service(new TestSSLConfigService(
11241 false /* check for EV */, false /* online revocation checking */,
11242 false /* require rev. checking for local anchors */,
11243 false /* token binding enabled */));
11244 }
11245};
11246
11247TEST_F(HTTPSAIATest, AIAFetching) {
11248 SpawnedTestServer::SSLOptions ssl_options(
11249 SpawnedTestServer::SSLOptions::CERT_AUTO_AIA_INTERMEDIATE);
11250 SpawnedTestServer test_server(
11251 SpawnedTestServer::TYPE_HTTPS, ssl_options,
11252 base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
11253 ASSERT_TRUE(test_server.Start());
11254
11255 TestDelegate d;
11256 d.set_allow_certificate_errors(true);
11257 std::unique_ptr<URLRequest> r(context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611258 test_server.GetURL("/defaultresponse"), DEFAULT_PRIORITY, &d,
11259 TRAFFIC_ANNOTATION_FOR_TESTS));
mattm0b12a6f2016-11-29 19:57:1611260
11261 r->Start();
11262 EXPECT_TRUE(r->is_pending());
11263
11264 base::RunLoop().Run();
11265
11266 EXPECT_EQ(1, d.response_started_count());
11267
11268 CertStatus cert_status = r->ssl_info().cert_status;
Matt Muellerfb271992018-01-30 18:10:4811269 EXPECT_EQ(OK, d.request_status());
11270 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11271 ASSERT_TRUE(r->ssl_info().cert);
11272 EXPECT_EQ(2u, r->ssl_info().cert->intermediate_buffers().size());
mattm0b12a6f2016-11-29 19:57:1611273 ASSERT_TRUE(r->ssl_info().unverified_cert);
Matt Muellera4193272017-12-07 00:23:3411274 EXPECT_EQ(0u, r->ssl_info().unverified_cert->intermediate_buffers().size());
mattm0b12a6f2016-11-29 19:57:1611275}
11276
[email protected]3a86a712013-07-30 07:16:2011277class HTTPSHardFailTest : public HTTPSOCSPTest {
11278 protected:
rsleevid6de8302016-06-21 01:33:2011279 void SetupContext() override {
11280 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1411281 false /* check for EV */, false /* online revocation checking */,
11282 true /* require rev. checking for local
11283 anchors */,
11284 false /* token binding enabled */));
[email protected]3a86a712013-07-30 07:16:2011285 }
11286};
11287
[email protected]3a86a712013-07-30 07:16:2011288TEST_F(HTTPSHardFailTest, FailsOnOCSPInvalid) {
11289 if (!SystemSupportsOCSP()) {
11290 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11291 return;
11292 }
11293
11294 if (!SystemSupportsHardFailRevocationChecking()) {
11295 LOG(WARNING) << "Skipping test because system doesn't support hard fail "
11296 << "revocation checking";
11297 return;
11298 }
11299
11300 SpawnedTestServer::SSLOptions ssl_options(
11301 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811302 ssl_options.ocsp_status =
11303 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
[email protected]3a86a712013-07-30 07:16:2011304
11305 CertStatus cert_status;
11306 DoConnection(ssl_options, &cert_status);
11307
Eric Roman1b628daa2017-10-19 19:52:0411308#if defined(USE_BUILTIN_CERT_VERIFIER)
11309 // TODO(crbug.com/649017): Should we consider invalid response as
11310 // affirmatively revoked?
11311 EXPECT_EQ(CERT_STATUS_UNABLE_TO_CHECK_REVOCATION,
11312 cert_status & CERT_STATUS_UNABLE_TO_CHECK_REVOCATION);
11313#else
11314 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_REVOKED);
11315#endif
[email protected]3a86a712013-07-30 07:16:2011316
11317 // Without a positive OCSP response, we shouldn't show the EV status.
Eric Roman1b628daa2017-10-19 19:52:0411318 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]3a86a712013-07-30 07:16:2011319 EXPECT_TRUE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
11320}
11321
[email protected]a13234c2012-03-20 21:45:0211322class HTTPSEVCRLSetTest : public HTTPSOCSPTest {
11323 protected:
rsleevid6de8302016-06-21 01:33:2011324 void SetupContext() override {
11325 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1411326 true /* check for EV */, false /* online revocation checking */,
11327 false /* require rev. checking for local
11328 anchors */,
11329 false /* token binding enabled */));
[email protected]a13234c2012-03-20 21:45:0211330 }
11331};
11332
Eric Romane2243cc62017-10-17 03:59:1311333// Helper class to set the global CRLSet, and on destruction restore the
11334// previously set one.
11335class ScopedSetCRLSet {
11336 public:
11337 ScopedSetCRLSet(scoped_refptr<CRLSet> crl_set) {
11338 prev_crl_set_ = SSLConfigService::GetCRLSet();
11339 SSLConfigService::SetCRLSetForTesting(std::move(crl_set));
11340 }
11341
11342 ~ScopedSetCRLSet() {
11343 SSLConfigService::SetCRLSetForTesting(std::move(prev_crl_set_));
11344 }
11345
11346 private:
11347 scoped_refptr<CRLSet> prev_crl_set_;
11348};
11349
[email protected]a13234c2012-03-20 21:45:0211350TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndInvalidOCSP) {
11351 if (!SystemSupportsOCSP()) {
11352 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11353 return;
11354 }
11355
[email protected]ce7d0cbc2013-05-03 18:57:2211356 SpawnedTestServer::SSLOptions ssl_options(
11357 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811358 ssl_options.ocsp_status =
11359 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311360 ScopedSetCRLSet set_crlset(nullptr);
[email protected]a13234c2012-03-20 21:45:0211361
[email protected]924e9f92012-12-16 22:00:5311362 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211363 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211364
mattmaf868e72016-09-23 23:25:2011365 EXPECT_EQ(ExpectedCertStatusForFailedOnlineEVRevocationCheck(),
[email protected]a13234c2012-03-20 21:45:0211366 cert_status & CERT_STATUS_ALL_ERRORS);
11367
11368 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]b6f2de32012-08-17 04:35:0811369 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11370 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211371}
11372
[email protected]be0fff62013-08-29 23:37:4811373TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndRevokedOCSP) {
11374 if (!SystemSupportsOCSP()) {
11375 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11376 return;
11377 }
11378
11379 SpawnedTestServer::SSLOptions ssl_options(
11380 SpawnedTestServer::SSLOptions::CERT_AUTO);
11381 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
Eric Romane2243cc62017-10-17 03:59:1311382 ScopedSetCRLSet set_crlset(nullptr);
[email protected]be0fff62013-08-29 23:37:4811383
11384 CertStatus cert_status;
11385 DoConnection(ssl_options, &cert_status);
11386
mattm1a282f52016-11-10 21:49:4211387// Currently only works for Windows and OS X. When using NSS, it's not
11388// possible to determine whether the check failed because of actual
11389// revocation or because there was an OCSP failure.
11390#if defined(OS_WIN) || defined(OS_MACOSX)
[email protected]be0fff62013-08-29 23:37:4811391 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
11392#else
11393 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11394#endif
11395
11396 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11397 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11398 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
11399}
11400
[email protected]a13234c2012-03-20 21:45:0211401TEST_F(HTTPSEVCRLSetTest, MissingCRLSetAndGoodOCSP) {
11402 if (!SystemSupportsOCSP()) {
11403 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11404 return;
11405 }
11406
[email protected]ce7d0cbc2013-05-03 18:57:2211407 SpawnedTestServer::SSLOptions ssl_options(
11408 SpawnedTestServer::SSLOptions::CERT_AUTO);
11409 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
Eric Romane2243cc62017-10-17 03:59:1311410 ScopedSetCRLSet set_crlset(nullptr);
[email protected]a13234c2012-03-20 21:45:0211411
11412 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211413 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211414
11415 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11416
11417 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11418 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
[email protected]b6f2de32012-08-17 04:35:0811419 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11420 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211421}
11422
11423TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSet) {
11424 if (!SystemSupportsOCSP()) {
11425 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11426 return;
11427 }
11428
[email protected]ce7d0cbc2013-05-03 18:57:2211429 SpawnedTestServer::SSLOptions ssl_options(
11430 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811431 ssl_options.ocsp_status =
11432 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311433 ScopedSetCRLSet set_crlset(CRLSet::ExpiredCRLSetForTesting());
[email protected]a13234c2012-03-20 21:45:0211434
11435 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211436 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211437
mattmaf868e72016-09-23 23:25:2011438 EXPECT_EQ(ExpectedCertStatusForFailedOnlineEVRevocationCheck(),
[email protected]a13234c2012-03-20 21:45:0211439 cert_status & CERT_STATUS_ALL_ERRORS);
11440
11441 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]b6f2de32012-08-17 04:35:0811442 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11443 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211444}
11445
[email protected]51523f52013-07-31 21:57:2811446TEST_F(HTTPSEVCRLSetTest, FreshCRLSetCovered) {
11447 if (!SystemSupportsOCSP()) {
11448 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11449 return;
11450 }
11451
11452 SpawnedTestServer::SSLOptions ssl_options(
11453 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811454 ssl_options.ocsp_status =
11455 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Adam Langleyea6d6782017-12-05 23:57:3311456 ScopedSetCRLSet set_crlset(
11457 CRLSet::ForTesting(false, &kOCSPTestCertSPKI, "", "", {}));
[email protected]51523f52013-07-31 21:57:2811458
11459 CertStatus cert_status;
11460 DoConnection(ssl_options, &cert_status);
11461
11462 // With a fresh CRLSet that covers the issuing certificate, we shouldn't do a
11463 // revocation check for EV.
11464 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11465 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
11466 static_cast<bool>(cert_status & CERT_STATUS_IS_EV));
11467 EXPECT_FALSE(
11468 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
11469}
11470
11471TEST_F(HTTPSEVCRLSetTest, FreshCRLSetNotCovered) {
11472 if (!SystemSupportsOCSP()) {
11473 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11474 return;
11475 }
11476
[email protected]ce7d0cbc2013-05-03 18:57:2211477 SpawnedTestServer::SSLOptions ssl_options(
11478 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811479 ssl_options.ocsp_status =
11480 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311481 ScopedSetCRLSet set_crlset(CRLSet::EmptyCRLSetForTesting());
[email protected]a13234c2012-03-20 21:45:0211482
[email protected]51523f52013-07-31 21:57:2811483 CertStatus cert_status = 0;
[email protected]295e5cd2012-08-23 01:05:1211484 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211485
[email protected]51523f52013-07-31 21:57:2811486 // Even with a fresh CRLSet, we should still do online revocation checks when
11487 // the certificate chain isn't covered by the CRLSet, which it isn't in this
11488 // test.
mattmaf868e72016-09-23 23:25:2011489 EXPECT_EQ(ExpectedCertStatusForFailedOnlineEVRevocationCheck(),
[email protected]51523f52013-07-31 21:57:2811490 cert_status & CERT_STATUS_ALL_ERRORS);
[email protected]a13234c2012-03-20 21:45:0211491
[email protected]51523f52013-07-31 21:57:2811492 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
[email protected]a13234c2012-03-20 21:45:0211493 EXPECT_EQ(SystemUsesChromiumEVMetadata(),
[email protected]51523f52013-07-31 21:57:2811494 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
[email protected]a13234c2012-03-20 21:45:0211495}
11496
[email protected]b6f2de32012-08-17 04:35:0811497TEST_F(HTTPSEVCRLSetTest, ExpiredCRLSetAndRevokedNonEVCert) {
11498 // Test that when EV verification is requested, but online revocation
11499 // checking is disabled, and the leaf certificate is not in fact EV, that
11500 // no revocation checking actually happens.
11501 if (!SystemSupportsOCSP()) {
11502 LOG(WARNING) << "Skipping test because system doesn't support OCSP";
11503 return;
11504 }
11505
11506 // Unmark the certificate's OID as EV, which should disable revocation
11507 // checking (as per the user preference)
11508 ev_test_policy_.reset();
11509
[email protected]ce7d0cbc2013-05-03 18:57:2211510 SpawnedTestServer::SSLOptions ssl_options(
11511 SpawnedTestServer::SSLOptions::CERT_AUTO);
11512 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_REVOKED;
Eric Romane2243cc62017-10-17 03:59:1311513 ScopedSetCRLSet set_crlset(CRLSet::ExpiredCRLSetForTesting());
[email protected]b6f2de32012-08-17 04:35:0811514
11515 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211516 DoConnection(ssl_options, &cert_status);
[email protected]b6f2de32012-08-17 04:35:0811517
11518 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11519
11520 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11521 EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
11522}
11523
[email protected]a13234c2012-03-20 21:45:0211524class HTTPSCRLSetTest : public HTTPSOCSPTest {
11525 protected:
rsleevid6de8302016-06-21 01:33:2011526 void SetupContext() override {
11527 context_.set_ssl_config_service(new TestSSLConfigService(
nharperb7441ef2016-01-25 23:54:1411528 false /* check for EV */, false /* online revocation checking */,
11529 false /* require rev. checking for local
11530 anchors */,
11531 false /* token binding enabled */));
[email protected]a13234c2012-03-20 21:45:0211532 }
11533};
11534
11535TEST_F(HTTPSCRLSetTest, ExpiredCRLSet) {
[email protected]ce7d0cbc2013-05-03 18:57:2211536 SpawnedTestServer::SSLOptions ssl_options(
11537 SpawnedTestServer::SSLOptions::CERT_AUTO);
dadrian612337a2016-07-20 22:36:5811538 ssl_options.ocsp_status =
11539 SpawnedTestServer::SSLOptions::OCSP_INVALID_RESPONSE;
Eric Romane2243cc62017-10-17 03:59:1311540 ScopedSetCRLSet set_crlset(CRLSet::ExpiredCRLSetForTesting());
[email protected]a13234c2012-03-20 21:45:0211541
[email protected]924e9f92012-12-16 22:00:5311542 CertStatus cert_status;
[email protected]295e5cd2012-08-23 01:05:1211543 DoConnection(ssl_options, &cert_status);
[email protected]a13234c2012-03-20 21:45:0211544
11545 // If we're not trying EV verification then, even if the CRLSet has expired,
11546 // we don't fall back to online revocation checks.
11547 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11548 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11549 EXPECT_FALSE(cert_status & CERT_STATUS_REV_CHECKING_ENABLED);
11550}
[email protected]51523f52013-07-31 21:57:2811551
11552TEST_F(HTTPSCRLSetTest, CRLSetRevoked) {
Eric Romanefddd0a2017-10-10 02:14:2511553#if defined(OS_ANDROID)
[email protected]51523f52013-07-31 21:57:2811554 LOG(WARNING) << "Skipping test because system doesn't support CRLSets";
11555 return;
11556#endif
11557
11558 SpawnedTestServer::SSLOptions ssl_options(
11559 SpawnedTestServer::SSLOptions::CERT_AUTO);
11560 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
11561 ssl_options.cert_serial = 10;
Eric Romane2243cc62017-10-17 03:59:1311562 ScopedSetCRLSet set_crlset(
Adam Langleyea6d6782017-12-05 23:57:3311563 CRLSet::ForTesting(false, &kOCSPTestCertSPKI, "\x0a", "", {}));
[email protected]51523f52013-07-31 21:57:2811564
11565 CertStatus cert_status = 0;
11566 DoConnection(ssl_options, &cert_status);
11567
11568 // If the certificate is recorded as revoked in the CRLSet, that should be
11569 // reflected without online revocation checking.
11570 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
11571 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11572 EXPECT_FALSE(
11573 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
11574}
Adam Langleyea6d6782017-12-05 23:57:3311575
11576TEST_F(HTTPSCRLSetTest, CRLSetRevokedBySubject) {
11577#if defined(OS_ANDROID)
11578 LOG(WARNING) << "Skipping test because system doesn't support CRLSets";
11579 return;
11580#endif
11581
11582 SpawnedTestServer::SSLOptions ssl_options(
11583 SpawnedTestServer::SSLOptions::CERT_AUTO);
11584 ssl_options.ocsp_status = SpawnedTestServer::SSLOptions::OCSP_OK;
11585 static const char kCommonName[] = "Test CN";
11586 ssl_options.cert_common_name = kCommonName;
11587
11588 {
11589 ScopedSetCRLSet set_crlset(
11590 CRLSet::ForTesting(false, nullptr, "", kCommonName, {}));
11591
11592 CertStatus cert_status = 0;
11593 DoConnection(ssl_options, &cert_status);
11594
11595 // If the certificate is recorded as revoked in the CRLSet, that should be
11596 // reflected without online revocation checking.
11597 EXPECT_EQ(CERT_STATUS_REVOKED, cert_status & CERT_STATUS_ALL_ERRORS);
11598 EXPECT_FALSE(cert_status & CERT_STATUS_IS_EV);
11599 EXPECT_FALSE(
11600 static_cast<bool>(cert_status & CERT_STATUS_REV_CHECKING_ENABLED));
11601 }
11602
11603 const uint8_t kTestServerSPKISHA256[32] = {
11604 0xb3, 0x91, 0xac, 0x73, 0x32, 0x54, 0x7f, 0x7b, 0x8a, 0x62, 0x77,
11605 0x73, 0x1d, 0x45, 0x7b, 0x23, 0x46, 0x69, 0xef, 0x6f, 0x05, 0x3d,
11606 0x07, 0x22, 0x15, 0x18, 0xd6, 0x10, 0x8b, 0xa1, 0x49, 0x33,
11607 };
11608 const std::string spki_hash(
11609 reinterpret_cast<const char*>(kTestServerSPKISHA256),
11610 sizeof(kTestServerSPKISHA256));
11611
11612 {
11613 ScopedSetCRLSet set_crlset(
11614 CRLSet::ForTesting(false, nullptr, "", kCommonName, {spki_hash}));
11615
11616 CertStatus cert_status = 0;
11617 DoConnection(ssl_options, &cert_status);
11618
11619 // When the correct SPKI hash is specified, the connection should succeed
11620 // even though the subject is listed in the CRLSet.
11621 EXPECT_EQ(0u, cert_status & CERT_STATUS_ALL_ERRORS);
11622 }
11623}
[email protected]316c1e5e2012-09-12 15:17:4411624#endif // !defined(OS_IOS)
[email protected]dffe8242012-03-20 15:14:2711625
Sergey Ulanovc4580e72017-09-13 23:30:1111626#if !BUILDFLAG(DISABLE_FTP_SUPPORT) && !defined(OS_ANDROID) && \
11627 !defined(OS_FUCHSIA)
11628// FTP uses a second TCP connection with the port number allocated dynamically
11629// on the server side, so it would be hard to make RemoteTestServer proxy FTP
11630// connections reliably. FTP tests are disabled on platforms that use
11631// RemoteTestServer. See http://crbug.com/495220
[email protected]b89ca032009-08-31 21:41:3111632class URLRequestTestFTP : public URLRequestTest {
[email protected]95409e12010-08-17 20:07:1111633 public:
[email protected]d9fca99a2012-02-24 16:16:2011634 URLRequestTestFTP()
mmenkecd4c7532016-10-19 18:36:0511635 : ftp_test_server_(SpawnedTestServer::TYPE_FTP,
tommycli59a63432015-11-06 00:10:5511636 base::FilePath(kTestFilePath)) {
mmenke9f2ec60c2015-06-01 20:59:4711637 // Can't use |default_context_|'s HostResolver to set up the
11638 // FTPTransactionFactory because it hasn't been created yet.
11639 default_context_.set_host_resolver(&host_resolver_);
11640 }
11641
11642 // URLRequestTest interface:
11643 void SetUpFactory() override {
11644 // Add FTP support to the default URLRequestContext.
11645 job_factory_impl_->SetProtocolHandler(
mmenkecd4c7532016-10-19 18:36:0511646 "ftp", FtpProtocolHandler::Create(&host_resolver_));
mmenke9f2ec60c2015-06-01 20:59:4711647 }
11648
11649 std::string GetTestFileContents() {
11650 base::FilePath path;
11651 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &path));
11652 path = path.Append(kTestFilePath);
11653 path = path.AppendASCII(kFtpTestFile);
11654 std::string contents;
11655 EXPECT_TRUE(base::ReadFileToString(path, &contents));
11656 return contents;
[email protected]95409e12010-08-17 20:07:1111657 }
11658
[email protected]b89ca032009-08-31 21:41:3111659 protected:
mmenkecd4c7532016-10-19 18:36:0511660 // Note that this is destroyed before the FtpProtocolHandler that references
11661 // it, which is owned by the parent class. Since no requests are made during
11662 // teardown, this works, though it's not great.
mmenke9f2ec60c2015-06-01 20:59:4711663 MockHostResolver host_resolver_;
mmenke9f2ec60c2015-06-01 20:59:4711664
tommycli59a63432015-11-06 00:10:5511665 SpawnedTestServer ftp_test_server_;
[email protected]b89ca032009-08-31 21:41:3111666};
11667
[email protected]d2a133182012-08-05 16:44:0811668// Make sure an FTP request using an unsafe ports fails.
[email protected]f2f31b32013-01-16 23:24:0911669TEST_F(URLRequestTestFTP, UnsafePort) {
[email protected]d2a133182012-08-05 16:44:0811670 GURL url("ftp://127.0.0.1:7");
[email protected]d2a133182012-08-05 16:44:0811671
11672 TestDelegate d;
11673 {
rhalavatib7bd7c792017-04-27 05:25:1611674 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
11675 url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911676 r->Start();
11677 EXPECT_TRUE(r->is_pending());
[email protected]d2a133182012-08-05 16:44:0811678
[email protected]255620da2013-08-19 13:14:2911679 base::RunLoop().Run();
[email protected]d2a133182012-08-05 16:44:0811680
[email protected]f7022f32014-08-21 16:32:1911681 EXPECT_FALSE(r->is_pending());
maksim.sisovb53724b52016-09-16 05:30:5011682 EXPECT_EQ(ERR_UNSAFE_PORT, d.request_status());
[email protected]d2a133182012-08-05 16:44:0811683 }
11684}
11685
mmenke9f2ec60c2015-06-01 20:59:4711686TEST_F(URLRequestTestFTP, FTPDirectoryListing) {
tommycli59a63432015-11-06 00:10:5511687 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111688
[email protected]a25e90e2009-09-09 17:05:3711689 TestDelegate d;
11690 {
danakj8522a25b2016-04-16 00:17:3611691 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611692 ftp_test_server_.GetURL("/"), DEFAULT_PRIORITY, &d,
11693 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911694 r->Start();
11695 EXPECT_TRUE(r->is_pending());
[email protected]a25e90e2009-09-09 17:05:3711696
[email protected]255620da2013-08-19 13:14:2911697 base::RunLoop().Run();
[email protected]a25e90e2009-09-09 17:05:3711698
[email protected]f7022f32014-08-21 16:32:1911699 EXPECT_FALSE(r->is_pending());
[email protected]a25e90e2009-09-09 17:05:3711700 EXPECT_EQ(1, d.response_started_count());
11701 EXPECT_FALSE(d.received_data_before_response());
11702 EXPECT_LT(0, d.bytes_received());
tommycli59a63432015-11-06 00:10:5511703 EXPECT_EQ(ftp_test_server_.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:1911704 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:5511705 EXPECT_EQ(ftp_test_server_.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:1911706 r->GetSocketAddress().port());
[email protected]a25e90e2009-09-09 17:05:3711707 }
11708}
11709
mmenke9f2ec60c2015-06-01 20:59:4711710TEST_F(URLRequestTestFTP, FTPGetTestAnonymous) {
tommycli59a63432015-11-06 00:10:5511711 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111712
[email protected]dd265012009-01-08 20:45:2711713 TestDelegate d;
11714 {
danakj8522a25b2016-04-16 00:17:3611715 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611716 ftp_test_server_.GetURL(kFtpTestFile), DEFAULT_PRIORITY, &d,
11717 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911718 r->Start();
11719 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711720
[email protected]255620da2013-08-19 13:14:2911721 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711722
[email protected]f7022f32014-08-21 16:32:1911723 EXPECT_FALSE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711724 EXPECT_EQ(1, d.response_started_count());
11725 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711726 EXPECT_EQ(GetTestFileContents(), d.data_received());
tommycli59a63432015-11-06 00:10:5511727 EXPECT_EQ(ftp_test_server_.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:1911728 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:5511729 EXPECT_EQ(ftp_test_server_.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:1911730 r->GetSocketAddress().port());
[email protected]dd265012009-01-08 20:45:2711731 }
11732}
11733
mmenke9f2ec60c2015-06-01 20:59:4711734TEST_F(URLRequestTestFTP, FTPGetTest) {
tommycli59a63432015-11-06 00:10:5511735 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111736
[email protected]dd265012009-01-08 20:45:2711737 TestDelegate d;
11738 {
danakj8522a25b2016-04-16 00:17:3611739 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511740 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11741 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611742 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911743 r->Start();
11744 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711745
[email protected]255620da2013-08-19 13:14:2911746 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711747
[email protected]f7022f32014-08-21 16:32:1911748 EXPECT_FALSE(r->is_pending());
mmenke9f2ec60c2015-06-01 20:59:4711749 EXPECT_EQ(1, d.response_started_count());
11750 EXPECT_FALSE(d.received_data_before_response());
11751 EXPECT_EQ(GetTestFileContents(), d.data_received());
tommycli59a63432015-11-06 00:10:5511752 EXPECT_EQ(ftp_test_server_.host_port_pair().host(),
[email protected]f7022f32014-08-21 16:32:1911753 r->GetSocketAddress().host());
tommycli59a63432015-11-06 00:10:5511754 EXPECT_EQ(ftp_test_server_.host_port_pair().port(),
[email protected]f7022f32014-08-21 16:32:1911755 r->GetSocketAddress().port());
[email protected]58e32bb2013-01-21 18:23:2511756
11757 LoadTimingInfo load_timing_info;
[email protected]f7022f32014-08-21 16:32:1911758 r->GetLoadTimingInfo(&load_timing_info);
[email protected]3b23a222013-05-15 21:33:2511759 TestLoadTimingNoHttpResponse(load_timing_info);
[email protected]dd265012009-01-08 20:45:2711760 }
11761}
11762
mmenke9f2ec60c2015-06-01 20:59:4711763TEST_F(URLRequestTestFTP, FTPCheckWrongPassword) {
tommycli59a63432015-11-06 00:10:5511764 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111765
[email protected]dd265012009-01-08 20:45:2711766 TestDelegate d;
11767 {
danakj8522a25b2016-04-16 00:17:3611768 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511769 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11770 "wrong_password"),
rhalavatib7bd7c792017-04-27 05:25:1611771 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911772 r->Start();
11773 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711774
[email protected]255620da2013-08-19 13:14:2911775 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711776
[email protected]f7022f32014-08-21 16:32:1911777 EXPECT_FALSE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711778 EXPECT_EQ(1, d.response_started_count());
11779 EXPECT_FALSE(d.received_data_before_response());
11780 EXPECT_EQ(d.bytes_received(), 0);
11781 }
11782}
11783
mmenke9f2ec60c2015-06-01 20:59:4711784TEST_F(URLRequestTestFTP, FTPCheckWrongPasswordRestart) {
tommycli59a63432015-11-06 00:10:5511785 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111786
[email protected]8b8a197d2009-08-26 15:57:5811787 TestDelegate d;
11788 // Set correct login credentials. The delegate will be asked for them when
11789 // the initial login with wrong credentials will fail.
[email protected]f3cf9802011-10-28 18:44:5811790 d.set_credentials(AuthCredentials(kChrome, kChrome));
[email protected]8b8a197d2009-08-26 15:57:5811791 {
danakj8522a25b2016-04-16 00:17:3611792 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511793 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11794 "wrong_password"),
rhalavatib7bd7c792017-04-27 05:25:1611795 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911796 r->Start();
11797 EXPECT_TRUE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811798
[email protected]255620da2013-08-19 13:14:2911799 base::RunLoop().Run();
[email protected]8b8a197d2009-08-26 15:57:5811800
[email protected]f7022f32014-08-21 16:32:1911801 EXPECT_FALSE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811802 EXPECT_EQ(1, d.response_started_count());
11803 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711804 EXPECT_EQ(GetTestFileContents(), d.data_received());
[email protected]8b8a197d2009-08-26 15:57:5811805 }
11806}
11807
mmenke9f2ec60c2015-06-01 20:59:4711808TEST_F(URLRequestTestFTP, FTPCheckWrongUser) {
tommycli59a63432015-11-06 00:10:5511809 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111810
[email protected]dd265012009-01-08 20:45:2711811 TestDelegate d;
11812 {
danakj8522a25b2016-04-16 00:17:3611813 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511814 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "wrong_user",
11815 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611816 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911817 r->Start();
11818 EXPECT_TRUE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711819
[email protected]255620da2013-08-19 13:14:2911820 base::RunLoop().Run();
[email protected]dd265012009-01-08 20:45:2711821
[email protected]f7022f32014-08-21 16:32:1911822 EXPECT_FALSE(r->is_pending());
[email protected]dd265012009-01-08 20:45:2711823 EXPECT_EQ(1, d.response_started_count());
11824 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711825 EXPECT_EQ(0, d.bytes_received());
[email protected]dd265012009-01-08 20:45:2711826 }
11827}
[email protected]8b8a197d2009-08-26 15:57:5811828
mmenke9f2ec60c2015-06-01 20:59:4711829TEST_F(URLRequestTestFTP, FTPCheckWrongUserRestart) {
tommycli59a63432015-11-06 00:10:5511830 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111831
[email protected]8b8a197d2009-08-26 15:57:5811832 TestDelegate d;
11833 // Set correct login credentials. The delegate will be asked for them when
11834 // the initial login with wrong credentials will fail.
[email protected]f3cf9802011-10-28 18:44:5811835 d.set_credentials(AuthCredentials(kChrome, kChrome));
[email protected]8b8a197d2009-08-26 15:57:5811836 {
danakj8522a25b2016-04-16 00:17:3611837 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511838 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "wrong_user",
11839 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611840 DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911841 r->Start();
11842 EXPECT_TRUE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811843
[email protected]255620da2013-08-19 13:14:2911844 base::RunLoop().Run();
[email protected]8b8a197d2009-08-26 15:57:5811845
[email protected]f7022f32014-08-21 16:32:1911846 EXPECT_FALSE(r->is_pending());
[email protected]8b8a197d2009-08-26 15:57:5811847 EXPECT_EQ(1, d.response_started_count());
11848 EXPECT_FALSE(d.received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711849 EXPECT_EQ(GetTestFileContents(), d.data_received());
[email protected]8b8a197d2009-08-26 15:57:5811850 }
11851}
[email protected]60a3df52009-09-22 16:13:2411852
mmenke9f2ec60c2015-06-01 20:59:4711853TEST_F(URLRequestTestFTP, FTPCacheURLCredentials) {
tommycli59a63432015-11-06 00:10:5511854 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111855
danakj8522a25b2016-04-16 00:17:3611856 std::unique_ptr<TestDelegate> d(new TestDelegate);
[email protected]60a3df52009-09-22 16:13:2411857 {
11858 // Pass correct login identity in the URL.
danakj8522a25b2016-04-16 00:17:3611859 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511860 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11861 "chrome"),
rhalavatib7bd7c792017-04-27 05:25:1611862 DEFAULT_PRIORITY, d.get(), TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911863 r->Start();
11864 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411865
[email protected]255620da2013-08-19 13:14:2911866 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411867
[email protected]f7022f32014-08-21 16:32:1911868 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411869 EXPECT_EQ(1, d->response_started_count());
11870 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711871 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411872 }
11873
11874 d.reset(new TestDelegate);
11875 {
11876 // This request should use cached identity from previous request.
danakj8522a25b2016-04-16 00:17:3611877 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611878 ftp_test_server_.GetURL(kFtpTestFile), DEFAULT_PRIORITY, d.get(),
11879 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911880 r->Start();
11881 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411882
[email protected]255620da2013-08-19 13:14:2911883 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411884
[email protected]f7022f32014-08-21 16:32:1911885 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411886 EXPECT_EQ(1, d->response_started_count());
11887 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711888 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411889 }
11890}
11891
mmenke9f2ec60c2015-06-01 20:59:4711892TEST_F(URLRequestTestFTP, FTPCacheLoginBoxCredentials) {
tommycli59a63432015-11-06 00:10:5511893 ASSERT_TRUE(ftp_test_server_.Start());
[email protected]95409e12010-08-17 20:07:1111894
danakj8522a25b2016-04-16 00:17:3611895 std::unique_ptr<TestDelegate> d(new TestDelegate);
[email protected]60a3df52009-09-22 16:13:2411896 // Set correct login credentials. The delegate will be asked for them when
11897 // the initial login with wrong credentials will fail.
[email protected]f3cf9802011-10-28 18:44:5811898 d->set_credentials(AuthCredentials(kChrome, kChrome));
[email protected]60a3df52009-09-22 16:13:2411899 {
danakj8522a25b2016-04-16 00:17:3611900 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
tommycli59a63432015-11-06 00:10:5511901 ftp_test_server_.GetURLWithUserAndPassword(kFtpTestFile, "chrome",
11902 "wrong_password"),
rhalavatib7bd7c792017-04-27 05:25:1611903 DEFAULT_PRIORITY, d.get(), TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911904 r->Start();
11905 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411906
[email protected]255620da2013-08-19 13:14:2911907 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411908
[email protected]f7022f32014-08-21 16:32:1911909 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411910 EXPECT_EQ(1, d->response_started_count());
11911 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711912 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411913 }
11914
11915 // Use a new delegate without explicit credentials. The cached ones should be
11916 // used.
11917 d.reset(new TestDelegate);
11918 {
11919 // Don't pass wrong credentials in the URL, they would override valid cached
11920 // ones.
danakj8522a25b2016-04-16 00:17:3611921 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611922 ftp_test_server_.GetURL(kFtpTestFile), DEFAULT_PRIORITY, d.get(),
11923 TRAFFIC_ANNOTATION_FOR_TESTS));
[email protected]f7022f32014-08-21 16:32:1911924 r->Start();
11925 EXPECT_TRUE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411926
[email protected]255620da2013-08-19 13:14:2911927 base::RunLoop().Run();
[email protected]60a3df52009-09-22 16:13:2411928
[email protected]f7022f32014-08-21 16:32:1911929 EXPECT_FALSE(r->is_pending());
[email protected]60a3df52009-09-22 16:13:2411930 EXPECT_EQ(1, d->response_started_count());
11931 EXPECT_FALSE(d->received_data_before_response());
mmenke9f2ec60c2015-06-01 20:59:4711932 EXPECT_EQ(GetTestFileContents(), d->data_received());
[email protected]60a3df52009-09-22 16:13:2411933 }
11934}
ricea3a1c71f2016-06-17 10:05:2611935
11936TEST_F(URLRequestTestFTP, RawBodyBytes) {
11937 ASSERT_TRUE(ftp_test_server_.Start());
11938
11939 TestDelegate d;
11940 std::unique_ptr<URLRequest> req(default_context().CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611941 ftp_test_server_.GetURL("simple.html"), DEFAULT_PRIORITY, &d,
11942 TRAFFIC_ANNOTATION_FOR_TESTS));
ricea3a1c71f2016-06-17 10:05:2611943 req->Start();
11944 base::RunLoop().Run();
11945
11946 EXPECT_EQ(6, req->GetRawBodyBytes());
11947}
11948
brettwa1228ebb2016-10-28 03:51:3411949#endif // !BUILDFLAG(DISABLE_FTP_SUPPORT)
[email protected]7461a402011-03-24 23:19:5111950
ttuttlec0c828492015-05-15 01:25:5511951TEST_F(URLRequestTest, NetworkAccessedClearOnDataRequest) {
11952 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:1611953 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
11954 GURL("data:,"), DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:5511955
11956 EXPECT_FALSE(req->response_info().network_accessed);
11957
11958 req->Start();
11959 base::RunLoop().Run();
11960
11961 EXPECT_EQ(1, default_network_delegate_.completed_requests());
11962 EXPECT_FALSE(req->response_info().network_accessed);
11963}
11964
11965TEST_F(URLRequestTest, NetworkAccessedSetOnHostResolutionFailure) {
11966 MockHostResolver host_resolver;
11967 TestNetworkDelegate network_delegate; // Must outlive URLRequest.
11968 TestURLRequestContext context(true);
11969 context.set_network_delegate(&network_delegate);
11970 context.set_host_resolver(&host_resolver);
11971 host_resolver.rules()->AddSimulatedFailure("*");
11972 context.Init();
11973
11974 TestDelegate d;
rhalavatib7bd7c792017-04-27 05:25:1611975 std::unique_ptr<URLRequest> req(
11976 context.CreateRequest(GURL("http://test_intercept/foo"), DEFAULT_PRIORITY,
11977 &d, TRAFFIC_ANNOTATION_FOR_TESTS));
ttuttlec0c828492015-05-15 01:25:5511978
11979 EXPECT_FALSE(req->response_info().network_accessed);
11980
11981 req->Start();
11982 base::RunLoop().Run();
11983 EXPECT_TRUE(req->response_info().network_accessed);
11984}
11985
mmenkeed0498b2015-12-08 23:20:4211986// Test that URLRequest is canceled correctly.
alexanderkcd904b52015-07-24 18:57:2211987// See http://crbug.com/508900
mmenkeed0498b2015-12-08 23:20:4211988TEST_F(URLRequestTest, URLRequestRedirectJobCancelRequest) {
alexanderkcd904b52015-07-24 18:57:2211989 TestDelegate d;
danakj8522a25b2016-04-16 00:17:3611990 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
rhalavatib7bd7c792017-04-27 05:25:1611991 GURL("http://not-a-real-domain/"), DEFAULT_PRIORITY, &d,
11992 TRAFFIC_ANNOTATION_FOR_TESTS));
alexanderkcd904b52015-07-24 18:57:2211993
danakj8522a25b2016-04-16 00:17:3611994 std::unique_ptr<URLRequestRedirectJob> job(new URLRequestRedirectJob(
alexanderkcd904b52015-07-24 18:57:2211995 req.get(), &default_network_delegate_,
11996 GURL("http://this-should-never-be-navigated-to/"),
mmenkeed0498b2015-12-08 23:20:4211997 URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT, "Jumbo shrimp"));
11998 AddTestInterceptor()->set_main_intercept_job(std::move(job));
alexanderkcd904b52015-07-24 18:57:2211999
12000 req->Start();
12001 req->Cancel();
alexanderkcd904b52015-07-24 18:57:2212002 base::RunLoop().RunUntilIdle();
maksim.sisovb53724b52016-09-16 05:30:5012003 EXPECT_EQ(ERR_ABORTED, d.request_status());
alexanderkcd904b52015-07-24 18:57:2212004 EXPECT_EQ(0, d.received_redirect_count());
12005}
12006
Andrey Kosyakov2e893e62017-08-31 17:00:5212007TEST_F(URLRequestTestHTTP, HeadersCallbacks) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412008 ASSERT_TRUE(http_test_server()->Start());
12009 TestURLRequestContext context;
12010 GURL url(http_test_server()->GetURL("/cachetime"));
12011 TestDelegate delegate;
12012 HttpRequestHeaders extra_headers;
12013 extra_headers.SetHeader("X-Foo", "bar");
12014
12015 {
Andrey Kosyakov2e893e62017-08-31 17:00:5212016 HttpRawRequestHeaders raw_req_headers;
12017 scoped_refptr<const HttpResponseHeaders> raw_resp_headers;
12018
Andrey Kosyakov83a6eee2017-08-14 19:20:0412019 std::unique_ptr<URLRequest> r(context.CreateRequest(
12020 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
12021 r->SetExtraRequestHeaders(extra_headers);
Andrey Kosyakov2e893e62017-08-31 17:00:5212022 r->SetRequestHeadersCallback(base::Bind(
12023 &HttpRawRequestHeaders::Assign, base::Unretained(&raw_req_headers)));
12024 r->SetResponseHeadersCallback(base::Bind(
12025 [](scoped_refptr<const HttpResponseHeaders>* left,
12026 scoped_refptr<const HttpResponseHeaders> right) { *left = right; },
12027 base::Unretained(&raw_resp_headers)));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412028 r->Start();
12029 while (!delegate.response_started_count())
12030 base::RunLoop().RunUntilIdle();
Andrey Kosyakov2e893e62017-08-31 17:00:5212031 EXPECT_FALSE(raw_req_headers.headers().empty());
Andrey Kosyakov83a6eee2017-08-14 19:20:0412032 std::string value;
Andrey Kosyakov2e893e62017-08-31 17:00:5212033 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412034 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212035 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Accept-Encoding", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412036 EXPECT_EQ("gzip, deflate", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212037 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Connection", &value));
12038 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Host", &value));
12039 EXPECT_EQ("GET /cachetime HTTP/1.1\r\n", raw_req_headers.request_line());
12040 EXPECT_EQ(raw_resp_headers.get(), r->response_headers());
Andrey Kosyakov83a6eee2017-08-14 19:20:0412041 }
12042 {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412043 std::unique_ptr<URLRequest> r(context.CreateRequest(
12044 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
12045 r->SetExtraRequestHeaders(extra_headers);
Andrey Kosyakov2e893e62017-08-31 17:00:5212046 r->SetRequestHeadersCallback(base::Bind([](HttpRawRequestHeaders) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412047 FAIL() << "Callback should not be called unless request is sent";
12048 }));
Andrey Kosyakov2e893e62017-08-31 17:00:5212049 r->SetResponseHeadersCallback(
12050 base::Bind([](scoped_refptr<const HttpResponseHeaders>) {
12051 FAIL() << "Callback should not be called unless request is sent";
12052 }));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412053 r->Start();
12054 base::RunLoop().Run();
12055 EXPECT_TRUE(r->was_cached());
Andrey Kosyakov83a6eee2017-08-14 19:20:0412056 }
12057}
12058
Andrey Kosyakov2e893e62017-08-31 17:00:5212059TEST_F(URLRequestTestHTTP, HeadersCallbacksWithRedirect) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412060 ASSERT_TRUE(http_test_server()->Start());
Andrey Kosyakov2e893e62017-08-31 17:00:5212061 HttpRawRequestHeaders raw_req_headers;
12062 scoped_refptr<const HttpResponseHeaders> raw_resp_headers;
12063
Andrey Kosyakov83a6eee2017-08-14 19:20:0412064 TestURLRequestContext context;
12065 TestDelegate delegate;
12066 HttpRequestHeaders extra_headers;
12067 extra_headers.SetHeader("X-Foo", "bar");
12068 delegate.set_quit_on_redirect(true);
12069 GURL url(http_test_server()->GetURL("/redirect-test.html"));
12070 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
12071 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
12072 r->SetExtraRequestHeaders(extra_headers);
12073 r->SetRequestHeadersCallback(base::Bind(&HttpRawRequestHeaders::Assign,
Andrey Kosyakov2e893e62017-08-31 17:00:5212074 base::Unretained(&raw_req_headers)));
12075 r->SetResponseHeadersCallback(base::Bind(
12076 [](scoped_refptr<const HttpResponseHeaders>* left,
12077 scoped_refptr<const HttpResponseHeaders> right) { *left = right; },
12078 base::Unretained(&raw_resp_headers)));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412079 r->Start();
12080 base::RunLoop().Run();
12081
12082 ASSERT_EQ(1, delegate.received_redirect_count());
12083 std::string value;
Andrey Kosyakov2e893e62017-08-31 17:00:5212084 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412085 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212086 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Accept-Encoding", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412087 EXPECT_EQ("gzip, deflate", value);
12088 EXPECT_EQ(1, delegate.received_redirect_count());
Andrey Kosyakov2e893e62017-08-31 17:00:5212089 EXPECT_EQ("GET /redirect-test.html HTTP/1.1\r\n",
12090 raw_req_headers.request_line());
12091 EXPECT_TRUE(raw_resp_headers->HasHeader("Location"));
12092 EXPECT_EQ(302, raw_resp_headers->response_code());
12093 EXPECT_EQ("Redirect", raw_resp_headers->GetStatusText());
Andrey Kosyakov83a6eee2017-08-14 19:20:0412094
Andrey Kosyakov2e893e62017-08-31 17:00:5212095 raw_req_headers = HttpRawRequestHeaders();
12096 raw_resp_headers = nullptr;
Andrey Kosyakov83a6eee2017-08-14 19:20:0412097 r->FollowDeferredRedirect();
12098 base::RunLoop().Run();
Andrey Kosyakov2e893e62017-08-31 17:00:5212099 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412100 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212101 EXPECT_TRUE(raw_req_headers.FindHeaderForTest("Accept-Encoding", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412102 EXPECT_EQ("gzip, deflate", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212103 EXPECT_EQ("GET /with-headers.html HTTP/1.1\r\n",
12104 raw_req_headers.request_line());
12105 EXPECT_EQ(r->response_headers(), raw_resp_headers.get());
Andrey Kosyakov83a6eee2017-08-14 19:20:0412106}
12107
Andrey Kosyakov2e893e62017-08-31 17:00:5212108TEST_F(URLRequestTest, HeadersCallbacksConnectFailed) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412109 TestDelegate request_delegate;
12110
12111 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
12112 GURL("http://127.0.0.1:9/"), DEFAULT_PRIORITY, &request_delegate,
12113 TRAFFIC_ANNOTATION_FOR_TESTS));
12114 r->SetRequestHeadersCallback(base::Bind([](net::HttpRawRequestHeaders) {
12115 FAIL() << "Callback should not be called unless request is sent";
12116 }));
Andrey Kosyakov2e893e62017-08-31 17:00:5212117 r->SetResponseHeadersCallback(
12118 base::Bind([](scoped_refptr<const net::HttpResponseHeaders>) {
12119 FAIL() << "Callback should not be called unless request is sent";
12120 }));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412121 r->Start();
12122 base::RunLoop().Run();
12123 EXPECT_FALSE(r->is_pending());
12124}
12125
Andrey Kosyakov2e893e62017-08-31 17:00:5212126TEST_F(URLRequestTestHTTP, HeadersCallbacksAuthRetry) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412127 ASSERT_TRUE(http_test_server()->Start());
12128 GURL url(http_test_server()->GetURL("/auth-basic"));
12129
12130 TestURLRequestContext context;
12131 TestDelegate delegate;
12132
12133 delegate.set_credentials(AuthCredentials(kUser, kSecret));
12134 HttpRequestHeaders extra_headers;
12135 extra_headers.SetHeader("X-Foo", "bar");
12136
Andrey Kosyakov2e893e62017-08-31 17:00:5212137 using ReqHeadersVector = std::vector<std::unique_ptr<HttpRawRequestHeaders>>;
12138 ReqHeadersVector raw_req_headers;
Andrey Kosyakov83a6eee2017-08-14 19:20:0412139
Andrey Kosyakov2e893e62017-08-31 17:00:5212140 using RespHeadersVector =
12141 std::vector<scoped_refptr<const HttpResponseHeaders>>;
12142 RespHeadersVector raw_resp_headers;
12143
12144 auto req_headers_callback = base::Bind(
12145 [](ReqHeadersVector* vec, HttpRawRequestHeaders headers) {
12146 vec->emplace_back(new HttpRawRequestHeaders(std::move(headers)));
12147 },
12148 &raw_req_headers);
12149 auto resp_headers_callback = base::Bind(
12150 [](RespHeadersVector* vec,
12151 scoped_refptr<const HttpResponseHeaders> headers) {
12152 vec->push_back(headers);
12153 },
12154 &raw_resp_headers);
Andrey Kosyakov83a6eee2017-08-14 19:20:0412155 std::unique_ptr<URLRequest> r(context.CreateRequest(
12156 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
12157 r->SetExtraRequestHeaders(extra_headers);
Andrey Kosyakov2e893e62017-08-31 17:00:5212158 r->SetRequestHeadersCallback(req_headers_callback);
12159 r->SetResponseHeadersCallback(resp_headers_callback);
Andrey Kosyakov83a6eee2017-08-14 19:20:0412160 r->Start();
12161 base::RunLoop().Run();
12162 EXPECT_FALSE(r->is_pending());
Andrey Kosyakov2e893e62017-08-31 17:00:5212163 ASSERT_EQ(raw_req_headers.size(), 2u);
12164 ASSERT_EQ(raw_resp_headers.size(), 2u);
Andrey Kosyakov83a6eee2017-08-14 19:20:0412165 std::string value;
Andrey Kosyakov2e893e62017-08-31 17:00:5212166 EXPECT_FALSE(raw_req_headers[0]->FindHeaderForTest("Authorization", &value));
12167 EXPECT_TRUE(raw_req_headers[0]->FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412168 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212169 EXPECT_TRUE(raw_req_headers[1]->FindHeaderForTest("Authorization", &value));
12170 EXPECT_TRUE(raw_req_headers[1]->FindHeaderForTest("X-Foo", &value));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412171 EXPECT_EQ("bar", value);
Andrey Kosyakov2e893e62017-08-31 17:00:5212172 EXPECT_EQ(raw_resp_headers[1], r->response_headers());
12173 EXPECT_NE(raw_resp_headers[0], raw_resp_headers[1]);
12174 EXPECT_EQ(401, raw_resp_headers[0]->response_code());
12175 EXPECT_EQ("Unauthorized", raw_resp_headers[0]->GetStatusText());
12176
12177 std::unique_ptr<URLRequest> r2(context.CreateRequest(
12178 url, DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
12179 r2->SetExtraRequestHeaders(extra_headers);
12180 r2->SetRequestHeadersCallback(req_headers_callback);
12181 r2->SetResponseHeadersCallback(resp_headers_callback);
12182 r2->SetLoadFlags(LOAD_VALIDATE_CACHE);
12183 r2->Start();
12184 base::RunLoop().Run();
12185 EXPECT_FALSE(r2->is_pending());
12186 ASSERT_EQ(raw_req_headers.size(), 3u);
12187 ASSERT_EQ(raw_resp_headers.size(), 3u);
12188 EXPECT_TRUE(raw_req_headers[2]->FindHeaderForTest("If-None-Match", &value));
12189 EXPECT_NE(raw_resp_headers[2].get(), r2->response_headers());
12190 EXPECT_EQ(304, raw_resp_headers[2]->response_code());
12191 EXPECT_EQ("Not Modified", raw_resp_headers[2]->GetStatusText());
Andrey Kosyakov83a6eee2017-08-14 19:20:0412192}
12193
Andrey Kosyakov2e893e62017-08-31 17:00:5212194TEST_F(URLRequestTest, HeadersCallbacksNonHTTP) {
Andrey Kosyakov83a6eee2017-08-14 19:20:0412195 GURL data_url("data:text/html,<html><body>Hello!</body></html>");
12196 TestDelegate d;
12197 std::unique_ptr<URLRequest> r(default_context_.CreateRequest(
12198 data_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
12199 r->SetRequestHeadersCallback(base::Bind([](net::HttpRawRequestHeaders) {
Andrey Kosyakov2e893e62017-08-31 17:00:5212200 FAIL() << "Callback should not be called for non-HTTP schemes";
Andrey Kosyakov83a6eee2017-08-14 19:20:0412201 }));
Andrey Kosyakov2e893e62017-08-31 17:00:5212202 r->SetResponseHeadersCallback(
12203 base::Bind([](scoped_refptr<const net::HttpResponseHeaders>) {
12204 FAIL() << "Callback should not be called for non-HTTP schemes";
12205 }));
Andrey Kosyakov83a6eee2017-08-14 19:20:0412206 r->Start();
12207 base::RunLoop().Run();
12208 EXPECT_FALSE(r->is_pending());
12209}
12210
Paul Jensen60e45532018-02-19 16:04:1812211// Test that URLRequests get properly tagged.
12212#if defined(OS_ANDROID)
12213TEST_F(URLRequestTestHTTP, TestTagging) {
12214 ASSERT_TRUE(http_test_server()->Start());
12215
12216 // The tag under which the system reports untagged traffic.
12217 static const int32_t UNTAGGED_TAG = 0;
12218
12219 uint64_t old_traffic = GetTaggedBytes(UNTAGGED_TAG);
12220
12221 // Untagged traffic should be tagged with tag UNTAGGED_TAG.
12222 TestDelegate delegate;
12223 std::unique_ptr<URLRequest> req(default_context_.CreateRequest(
12224 http_test_server()->GetURL("/"), DEFAULT_PRIORITY, &delegate,
12225 TRAFFIC_ANNOTATION_FOR_TESTS));
12226 EXPECT_EQ(SocketTag(), req->socket_tag());
12227 req->Start();
12228 base::RunLoop().Run();
12229
12230 EXPECT_GT(GetTaggedBytes(UNTAGGED_TAG), old_traffic);
12231
12232 int32_t tag_val1 = 0x12345678;
12233 SocketTag tag1(SocketTag::UNSET_UID, tag_val1);
12234 old_traffic = GetTaggedBytes(tag_val1);
12235
12236 // Test specific tag value.
12237 req = default_context_.CreateRequest(http_test_server()->GetURL("/"),
12238 DEFAULT_PRIORITY, &delegate,
12239 TRAFFIC_ANNOTATION_FOR_TESTS);
12240 req->set_socket_tag(tag1);
12241 EXPECT_EQ(tag1, req->socket_tag());
12242 req->Start();
12243 base::RunLoop().Run();
12244
12245 EXPECT_GT(GetTaggedBytes(tag_val1), old_traffic);
12246}
12247#endif
12248
[email protected]7461a402011-03-24 23:19:5112249} // namespace net