| // Copyright 2013 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 "components/dom_distiller/core/distiller_url_fetcher.h" |
| |
| #include "net/http/http_status_code.h" |
| #include "net/url_request/url_fetcher.h" |
| #include "net/url_request/url_fetcher_delegate.h" |
| #include "net/url_request/url_request_context_getter.h" |
| #include "net/url_request/url_request_status.h" |
| #include "url/gurl.h" |
| |
| using net::URLFetcher; |
| |
| namespace dom_distiller { |
| |
| DistillerURLFetcherFactory::DistillerURLFetcherFactory( |
| net::URLRequestContextGetter* context_getter) |
| : context_getter_(context_getter) { |
| } |
| |
| DistillerURLFetcher* |
| DistillerURLFetcherFactory::CreateDistillerURLFetcher() const { |
| return new DistillerURLFetcher(context_getter_); |
| } |
| |
| |
| DistillerURLFetcher::DistillerURLFetcher( |
| net::URLRequestContextGetter* context_getter) |
| : context_getter_(context_getter) { |
| } |
| |
| DistillerURLFetcher::~DistillerURLFetcher() { |
| } |
| |
| void DistillerURLFetcher::FetchURL(const std::string& url, |
| const URLFetcherCallback& callback) { |
| // Don't allow a fetch if one is pending. |
| DCHECK(!url_fetcher_ || !url_fetcher_->GetStatus().is_io_pending()); |
| callback_ = callback; |
| url_fetcher_.reset(CreateURLFetcher(context_getter_, url)); |
| url_fetcher_->Start(); |
| } |
| |
| URLFetcher* DistillerURLFetcher::CreateURLFetcher( |
| net::URLRequestContextGetter* context_getter, |
| const std::string& url) { |
| net::URLFetcher* fetcher = |
| URLFetcher::Create(GURL(url), URLFetcher::GET, this); |
| fetcher->SetRequestContext(context_getter); |
| static const int kMaxRetries = 5; |
| fetcher->SetMaxRetriesOn5xx(kMaxRetries); |
| return fetcher; |
| } |
| |
| void DistillerURLFetcher::OnURLFetchComplete( |
| const URLFetcher* source) { |
| std::string response; |
| if (source && source->GetStatus().is_success() && |
| source->GetResponseCode() == net::HTTP_OK) { |
| // Only copy over the data if the request was successful. Insert |
| // an empty string into the proto otherwise. |
| source->GetResponseAsString(&response); |
| } |
| callback_.Run(response); |
| } |
| |
| } // namespace dom_distiller |