| Index: chrome/browser/url_fetcher.cc
|
| ===================================================================
|
| --- chrome/browser/url_fetcher.cc (revision 8164)
|
| +++ chrome/browser/url_fetcher.cc (working copy)
|
| @@ -1,182 +0,0 @@
|
| -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/url_fetcher.h"
|
| -
|
| -#include "base/compiler_specific.h"
|
| -#include "base/string_util.h"
|
| -#include "base/thread.h"
|
| -#include "chrome/browser/browser_process.h"
|
| -#include "chrome/browser/chrome_thread.h"
|
| -#include "googleurl/src/gurl.h"
|
| -#include "net/base/load_flags.h"
|
| -
|
| -URLFetcher::URLFetcher(const GURL& url,
|
| - RequestType request_type,
|
| - Delegate* d)
|
| - : ALLOW_THIS_IN_INITIALIZER_LIST(
|
| - core_(new Core(this, url, request_type, d))) {
|
| -}
|
| -
|
| -URLFetcher::~URLFetcher() {
|
| - core_->Stop();
|
| -}
|
| -
|
| -URLFetcher::Core::Core(URLFetcher* fetcher,
|
| - const GURL& original_url,
|
| - RequestType request_type,
|
| - URLFetcher::Delegate* d)
|
| - : fetcher_(fetcher),
|
| - original_url_(original_url),
|
| - request_type_(request_type),
|
| - delegate_(d),
|
| - delegate_loop_(MessageLoop::current()),
|
| - io_loop_(ChromeThread::GetMessageLoop(ChromeThread::IO)),
|
| - request_(NULL),
|
| - load_flags_(net::LOAD_NORMAL),
|
| - response_code_(-1),
|
| - protect_entry_(URLFetcherProtectManager::GetInstance()->Register(
|
| - original_url_.host())),
|
| - num_retries_(0) {
|
| -}
|
| -
|
| -void URLFetcher::Core::Start() {
|
| - DCHECK(delegate_loop_);
|
| - DCHECK(io_loop_);
|
| - DCHECK(request_context_) << "We need an URLRequestContext!";
|
| - io_loop_->PostDelayedTask(FROM_HERE, NewRunnableMethod(
|
| - this, &Core::StartURLRequest),
|
| - protect_entry_->UpdateBackoff(URLFetcherProtectEntry::SEND));
|
| -}
|
| -
|
| -void URLFetcher::Core::Stop() {
|
| - DCHECK_EQ(MessageLoop::current(), delegate_loop_);
|
| - delegate_ = NULL;
|
| - io_loop_->PostTask(FROM_HERE, NewRunnableMethod(
|
| - this, &Core::CancelURLRequest));
|
| -}
|
| -
|
| -void URLFetcher::Core::OnResponseStarted(URLRequest* request) {
|
| - DCHECK(request == request_);
|
| - DCHECK(MessageLoop::current() == io_loop_);
|
| - if (request_->status().is_success()) {
|
| - response_code_ = request_->GetResponseCode();
|
| - response_headers_ = request_->response_headers();
|
| - }
|
| -
|
| - int bytes_read = 0;
|
| - // Some servers may treat HEAD requests as GET requests. To free up the
|
| - // network connection as soon as possible, signal that the request has
|
| - // completed immediately, without trying to read any data back (all we care
|
| - // about is the response code and headers, which we already have).
|
| - if (request_->status().is_success() && (request_type_ != HEAD))
|
| - request_->Read(buffer_, sizeof(buffer_), &bytes_read);
|
| - OnReadCompleted(request_, bytes_read);
|
| -}
|
| -
|
| -void URLFetcher::Core::OnReadCompleted(URLRequest* request, int bytes_read) {
|
| - DCHECK(request == request_);
|
| - DCHECK(MessageLoop::current() == io_loop_);
|
| -
|
| - url_ = request->url();
|
| -
|
| - do {
|
| - if (!request_->status().is_success() || bytes_read <= 0)
|
| - break;
|
| - data_.append(buffer_, bytes_read);
|
| - } while (request_->Read(buffer_, sizeof(buffer_), &bytes_read));
|
| -
|
| - if (request_->status().is_success())
|
| - request_->GetResponseCookies(&cookies_);
|
| -
|
| - // See comments re: HEAD requests in OnResponseStarted().
|
| - if (!request_->status().is_io_pending() || (request_type_ == HEAD)) {
|
| - delegate_loop_->PostTask(FROM_HERE, NewRunnableMethod(
|
| - this, &Core::OnCompletedURLRequest, request_->status()));
|
| - delete request_;
|
| - request_ = NULL;
|
| - }
|
| -}
|
| -
|
| -void URLFetcher::Core::StartURLRequest() {
|
| - DCHECK(MessageLoop::current() == io_loop_);
|
| - DCHECK(!request_);
|
| -
|
| - request_ = new URLRequest(original_url_, this);
|
| - request_->set_load_flags(
|
| - request_->load_flags() | net::LOAD_DISABLE_INTERCEPT | load_flags_);
|
| - request_->set_context(request_context_.get());
|
| -
|
| - switch (request_type_) {
|
| - case GET:
|
| - break;
|
| -
|
| - case POST:
|
| - DCHECK(!upload_content_.empty());
|
| - DCHECK(!upload_content_type_.empty());
|
| -
|
| - request_->set_method("POST");
|
| - if (!extra_request_headers_.empty())
|
| - extra_request_headers_ += "\r\n";
|
| - StringAppendF(&extra_request_headers_,
|
| - "Content-Type: %s", upload_content_type_.c_str());
|
| - request_->AppendBytesToUpload(upload_content_.data(),
|
| - static_cast<int>(upload_content_.size()));
|
| - break;
|
| -
|
| - case HEAD:
|
| - request_->set_method("HEAD");
|
| - break;
|
| -
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| -
|
| - if (!extra_request_headers_.empty())
|
| - request_->SetExtraRequestHeaders(extra_request_headers_);
|
| -
|
| - request_->Start();
|
| -}
|
| -
|
| -void URLFetcher::Core::CancelURLRequest() {
|
| - DCHECK(MessageLoop::current() == io_loop_);
|
| - if (request_) {
|
| - request_->Cancel();
|
| - delete request_;
|
| - request_ = NULL;
|
| - }
|
| - // Release the reference to the request context. There could be multiple
|
| - // references to URLFetcher::Core at this point so it may take a while to
|
| - // delete the object, but we cannot delay the destruction of the request
|
| - // context.
|
| - request_context_ = NULL;
|
| -}
|
| -
|
| -void URLFetcher::Core::OnCompletedURLRequest(const URLRequestStatus& status) {
|
| - DCHECK(MessageLoop::current() == delegate_loop_);
|
| -
|
| - // Checks the response from server.
|
| - if (response_code_ >= 500) {
|
| - // When encountering a server error, we will send the request again
|
| - // after backoff time.
|
| - const int wait =
|
| - protect_entry_->UpdateBackoff(URLFetcherProtectEntry::FAILURE);
|
| - ++num_retries_;
|
| - // Restarts the request if we still need to notify the delegate.
|
| - if (delegate_) {
|
| - if (num_retries_ <= protect_entry_->max_retries()) {
|
| - io_loop_->PostDelayedTask(FROM_HERE, NewRunnableMethod(
|
| - this, &Core::StartURLRequest), wait);
|
| - } else {
|
| - delegate_->OnURLFetchComplete(fetcher_, url_, status, response_code_,
|
| - cookies_, data_);
|
| - }
|
| - }
|
| - } else {
|
| - protect_entry_->UpdateBackoff(URLFetcherProtectEntry::SUCCESS);
|
| - if (delegate_)
|
| - delegate_->OnURLFetchComplete(fetcher_, url_, status, response_code_,
|
| - cookies_, data_);
|
| - }
|
| -}
|
|
|