OLD | NEW |
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/url_request/url_request.h" | 5 #include "net/url_request/url_request.h" |
6 | 6 |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "base/process_util.h" | 8 #include "base/process_util.h" |
9 #include "base/singleton.h" | 9 #include "base/singleton.h" |
10 #include "base/stats_counters.h" | 10 #include "base/stats_counters.h" |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 DCHECK(!is_pending_); | 245 DCHECK(!is_pending_); |
246 DCHECK(!job_); | 246 DCHECK(!job_); |
247 | 247 |
248 job_ = job; | 248 job_ = job; |
249 job_->SetExtraRequestHeaders(extra_request_headers_); | 249 job_->SetExtraRequestHeaders(extra_request_headers_); |
250 | 250 |
251 if (upload_.get()) | 251 if (upload_.get()) |
252 job_->SetUpload(upload_.get()); | 252 job_->SetUpload(upload_.get()); |
253 | 253 |
254 is_pending_ = true; | 254 is_pending_ = true; |
| 255 |
255 response_info_.request_time = Time::Now(); | 256 response_info_.request_time = Time::Now(); |
256 response_info_.was_cached = false; | 257 response_info_.was_cached = false; |
257 | 258 |
258 // Don't allow errors to be sent from within Start(). | 259 // Don't allow errors to be sent from within Start(). |
259 // TODO(brettw) this may cause NotifyDone to be sent synchronously, | 260 // TODO(brettw) this may cause NotifyDone to be sent synchronously, |
260 // we probably don't want this: they should be sent asynchronously so | 261 // we probably don't want this: they should be sent asynchronously so |
261 // the caller does not get reentered. | 262 // the caller does not get reentered. |
262 job_->Start(); | 263 job_->Start(); |
263 } | 264 } |
264 | 265 |
265 void URLRequest::Restart() { | 266 void URLRequest::Restart() { |
266 // Should only be called if the original job didn't make any progress. | 267 // Should only be called if the original job didn't make any progress. |
267 DCHECK(job_ && !job_->has_response_started()); | 268 DCHECK(job_ && !job_->has_response_started()); |
268 RestartWithJob(GetJobManager()->CreateJob(this)); | 269 RestartWithJob(GetJobManager()->CreateJob(this)); |
269 } | 270 } |
270 | 271 |
271 void URLRequest::RestartWithJob(URLRequestJob *job) { | 272 void URLRequest::RestartWithJob(URLRequestJob *job) { |
272 DCHECK(job->request() == this); | 273 DCHECK(job->request() == this); |
| 274 job_->Kill(); |
273 OrphanJob(); | 275 OrphanJob(); |
274 status_ = URLRequestStatus(); | 276 status_ = URLRequestStatus(); |
275 is_pending_ = false; | 277 is_pending_ = false; |
276 StartJob(job); | 278 StartJob(job); |
277 } | 279 } |
278 | 280 |
279 void URLRequest::Cancel() { | 281 void URLRequest::Cancel() { |
280 DoCancel(net::ERR_ABORTED, net::SSLInfo()); | 282 DoCancel(net::ERR_ABORTED, net::SSLInfo()); |
281 } | 283 } |
282 | 284 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 | 330 |
329 // Once the request fails or is cancelled, read will just return 0 bytes | 331 // Once the request fails or is cancelled, read will just return 0 bytes |
330 // to indicate end of stream. | 332 // to indicate end of stream. |
331 if (!status_.is_success()) { | 333 if (!status_.is_success()) { |
332 return true; | 334 return true; |
333 } | 335 } |
334 | 336 |
335 return job_->Read(dest, dest_size, bytes_read); | 337 return job_->Read(dest, dest_size, bytes_read); |
336 } | 338 } |
337 | 339 |
338 void URLRequest::ReceivedRedirect(const GURL& location) { | 340 void URLRequest::ReceivedRedirect(const GURL& location, bool* defer_redirect) { |
339 URLRequestJob* job = GetJobManager()->MaybeInterceptRedirect(this, location); | 341 URLRequestJob* job = GetJobManager()->MaybeInterceptRedirect(this, location); |
340 if (job) { | 342 if (job) { |
341 RestartWithJob(job); | 343 RestartWithJob(job); |
342 } else if (delegate_) { | 344 } else if (delegate_) { |
343 delegate_->OnReceivedRedirect(this, location); | 345 delegate_->OnReceivedRedirect(this, location, defer_redirect); |
344 } | 346 } |
345 } | 347 } |
346 | 348 |
347 void URLRequest::ResponseStarted() { | 349 void URLRequest::ResponseStarted() { |
348 URLRequestJob* job = GetJobManager()->MaybeInterceptResponse(this); | 350 URLRequestJob* job = GetJobManager()->MaybeInterceptResponse(this); |
349 if (job) { | 351 if (job) { |
350 RestartWithJob(job); | 352 RestartWithJob(job); |
351 } else if (delegate_) { | 353 } else if (delegate_) { |
352 delegate_->OnResponseStarted(this); | 354 delegate_->OnResponseStarted(this); |
353 } | 355 } |
354 } | 356 } |
355 | 357 |
| 358 void URLRequest::FollowDeferredRedirect() { |
| 359 DCHECK(job_); |
| 360 |
| 361 job_->FollowDeferredRedirect(); |
| 362 } |
| 363 |
356 void URLRequest::SetAuth(const wstring& username, const wstring& password) { | 364 void URLRequest::SetAuth(const wstring& username, const wstring& password) { |
357 DCHECK(job_); | 365 DCHECK(job_); |
358 DCHECK(job_->NeedsAuth()); | 366 DCHECK(job_->NeedsAuth()); |
359 | 367 |
360 job_->SetAuth(username, password); | 368 job_->SetAuth(username, password); |
361 } | 369 } |
362 | 370 |
363 void URLRequest::CancelAuth() { | 371 void URLRequest::CancelAuth() { |
364 DCHECK(job_); | 372 DCHECK(job_); |
365 DCHECK(job_->NeedsAuth()); | 373 DCHECK(job_->NeedsAuth()); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 // following a 302 redirect, normal browsers don't do that. Instead, they | 424 // following a 302 redirect, normal browsers don't do that. Instead, they |
417 // all convert a POST into a GET in response to a 302 and so shall we. For | 425 // all convert a POST into a GET in response to a 302 and so shall we. For |
418 // 307 redirects, browsers preserve the method. The RFC says to prompt the | 426 // 307 redirects, browsers preserve the method. The RFC says to prompt the |
419 // user to confirm the generation of a new POST request, but IE omits this | 427 // user to confirm the generation of a new POST request, but IE omits this |
420 // prompt and so shall we. | 428 // prompt and so shall we. |
421 strip_post_specific_headers = method_ == "POST"; | 429 strip_post_specific_headers = method_ == "POST"; |
422 method_ = "GET"; | 430 method_ = "GET"; |
423 } | 431 } |
424 url_ = location; | 432 url_ = location; |
425 upload_ = NULL; | 433 upload_ = NULL; |
426 status_ = URLRequestStatus(); | |
427 --redirect_limit_; | 434 --redirect_limit_; |
428 | 435 |
429 if (strip_post_specific_headers) { | 436 if (strip_post_specific_headers) { |
430 // If being switched from POST to GET, must remove headers that were | 437 // If being switched from POST to GET, must remove headers that were |
431 // specific to the POST and don't have meaning in GET. For example | 438 // specific to the POST and don't have meaning in GET. For example |
432 // the inclusion of a multipart Content-Type header in GET can cause | 439 // the inclusion of a multipart Content-Type header in GET can cause |
433 // problems with some servers: | 440 // problems with some servers: |
434 // http://code.google.com/p/chromium/issues/detail?id=843 | 441 // http://code.google.com/p/chromium/issues/detail?id=843 |
435 // | 442 // |
436 // TODO(eroman): It would be better if this data was structured into | 443 // TODO(eroman): It would be better if this data was structured into |
437 // specific fields/flags, rather than a stew of extra headers. | 444 // specific fields/flags, rather than a stew of extra headers. |
438 extra_request_headers_ = StripPostSpecificHeaders(extra_request_headers_); | 445 extra_request_headers_ = StripPostSpecificHeaders(extra_request_headers_); |
439 } | 446 } |
440 | 447 |
441 if (!final_upload_progress_) { | 448 if (!final_upload_progress_) { |
442 final_upload_progress_ = job_->GetUploadProgress(); | 449 final_upload_progress_ = job_->GetUploadProgress(); |
443 } | 450 } |
444 | 451 |
| 452 job_->Kill(); |
445 OrphanJob(); | 453 OrphanJob(); |
446 | 454 |
| 455 status_ = URLRequestStatus(); |
447 is_pending_ = false; | 456 is_pending_ = false; |
448 Start(); | 457 Start(); |
449 return net::OK; | 458 return net::OK; |
450 } | 459 } |
451 | 460 |
452 URLRequestContext* URLRequest::context() { | 461 URLRequestContext* URLRequest::context() { |
453 return context_.get(); | 462 return context_.get(); |
454 } | 463 } |
455 | 464 |
456 void URLRequest::set_context(URLRequestContext* context) { | 465 void URLRequest::set_context(URLRequestContext* context) { |
(...skipping 20 matching lines...) Expand all Loading... |
477 } | 486 } |
478 | 487 |
479 #ifndef NDEBUG | 488 #ifndef NDEBUG |
480 | 489 |
481 URLRequestMetrics::~URLRequestMetrics() { | 490 URLRequestMetrics::~URLRequestMetrics() { |
482 DLOG_IF(WARNING, object_count != 0) << | 491 DLOG_IF(WARNING, object_count != 0) << |
483 "Leaking " << object_count << " URLRequest object(s)"; | 492 "Leaking " << object_count << " URLRequest object(s)"; |
484 } | 493 } |
485 | 494 |
486 #endif | 495 #endif |
OLD | NEW |