blob: 8c1998da80473056016d1fe5f920273ef95f32d4 [file] [log] [blame]
// 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