blob: e493aab47b95a7229dc2f44aa4abc2ced1ea5741 [file] [log] [blame]
// Copyright 2025 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_DEVTOOLS_DEVTOOLS_HTTP_SERVICE_HANDLER_H_
#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_SERVICE_HANDLER_H_
#include <compare>
#include "base/containers/flat_set.h"
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/unguessable_token.h"
#include "chrome/browser/devtools/devtools_dispatch_http_request_params.h"
#include "components/signin/public/identity_manager/access_token_fetcher.h"
#include "components/signin/public/identity_manager/scope_set.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "services/data_decoder/public/cpp/data_decoder.h"
#include "services/network/public/cpp/simple_url_loader.h"
class GURL;
class Profile;
namespace signin {
class AccessTokenFetcher;
struct AccessTokenInfo;
} // namespace signin
class DevToolsHttpServiceHandler {
public:
struct Result {
enum class Error {
kNone, // Success
kServiceNotFound, // The service is not registered.
kAccessDenied, // The path/method is not in the allow-list.
kValidationFailed, // Service-specific validation failed.
kTokenFetchFailed, // Could not get an OAuth token.
kNetworkError, // A network-level error occurred (e.g., DNS failure).
kHttpError, // Server returned a non-2xx HTTP status.
};
Result();
~Result();
Result(Result&&);
Result& operator=(Result&&);
Error error = Error::kNone;
int net_error = 0;
int http_status = -1;
std::optional<std::string> response_body;
std::string error_detail;
};
using Callback = base::OnceCallback<void(std::unique_ptr<Result> result)>;
DevToolsHttpServiceHandler();
virtual ~DevToolsHttpServiceHandler();
void Request(Profile* profile,
const DevToolsDispatchHttpRequestParams& params,
Callback callback);
private:
// Performs service-specific pre-request validation. Can be asynchronous.
virtual void CanMakeRequest(
Profile* profile,
base::OnceCallback<void(bool success)> callback) = 0;
// Returns the base URL for the service's API.
virtual GURL BaseURL() const = 0;
// Returns the OAuth scopes required for authenticating with the service.
virtual signin::ScopeSet OAuthScopes() const = 0;
// Returns the traffic annotation for the request.
virtual net::NetworkTrafficAnnotationTag NetworkTrafficAnnotationTag()
const = 0;
void OnValidationDone(Callback callback,
Profile* profile,
const DevToolsDispatchHttpRequestParams& params,
bool validation_success);
void OnTokenFetched(Callback callback,
Profile* profile,
const DevToolsDispatchHttpRequestParams& params,
base::UnguessableToken fetcher_id,
GoogleServiceAuthError error,
signin::AccessTokenInfo access_token_info);
void OnRequestComplete(
Callback callback,
std::unique_ptr<network::SimpleURLLoader> simple_url_loader,
std::optional<std::string> response_body);
std::map<base::UnguessableToken, std::unique_ptr<signin::AccessTokenFetcher>>
access_token_fetchers_;
base::WeakPtrFactory<DevToolsHttpServiceHandler> weak_factory_{this};
};
#endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_HTTP_SERVICE_HANDLER_H_