blob: 8b331dd3c4a28981571f46e236dd09dd61be9be3 [file] [log] [blame]
// Copyright 2018 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.
#ifndef CHROME_BROWSER_ANDROID_EXPLORE_SITES_EXPLORE_SITES_FETCHER_H_
#define CHROME_BROWSER_ANDROID_EXPLORE_SITES_EXPLORE_SITES_FETCHER_H_
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/android/explore_sites/explore_sites_types.h"
#include "net/base/backoff_entry.h"
namespace network {
class SimpleURLLoader;
class SharedURLLoaderFactory;
} // namespace network
namespace explore_sites {
// A class that fetches data from the server.
class ExploreSitesFetcher {
public:
// Callback to pass back the catalog returned from the server.
// Invoked with |nullptr| if there is an error.
using Callback =
base::OnceCallback<void(ExploreSitesRequestStatus status,
const std::unique_ptr<std::string> data)>;
static const net::BackoffEntry::Policy kImmediateFetchBackoffPolicy;
static const int kMaxFailureCountForImmediateFetch;
static const net::BackoffEntry::Policy kBackgroundFetchBackoffPolicy;
static const int kMaxFailureCountForBackgroundFetch;
// Creates a fetcher for the GetCatalog RPC.
static std::unique_ptr<ExploreSitesFetcher> CreateForGetCatalog(
bool is_immediate_fetch,
const std::string& catalog_version,
const std::string& accept_languages,
scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
Callback callback);
// Creates a fetcher for the GetCategories RPC.
static std::unique_ptr<ExploreSitesFetcher> CreateForGetCategories(
bool is_immediate_fetch,
const std::string& catalog_version,
const std::string& accept_languages,
scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
Callback callback);
~ExploreSitesFetcher();
void Start();
void disable_retry_for_testing() { disable_retry_for_testing_ = true; }
private:
explicit ExploreSitesFetcher(
bool is_immediate_fetch,
const GURL& url,
const std::string& catalog_version,
const std::string& accept_languages,
scoped_refptr<network ::SharedURLLoaderFactory> loader_factory,
Callback callback);
// Invoked from SimpleURLLoader after download is complete.
void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body);
ExploreSitesRequestStatus HandleResponseCode();
void RetryWithBackoff();
std::string accept_languages_;
std::string client_version_;
GURL request_url_;
net::BackoffEntry backoff_entry_;
int max_failure_count_;
bool disable_retry_for_testing_ = false;
Callback callback_;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
std::unique_ptr<network::SimpleURLLoader> url_loader_;
base::WeakPtrFactory<ExploreSitesFetcher> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(ExploreSitesFetcher);
};
} // namespace explore_sites
#endif // CHROME_BROWSER_ANDROID_EXPLORE_SITES_EXPLORE_SITES_FETCHER_H_