blob: 13bf3c3700837b091fda672c571dec7499076eee [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SAFE_BROWSING_EXTENSION_TELEMETRY_EXTENSION_TELEMETRY_UPLOADER_H_
#define CHROME_BROWSER_SAFE_BROWSING_EXTENSION_TELEMETRY_EXTENSION_TELEMETRY_UPLOADER_H_
#include <memory>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
namespace network {
class SharedURLLoaderFactory;
class SimpleURLLoader;
} // namespace network
namespace safe_browsing {
class SafeBrowsingTokenFetcher;
// An uploader of extension telemetry reports. An upload is initiated by
// creating an instance of this object and then calling its StartUpload method.
// The upload can be cancelled by deleting the uploader instance. The instance
// is not usable after the upload notification and can be safely destroyed.
class ExtensionTelemetryUploader {
public:
ExtensionTelemetryUploader(const ExtensionTelemetryUploader&) = delete;
ExtensionTelemetryUploader& operator=(const ExtensionTelemetryUploader&) =
delete;
virtual ~ExtensionTelemetryUploader();
// A callback run by the uploader upon success or failure.
using OnUploadCallback =
base::OnceCallback<void(bool success, const std::string& response_data)>;
ExtensionTelemetryUploader(
OnUploadCallback callback,
const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory,
std::unique_ptr<std::string> upload_data,
std::unique_ptr<SafeBrowsingTokenFetcher> token_fetcher);
// Start the upload by sending a request. This method performs retries if
// necessary and finally calls |callback_|. It must be called on the UI
// thread. |callback_| will also be invoked on the UI thread.
void Start();
static std::string GetUploadURLForTest();
private:
// Determines whether to send a request with access token.
void MaybeSendRequestWithAccessToken();
// Sends a single network request.
void SendRequest(const std::string& access_token);
// Callback when SimpleURLLoader gets the response.
void OnURLLoaderComplete(std::unique_ptr<std::string> response_body);
// Called by OnURLLoaderComplete to handle successful/failed upload.
void RetryOrFinish(int net_error,
int response_code,
const std::string& response_data);
OnUploadCallback callback_;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
std::unique_ptr<network::SimpleURLLoader> url_loader_;
// Serialized telemetry report.
std::unique_ptr<std::string> upload_data_;
// Tracks backoff and retry parameters.
base::TimeDelta current_backoff_;
int num_upload_retries_;
base::TimeTicks upload_start_time_;
// The token fetcher used to attach OAuth access tokens to requests for
// appropriately consented users. It can be a nullptr when the user is
// not signed in.
std::unique_ptr<SafeBrowsingTokenFetcher> token_fetcher_;
base::WeakPtrFactory<ExtensionTelemetryUploader> weak_factory_{this};
};
} // namespace safe_browsing
#endif // CHROME_BROWSER_SAFE_BROWSING_EXTENSION_TELEMETRY_EXTENSION_TELEMETRY_UPLOADER_H_