OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "net/url_request/url_request_test_util.h" | |
6 | |
7 #include "base/compiler_specific.h" | |
8 #include "base/logging.h" | |
9 #include "base/message_loop/message_loop.h" | |
10 #include "base/threading/thread.h" | |
11 #include "base/threading/worker_pool.h" | |
12 #include "net/base/host_port_pair.h" | |
13 #include "net/cert/cert_verifier.h" | |
14 #include "net/dns/mock_host_resolver.h" | |
15 #include "net/http/http_network_session.h" | |
16 #include "net/http/http_response_headers.h" | |
17 #include "net/http/http_server_properties_impl.h" | |
18 #include "net/http/transport_security_state.h" | |
19 #include "net/ssl/channel_id_service.h" | |
20 #include "net/ssl/default_channel_id_store.h" | |
21 #include "net/url_request/static_http_user_agent_settings.h" | |
22 #include "net/url_request/url_request_job_factory_impl.h" | |
23 #include "testing/gtest/include/gtest/gtest.h" | |
24 | |
25 namespace net { | |
26 | |
27 namespace { | |
28 | |
29 // These constants put the NetworkDelegate events of TestNetworkDelegate | |
30 // into an order. They are used in conjunction with | |
31 // |TestNetworkDelegate::next_states_| to check that we do not send | |
32 // events in the wrong order. | |
33 const int kStageBeforeURLRequest = 1 << 0; | |
34 const int kStageBeforeSendHeaders = 1 << 1; | |
35 const int kStageSendHeaders = 1 << 2; | |
36 const int kStageHeadersReceived = 1 << 3; | |
37 const int kStageAuthRequired = 1 << 4; | |
38 const int kStageBeforeRedirect = 1 << 5; | |
39 const int kStageResponseStarted = 1 << 6; | |
40 const int kStageCompletedSuccess = 1 << 7; | |
41 const int kStageCompletedError = 1 << 8; | |
42 const int kStageURLRequestDestroyed = 1 << 9; | |
43 const int kStageDestruction = 1 << 10; | |
44 | |
45 } // namespace | |
46 | |
47 TestURLRequestContext::TestURLRequestContext() | |
48 : initialized_(false), | |
49 client_socket_factory_(NULL), | |
50 context_storage_(this) { | |
51 Init(); | |
52 } | |
53 | |
54 TestURLRequestContext::TestURLRequestContext(bool delay_initialization) | |
55 : initialized_(false), | |
56 client_socket_factory_(NULL), | |
57 context_storage_(this) { | |
58 if (!delay_initialization) | |
59 Init(); | |
60 } | |
61 | |
62 TestURLRequestContext::~TestURLRequestContext() { | |
63 DCHECK(initialized_); | |
64 AssertNoURLRequests(); | |
65 } | |
66 | |
67 void TestURLRequestContext::Init() { | |
68 DCHECK(!initialized_); | |
69 initialized_ = true; | |
70 | |
71 if (!host_resolver()) | |
72 context_storage_.set_host_resolver( | |
73 scoped_ptr<HostResolver>(new MockCachingHostResolver())); | |
74 if (!proxy_service()) | |
75 context_storage_.set_proxy_service(ProxyService::CreateDirect()); | |
76 if (!cert_verifier()) | |
77 context_storage_.set_cert_verifier(CertVerifier::CreateDefault()); | |
78 if (!transport_security_state()) | |
79 context_storage_.set_transport_security_state(new TransportSecurityState); | |
80 if (!ssl_config_service()) | |
81 context_storage_.set_ssl_config_service(new SSLConfigServiceDefaults); | |
82 if (!http_auth_handler_factory()) { | |
83 context_storage_.set_http_auth_handler_factory( | |
84 HttpAuthHandlerFactory::CreateDefault(host_resolver())); | |
85 } | |
86 if (!http_server_properties()) { | |
87 context_storage_.set_http_server_properties( | |
88 scoped_ptr<HttpServerProperties>(new HttpServerPropertiesImpl())); | |
89 } | |
90 if (!transport_security_state()) { | |
91 context_storage_.set_transport_security_state( | |
92 new TransportSecurityState()); | |
93 } | |
94 if (http_transaction_factory()) { | |
95 // Make sure we haven't been passed an object we're not going to use. | |
96 EXPECT_FALSE(client_socket_factory_); | |
97 } else { | |
98 HttpNetworkSession::Params params; | |
99 if (http_network_session_params_) | |
100 params = *http_network_session_params_; | |
101 params.client_socket_factory = client_socket_factory(); | |
102 params.host_resolver = host_resolver(); | |
103 params.cert_verifier = cert_verifier(); | |
104 params.transport_security_state = transport_security_state(); | |
105 params.proxy_service = proxy_service(); | |
106 params.ssl_config_service = ssl_config_service(); | |
107 params.http_auth_handler_factory = http_auth_handler_factory(); | |
108 params.network_delegate = network_delegate(); | |
109 params.http_server_properties = http_server_properties(); | |
110 params.net_log = net_log(); | |
111 context_storage_.set_http_transaction_factory(new HttpCache( | |
112 new HttpNetworkSession(params), | |
113 HttpCache::DefaultBackend::InMemory(0))); | |
114 } | |
115 // In-memory cookie store. | |
116 if (!cookie_store()) | |
117 context_storage_.set_cookie_store(new CookieMonster(NULL, NULL)); | |
118 // In-memory Channel ID service. | |
119 if (!channel_id_service()) { | |
120 context_storage_.set_channel_id_service(make_scoped_ptr( | |
121 new ChannelIDService(new DefaultChannelIDStore(NULL), | |
122 base::WorkerPool::GetTaskRunner(true)))); | |
123 } | |
124 if (!http_user_agent_settings()) { | |
125 context_storage_.set_http_user_agent_settings( | |
126 new StaticHttpUserAgentSettings("en-us,fr", std::string())); | |
127 } | |
128 if (!job_factory()) | |
129 context_storage_.set_job_factory(new URLRequestJobFactoryImpl); | |
130 } | |
131 | |
132 TestURLRequestContextGetter::TestURLRequestContextGetter( | |
133 const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner) | |
134 : network_task_runner_(network_task_runner) { | |
135 DCHECK(network_task_runner_.get()); | |
136 } | |
137 | |
138 TestURLRequestContextGetter::TestURLRequestContextGetter( | |
139 const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner, | |
140 scoped_ptr<TestURLRequestContext> context) | |
141 : network_task_runner_(network_task_runner), context_(context.Pass()) { | |
142 DCHECK(network_task_runner_.get()); | |
143 } | |
144 | |
145 TestURLRequestContextGetter::~TestURLRequestContextGetter() {} | |
146 | |
147 TestURLRequestContext* TestURLRequestContextGetter::GetURLRequestContext() { | |
148 if (!context_.get()) | |
149 context_.reset(new TestURLRequestContext); | |
150 return context_.get(); | |
151 } | |
152 | |
153 scoped_refptr<base::SingleThreadTaskRunner> | |
154 TestURLRequestContextGetter::GetNetworkTaskRunner() const { | |
155 return network_task_runner_; | |
156 } | |
157 | |
158 TestDelegate::TestDelegate() | |
159 : cancel_in_rr_(false), | |
160 cancel_in_rs_(false), | |
161 cancel_in_rd_(false), | |
162 cancel_in_rd_pending_(false), | |
163 quit_on_complete_(true), | |
164 quit_on_redirect_(false), | |
165 quit_on_before_network_start_(false), | |
166 allow_certificate_errors_(false), | |
167 response_started_count_(0), | |
168 received_bytes_count_(0), | |
169 received_redirect_count_(0), | |
170 received_before_network_start_count_(0), | |
171 received_data_before_response_(false), | |
172 request_failed_(false), | |
173 have_certificate_errors_(false), | |
174 certificate_errors_are_fatal_(false), | |
175 auth_required_(false), | |
176 have_full_request_headers_(false), | |
177 buf_(new IOBuffer(kBufferSize)) { | |
178 } | |
179 | |
180 TestDelegate::~TestDelegate() {} | |
181 | |
182 void TestDelegate::ClearFullRequestHeaders() { | |
183 full_request_headers_.Clear(); | |
184 have_full_request_headers_ = false; | |
185 } | |
186 | |
187 void TestDelegate::OnReceivedRedirect(URLRequest* request, | |
188 const RedirectInfo& redirect_info, | |
189 bool* defer_redirect) { | |
190 EXPECT_TRUE(request->is_redirecting()); | |
191 | |
192 have_full_request_headers_ = | |
193 request->GetFullRequestHeaders(&full_request_headers_); | |
194 | |
195 received_redirect_count_++; | |
196 if (quit_on_redirect_) { | |
197 *defer_redirect = true; | |
198 base::MessageLoop::current()->PostTask(FROM_HERE, | |
199 base::MessageLoop::QuitClosure()); | |
200 } else if (cancel_in_rr_) { | |
201 request->Cancel(); | |
202 } | |
203 } | |
204 | |
205 void TestDelegate::OnBeforeNetworkStart(URLRequest* request, bool* defer) { | |
206 received_before_network_start_count_++; | |
207 if (quit_on_before_network_start_) { | |
208 *defer = true; | |
209 base::MessageLoop::current()->PostTask(FROM_HERE, | |
210 base::MessageLoop::QuitClosure()); | |
211 } | |
212 } | |
213 | |
214 void TestDelegate::OnAuthRequired(URLRequest* request, | |
215 AuthChallengeInfo* auth_info) { | |
216 auth_required_ = true; | |
217 if (!credentials_.Empty()) { | |
218 request->SetAuth(credentials_); | |
219 } else { | |
220 request->CancelAuth(); | |
221 } | |
222 } | |
223 | |
224 void TestDelegate::OnSSLCertificateError(URLRequest* request, | |
225 const SSLInfo& ssl_info, | |
226 bool fatal) { | |
227 // The caller can control whether it needs all SSL requests to go through, | |
228 // independent of any possible errors, or whether it wants SSL errors to | |
229 // cancel the request. | |
230 have_certificate_errors_ = true; | |
231 certificate_errors_are_fatal_ = fatal; | |
232 if (allow_certificate_errors_) | |
233 request->ContinueDespiteLastError(); | |
234 else | |
235 request->Cancel(); | |
236 } | |
237 | |
238 void TestDelegate::OnResponseStarted(URLRequest* request) { | |
239 // It doesn't make sense for the request to have IO pending at this point. | |
240 DCHECK(!request->status().is_io_pending()); | |
241 EXPECT_FALSE(request->is_redirecting()); | |
242 | |
243 have_full_request_headers_ = | |
244 request->GetFullRequestHeaders(&full_request_headers_); | |
245 | |
246 response_started_count_++; | |
247 if (cancel_in_rs_) { | |
248 request->Cancel(); | |
249 OnResponseCompleted(request); | |
250 } else if (!request->status().is_success()) { | |
251 DCHECK(request->status().status() == URLRequestStatus::FAILED || | |
252 request->status().status() == URLRequestStatus::CANCELED); | |
253 request_failed_ = true; | |
254 OnResponseCompleted(request); | |
255 } else { | |
256 // Initiate the first read. | |
257 int bytes_read = 0; | |
258 if (request->Read(buf_.get(), kBufferSize, &bytes_read)) | |
259 OnReadCompleted(request, bytes_read); | |
260 else if (!request->status().is_io_pending()) | |
261 OnResponseCompleted(request); | |
262 } | |
263 } | |
264 | |
265 void TestDelegate::OnReadCompleted(URLRequest* request, int bytes_read) { | |
266 // It doesn't make sense for the request to have IO pending at this point. | |
267 DCHECK(!request->status().is_io_pending()); | |
268 | |
269 if (response_started_count_ == 0) | |
270 received_data_before_response_ = true; | |
271 | |
272 if (cancel_in_rd_) | |
273 request->Cancel(); | |
274 | |
275 if (bytes_read >= 0) { | |
276 // There is data to read. | |
277 received_bytes_count_ += bytes_read; | |
278 | |
279 // consume the data | |
280 data_received_.append(buf_->data(), bytes_read); | |
281 } | |
282 | |
283 // If it was not end of stream, request to read more. | |
284 if (request->status().is_success() && bytes_read > 0) { | |
285 bytes_read = 0; | |
286 while (request->Read(buf_.get(), kBufferSize, &bytes_read)) { | |
287 if (bytes_read > 0) { | |
288 data_received_.append(buf_->data(), bytes_read); | |
289 received_bytes_count_ += bytes_read; | |
290 } else { | |
291 break; | |
292 } | |
293 } | |
294 } | |
295 if (!request->status().is_io_pending()) | |
296 OnResponseCompleted(request); | |
297 else if (cancel_in_rd_pending_) | |
298 request->Cancel(); | |
299 } | |
300 | |
301 void TestDelegate::OnResponseCompleted(URLRequest* request) { | |
302 if (quit_on_complete_) | |
303 base::MessageLoop::current()->PostTask(FROM_HERE, | |
304 base::MessageLoop::QuitClosure()); | |
305 } | |
306 | |
307 TestNetworkDelegate::TestNetworkDelegate() | |
308 : last_error_(0), | |
309 error_count_(0), | |
310 created_requests_(0), | |
311 destroyed_requests_(0), | |
312 completed_requests_(0), | |
313 canceled_requests_(0), | |
314 cookie_options_bit_mask_(0), | |
315 blocked_get_cookies_count_(0), | |
316 blocked_set_cookie_count_(0), | |
317 set_cookie_count_(0), | |
318 observed_before_proxy_headers_sent_callbacks_(0), | |
319 before_send_headers_count_(0), | |
320 headers_received_count_(0), | |
321 has_load_timing_info_before_redirect_(false), | |
322 has_load_timing_info_before_auth_(false), | |
323 can_access_files_(true), | |
324 can_throttle_requests_(true), | |
325 cancel_request_with_policy_violating_referrer_(false), | |
326 will_be_intercepted_on_next_error_(false) { | |
327 } | |
328 | |
329 TestNetworkDelegate::~TestNetworkDelegate() { | |
330 for (std::map<int, int>::iterator i = next_states_.begin(); | |
331 i != next_states_.end(); ++i) { | |
332 event_order_[i->first] += "~TestNetworkDelegate\n"; | |
333 EXPECT_TRUE(i->second & kStageDestruction) << event_order_[i->first]; | |
334 } | |
335 } | |
336 | |
337 bool TestNetworkDelegate::GetLoadTimingInfoBeforeRedirect( | |
338 LoadTimingInfo* load_timing_info_before_redirect) const { | |
339 *load_timing_info_before_redirect = load_timing_info_before_redirect_; | |
340 return has_load_timing_info_before_redirect_; | |
341 } | |
342 | |
343 bool TestNetworkDelegate::GetLoadTimingInfoBeforeAuth( | |
344 LoadTimingInfo* load_timing_info_before_auth) const { | |
345 *load_timing_info_before_auth = load_timing_info_before_auth_; | |
346 return has_load_timing_info_before_auth_; | |
347 } | |
348 | |
349 void TestNetworkDelegate::InitRequestStatesIfNew(int request_id) { | |
350 if (next_states_.find(request_id) == next_states_.end()) { | |
351 // TODO(davidben): Although the URLRequest documentation does not allow | |
352 // calling Cancel() before Start(), the ResourceLoader does so. URLRequest's | |
353 // destructor also calls Cancel. Either officially support this or fix the | |
354 // ResourceLoader code. | |
355 next_states_[request_id] = kStageBeforeURLRequest | kStageCompletedError; | |
356 event_order_[request_id] = ""; | |
357 } | |
358 } | |
359 | |
360 int TestNetworkDelegate::OnBeforeURLRequest( | |
361 URLRequest* request, | |
362 const CompletionCallback& callback, | |
363 GURL* new_url) { | |
364 int req_id = request->identifier(); | |
365 InitRequestStatesIfNew(req_id); | |
366 event_order_[req_id] += "OnBeforeURLRequest\n"; | |
367 EXPECT_TRUE(next_states_[req_id] & kStageBeforeURLRequest) << | |
368 event_order_[req_id]; | |
369 next_states_[req_id] = | |
370 kStageBeforeSendHeaders | | |
371 kStageResponseStarted | // data: URLs do not trigger sending headers | |
372 kStageBeforeRedirect | // a delegate can trigger a redirection | |
373 kStageCompletedError | // request canceled by delegate | |
374 kStageAuthRequired; // Auth can come next for FTP requests | |
375 created_requests_++; | |
376 return OK; | |
377 } | |
378 | |
379 int TestNetworkDelegate::OnBeforeSendHeaders( | |
380 URLRequest* request, | |
381 const CompletionCallback& callback, | |
382 HttpRequestHeaders* headers) { | |
383 int req_id = request->identifier(); | |
384 InitRequestStatesIfNew(req_id); | |
385 event_order_[req_id] += "OnBeforeSendHeaders\n"; | |
386 EXPECT_TRUE(next_states_[req_id] & kStageBeforeSendHeaders) << | |
387 event_order_[req_id]; | |
388 next_states_[req_id] = | |
389 kStageSendHeaders | | |
390 kStageCompletedError; // request canceled by delegate | |
391 before_send_headers_count_++; | |
392 return OK; | |
393 } | |
394 | |
395 void TestNetworkDelegate::OnBeforeSendProxyHeaders( | |
396 net::URLRequest* request, | |
397 const net::ProxyInfo& proxy_info, | |
398 net::HttpRequestHeaders* headers) { | |
399 ++observed_before_proxy_headers_sent_callbacks_; | |
400 last_observed_proxy_ = proxy_info.proxy_server().host_port_pair(); | |
401 } | |
402 | |
403 void TestNetworkDelegate::OnSendHeaders( | |
404 URLRequest* request, | |
405 const HttpRequestHeaders& headers) { | |
406 int req_id = request->identifier(); | |
407 InitRequestStatesIfNew(req_id); | |
408 event_order_[req_id] += "OnSendHeaders\n"; | |
409 EXPECT_TRUE(next_states_[req_id] & kStageSendHeaders) << | |
410 event_order_[req_id]; | |
411 if (!will_be_intercepted_on_next_error_) | |
412 next_states_[req_id] = kStageHeadersReceived | kStageCompletedError; | |
413 else | |
414 next_states_[req_id] = kStageResponseStarted; | |
415 will_be_intercepted_on_next_error_ = false; | |
416 } | |
417 | |
418 int TestNetworkDelegate::OnHeadersReceived( | |
419 URLRequest* request, | |
420 const CompletionCallback& callback, | |
421 const HttpResponseHeaders* original_response_headers, | |
422 scoped_refptr<HttpResponseHeaders>* override_response_headers, | |
423 GURL* allowed_unsafe_redirect_url) { | |
424 int req_id = request->identifier(); | |
425 event_order_[req_id] += "OnHeadersReceived\n"; | |
426 InitRequestStatesIfNew(req_id); | |
427 EXPECT_TRUE(next_states_[req_id] & kStageHeadersReceived) << | |
428 event_order_[req_id]; | |
429 next_states_[req_id] = | |
430 kStageBeforeRedirect | | |
431 kStageResponseStarted | | |
432 kStageAuthRequired | | |
433 kStageCompletedError; // e.g. proxy resolution problem | |
434 | |
435 // Basic authentication sends a second request from the URLRequestHttpJob | |
436 // layer before the URLRequest reports that a response has started. | |
437 next_states_[req_id] |= kStageBeforeSendHeaders; | |
438 | |
439 if (!redirect_on_headers_received_url_.is_empty()) { | |
440 *override_response_headers = | |
441 new net::HttpResponseHeaders(original_response_headers->raw_headers()); | |
442 (*override_response_headers)->ReplaceStatusLine("HTTP/1.1 302 Found"); | |
443 (*override_response_headers)->RemoveHeader("Location"); | |
444 (*override_response_headers)->AddHeader( | |
445 "Location: " + redirect_on_headers_received_url_.spec()); | |
446 | |
447 redirect_on_headers_received_url_ = GURL(); | |
448 | |
449 if (!allowed_unsafe_redirect_url_.is_empty()) | |
450 *allowed_unsafe_redirect_url = allowed_unsafe_redirect_url_; | |
451 } | |
452 headers_received_count_++; | |
453 return OK; | |
454 } | |
455 | |
456 void TestNetworkDelegate::OnBeforeRedirect(URLRequest* request, | |
457 const GURL& new_location) { | |
458 load_timing_info_before_redirect_ = LoadTimingInfo(); | |
459 request->GetLoadTimingInfo(&load_timing_info_before_redirect_); | |
460 has_load_timing_info_before_redirect_ = true; | |
461 EXPECT_FALSE(load_timing_info_before_redirect_.request_start_time.is_null()); | |
462 EXPECT_FALSE(load_timing_info_before_redirect_.request_start.is_null()); | |
463 | |
464 int req_id = request->identifier(); | |
465 InitRequestStatesIfNew(req_id); | |
466 event_order_[req_id] += "OnBeforeRedirect\n"; | |
467 EXPECT_TRUE(next_states_[req_id] & kStageBeforeRedirect) << | |
468 event_order_[req_id]; | |
469 next_states_[req_id] = | |
470 kStageBeforeURLRequest | // HTTP redirects trigger this. | |
471 kStageBeforeSendHeaders | // Redirects from the network delegate do not | |
472 // trigger onBeforeURLRequest. | |
473 kStageCompletedError; | |
474 | |
475 // A redirect can lead to a file or a data URL. In this case, we do not send | |
476 // headers. | |
477 next_states_[req_id] |= kStageResponseStarted; | |
478 } | |
479 | |
480 void TestNetworkDelegate::OnResponseStarted(URLRequest* request) { | |
481 LoadTimingInfo load_timing_info; | |
482 request->GetLoadTimingInfo(&load_timing_info); | |
483 EXPECT_FALSE(load_timing_info.request_start_time.is_null()); | |
484 EXPECT_FALSE(load_timing_info.request_start.is_null()); | |
485 | |
486 int req_id = request->identifier(); | |
487 InitRequestStatesIfNew(req_id); | |
488 event_order_[req_id] += "OnResponseStarted\n"; | |
489 EXPECT_TRUE(next_states_[req_id] & kStageResponseStarted) << | |
490 event_order_[req_id]; | |
491 next_states_[req_id] = kStageCompletedSuccess | kStageCompletedError; | |
492 if (request->status().status() == URLRequestStatus::FAILED) { | |
493 error_count_++; | |
494 last_error_ = request->status().error(); | |
495 } | |
496 } | |
497 | |
498 void TestNetworkDelegate::OnRawBytesRead(const URLRequest& request, | |
499 int bytes_read) { | |
500 } | |
501 | |
502 void TestNetworkDelegate::OnCompleted(URLRequest* request, bool started) { | |
503 int req_id = request->identifier(); | |
504 InitRequestStatesIfNew(req_id); | |
505 event_order_[req_id] += "OnCompleted\n"; | |
506 // Expect "Success -> (next_states_ & kStageCompletedSuccess)" | |
507 // is logically identical to | |
508 // Expect "!(Success) || (next_states_ & kStageCompletedSuccess)" | |
509 EXPECT_TRUE(!request->status().is_success() || | |
510 (next_states_[req_id] & kStageCompletedSuccess)) << | |
511 event_order_[req_id]; | |
512 EXPECT_TRUE(request->status().is_success() || | |
513 (next_states_[req_id] & kStageCompletedError)) << | |
514 event_order_[req_id]; | |
515 next_states_[req_id] = kStageURLRequestDestroyed; | |
516 completed_requests_++; | |
517 if (request->status().status() == URLRequestStatus::FAILED) { | |
518 error_count_++; | |
519 last_error_ = request->status().error(); | |
520 } else if (request->status().status() == URLRequestStatus::CANCELED) { | |
521 canceled_requests_++; | |
522 } else { | |
523 DCHECK_EQ(URLRequestStatus::SUCCESS, request->status().status()); | |
524 } | |
525 } | |
526 | |
527 void TestNetworkDelegate::OnURLRequestDestroyed(URLRequest* request) { | |
528 int req_id = request->identifier(); | |
529 InitRequestStatesIfNew(req_id); | |
530 event_order_[req_id] += "OnURLRequestDestroyed\n"; | |
531 EXPECT_TRUE(next_states_[req_id] & kStageURLRequestDestroyed) << | |
532 event_order_[req_id]; | |
533 next_states_[req_id] = kStageDestruction; | |
534 destroyed_requests_++; | |
535 } | |
536 | |
537 void TestNetworkDelegate::OnPACScriptError(int line_number, | |
538 const base::string16& error) { | |
539 } | |
540 | |
541 NetworkDelegate::AuthRequiredResponse TestNetworkDelegate::OnAuthRequired( | |
542 URLRequest* request, | |
543 const AuthChallengeInfo& auth_info, | |
544 const AuthCallback& callback, | |
545 AuthCredentials* credentials) { | |
546 load_timing_info_before_auth_ = LoadTimingInfo(); | |
547 request->GetLoadTimingInfo(&load_timing_info_before_auth_); | |
548 has_load_timing_info_before_auth_ = true; | |
549 EXPECT_FALSE(load_timing_info_before_auth_.request_start_time.is_null()); | |
550 EXPECT_FALSE(load_timing_info_before_auth_.request_start.is_null()); | |
551 | |
552 int req_id = request->identifier(); | |
553 InitRequestStatesIfNew(req_id); | |
554 event_order_[req_id] += "OnAuthRequired\n"; | |
555 EXPECT_TRUE(next_states_[req_id] & kStageAuthRequired) << | |
556 event_order_[req_id]; | |
557 next_states_[req_id] = kStageBeforeSendHeaders | | |
558 kStageAuthRequired | // For example, proxy auth followed by server auth. | |
559 kStageHeadersReceived | // Request canceled by delegate simulates empty | |
560 // response. | |
561 kStageResponseStarted | // data: URLs do not trigger sending headers | |
562 kStageBeforeRedirect | // a delegate can trigger a redirection | |
563 kStageCompletedError; // request cancelled before callback | |
564 return NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION; | |
565 } | |
566 | |
567 bool TestNetworkDelegate::OnCanGetCookies(const URLRequest& request, | |
568 const CookieList& cookie_list) { | |
569 bool allow = true; | |
570 if (cookie_options_bit_mask_ & NO_GET_COOKIES) | |
571 allow = false; | |
572 | |
573 if (!allow) { | |
574 blocked_get_cookies_count_++; | |
575 } | |
576 | |
577 return allow; | |
578 } | |
579 | |
580 bool TestNetworkDelegate::OnCanSetCookie(const URLRequest& request, | |
581 const std::string& cookie_line, | |
582 CookieOptions* options) { | |
583 bool allow = true; | |
584 if (cookie_options_bit_mask_ & NO_SET_COOKIE) | |
585 allow = false; | |
586 | |
587 if (!allow) { | |
588 blocked_set_cookie_count_++; | |
589 } else { | |
590 set_cookie_count_++; | |
591 } | |
592 | |
593 return allow; | |
594 } | |
595 | |
596 bool TestNetworkDelegate::OnCanAccessFile(const URLRequest& request, | |
597 const base::FilePath& path) const { | |
598 return can_access_files_; | |
599 } | |
600 | |
601 bool TestNetworkDelegate::OnCanThrottleRequest( | |
602 const URLRequest& request) const { | |
603 return can_throttle_requests_; | |
604 } | |
605 | |
606 bool TestNetworkDelegate::OnCancelURLRequestWithPolicyViolatingReferrerHeader( | |
607 const URLRequest& request, | |
608 const GURL& target_url, | |
609 const GURL& referrer_url) const { | |
610 return cancel_request_with_policy_violating_referrer_; | |
611 } | |
612 | |
613 // static | |
614 std::string ScopedCustomUrlRequestTestHttpHost::value_("127.0.0.1"); | |
615 | |
616 ScopedCustomUrlRequestTestHttpHost::ScopedCustomUrlRequestTestHttpHost( | |
617 const std::string& new_value) | |
618 : old_value_(value_), | |
619 new_value_(new_value) { | |
620 value_ = new_value_; | |
621 } | |
622 | |
623 ScopedCustomUrlRequestTestHttpHost::~ScopedCustomUrlRequestTestHttpHost() { | |
624 DCHECK_EQ(value_, new_value_); | |
625 value_ = old_value_; | |
626 } | |
627 | |
628 // static | |
629 const std::string& ScopedCustomUrlRequestTestHttpHost::value() { | |
630 return value_; | |
631 } | |
632 | |
633 TestJobInterceptor::TestJobInterceptor() : main_intercept_job_(NULL) { | |
634 } | |
635 | |
636 URLRequestJob* TestJobInterceptor::MaybeCreateJob( | |
637 URLRequest* request, | |
638 NetworkDelegate* network_delegate) const { | |
639 URLRequestJob* job = main_intercept_job_; | |
640 main_intercept_job_ = NULL; | |
641 return job; | |
642 } | |
643 | |
644 void TestJobInterceptor::set_main_intercept_job(URLRequestJob* job) { | |
645 main_intercept_job_ = job; | |
646 } | |
647 | |
648 } // namespace net | |
OLD | NEW |