| // 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 ASH_QUICK_PAIR_REPOSITORY_OAUTH_HTTP_FETCHER_H_ |
| #define ASH_QUICK_PAIR_REPOSITORY_OAUTH_HTTP_FETCHER_H_ |
| |
| #include "ash/quick_pair/repository/http_fetcher.h" |
| #include "base/functional/callback.h" |
| #include "base/gtest_prod_util.h" |
| #include "base/memory/weak_ptr.h" |
| #include "components/signin/public/identity_manager/access_token_info.h" |
| #include "components/signin/public/identity_manager/oauth_consumer_ids.h" |
| #include "google_apis/gaia/google_service_auth_error.h" |
| #include "google_apis/gaia/oauth2_access_token_manager.h" |
| #include "google_apis/gaia/oauth2_api_call_flow.h" |
| #include "net/traffic_annotation/network_traffic_annotation.h" |
| #include "url/gurl.h" |
| |
| namespace signin { |
| class PrimaryAccountAccessTokenFetcher; |
| } // namespace signin |
| |
| namespace ash { |
| namespace quick_pair { |
| |
| // Makes HTTP GET requests and returns the response. |
| class OAuthHttpFetcher : public HttpFetcher, public OAuth2ApiCallFlow { |
| public: |
| explicit OAuthHttpFetcher( |
| const net::PartialNetworkTrafficAnnotationTag& traffic_annotation, |
| signin::OAuthConsumerId oauth_consumer_id); |
| OAuthHttpFetcher(const OAuthHttpFetcher&) = delete; |
| OAuthHttpFetcher& operator=(const OAuthHttpFetcher&) = delete; |
| ~OAuthHttpFetcher() override; |
| |
| // HttpFetcher:: |
| void ExecuteGetRequest(const GURL& url, |
| FetchCompleteCallback callback) override; |
| void ExecutePostRequest(const GURL& url, |
| const std::string& body, |
| FetchCompleteCallback callback) override; |
| void ExecuteDeleteRequest(const GURL& url, |
| FetchCompleteCallback callback) override; |
| |
| protected: |
| // Reduce the visibility of OAuth2ApiCallFlow::Start() to avoid exposing |
| // overloaded methods. |
| using OAuth2ApiCallFlow::Start; |
| |
| // google_apis::OAuth2ApiCallFlow: |
| GURL CreateApiCallUrl() override; |
| std::string CreateApiCallBody() override; |
| std::string CreateApiCallBodyContentType() override; |
| void ProcessApiCallSuccess(const network::mojom::URLResponseHead* head, |
| std::optional<std::string> body) override; |
| void ProcessApiCallFailure(int net_error, |
| const network::mojom::URLResponseHead* head, |
| std::optional<std::string> body) override; |
| net::PartialNetworkTrafficAnnotationTag GetNetworkTrafficAnnotationTag() |
| override; |
| std::string GetRequestTypeForBody(std::string_view body) override; |
| |
| private: |
| FRIEND_TEST_ALL_PREFIXES(OAuthHttpFetcherTest, |
| ExecuteGetRequest_MultipleRaceCondition); |
| |
| void StartRequest(const GURL& url, FetchCompleteCallback callback); |
| void OnAccessTokenFetched(GoogleServiceAuthError error, |
| signin::AccessTokenInfo access_token_info); |
| |
| net::PartialNetworkTrafficAnnotationTag traffic_annotation_; |
| signin::OAuthConsumerId oauth_consumer_id_; |
| |
| bool has_call_started_ = false; |
| GURL url_; |
| std::string body_; |
| RequestType request_type_; |
| FetchCompleteCallback callback_; |
| |
| std::unique_ptr<signin::PrimaryAccountAccessTokenFetcher> |
| access_token_fetcher_; |
| |
| base::WeakPtrFactory<OAuthHttpFetcher> weak_ptr_factory_{this}; |
| }; |
| |
| } // namespace quick_pair |
| } // namespace ash |
| |
| #endif // ASH_QUICK_PAIR_REPOSITORY_OAUTH_HTTP_FETCHER_H_ |