1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_GOOGLE_APIS_REQUEST_SENDER_H_ 6 #define CHROME_BROWSER_GOOGLE_APIS_REQUEST_SENDER_H_ 7 8 #include <set> 9 #include <string> 10 #include <vector> 11 12 #include "base/basictypes.h" 13 #include "base/callback_forward.h" 14 #include "base/memory/ref_counted.h" 15 #include "base/memory/scoped_ptr.h" 16 #include "base/memory/weak_ptr.h" 17 #include "base/threading/thread_checker.h" 18 #include "chrome/browser/google_apis/gdata_errorcode.h" 19 20 namespace base { 21 class TaskRunner; 22 } 23 24 namespace net { 25 class URLRequestContextGetter; 26 } 27 28 namespace google_apis { 29 30 class AuthenticatedRequestInterface; 31 class AuthServiceInterface; 32 33 // Helper class that sends requests implementing 34 // AuthenticatedRequestInterface and handles retries and authentication. 35 class RequestSender { 36 public: 37 // |auth_service| is used for fetching OAuth tokens. It'll be owned by 38 // this RequestSender. 39 // 40 // |url_request_context_getter| is the context used to perform network 41 // requests from this RequestSender. 42 // 43 // |blocking_task_runner| is used for running blocking operation, e.g., 44 // parsing JSON response from the server. 45 // 46 // |custom_user_agent| will be used for the User-Agent header in HTTP 47 // requests issued through the request sender if the value is not empty. 48 RequestSender(AuthServiceInterface* auth_service, 49 net::URLRequestContextGetter* url_request_context_getter, 50 base::TaskRunner* blocking_task_runner, 51 const std::string& custom_user_agent); 52 ~RequestSender(); 53 54 AuthServiceInterface* auth_service() { return auth_service_.get(); } 55 56 net::URLRequestContextGetter* url_request_context_getter() const { 57 return url_request_context_getter_; 58 } 59 60 base::TaskRunner* blocking_task_runner() const { 61 return blocking_task_runner_.get(); 62 } 63 64 // Starts a request implementing the AuthenticatedRequestInterface 65 // interface, and makes the request retry upon authentication failures by 66 // calling back to RetryRequest. The |request| object is owned by this 67 // RequestSender. It will be deleted in RequestSender's destructor or 68 // in RequestFinished(). 69 // 70 // Returns a closure to cancel the request. The closure cancels the request 71 // if it is in-flight, and does nothing if it is already terminated. 72 base::Closure StartRequestWithRetry(AuthenticatedRequestInterface* request); 73 74 // Notifies to this RequestSender that |request| has finished. 75 // TODO(kinaba): refactor the life time management and make this at private. 76 void RequestFinished(AuthenticatedRequestInterface* request); 77 78 private: 79 // Called when the access token is fetched. 80 void OnAccessTokenFetched( 81 const base::WeakPtr<AuthenticatedRequestInterface>& request, 82 GDataErrorCode error, 83 const std::string& access_token); 84 85 // Clears any authentication token and retries the request, which forces 86 // an authentication token refresh. 87 void RetryRequest(AuthenticatedRequestInterface* request); 88 89 // Cancels the request. Used for implementing the returned closure of 90 // StartRequestWithRetry. 91 void CancelRequest( 92 const base::WeakPtr<AuthenticatedRequestInterface>& request); 93 94 scoped_ptr<AuthServiceInterface> auth_service_; 95 net::URLRequestContextGetter* url_request_context_getter_; // Not owned. 96 scoped_refptr<base::TaskRunner> blocking_task_runner_; 97 98 std::set<AuthenticatedRequestInterface*> in_flight_requests_; 99 const std::string custom_user_agent_; 100 101 base::ThreadChecker thread_checker_; 102 103 // Note: This should remain the last member so it'll be destroyed and 104 // invalidate its weak pointers before any other members are destroyed. 105 base::WeakPtrFactory<RequestSender> weak_ptr_factory_; 106 107 DISALLOW_COPY_AND_ASSIGN(RequestSender); 108 }; 109 110 } // namespace google_apis 111 112 #endif // CHROME_BROWSER_GOOGLE_APIS_REQUEST_SENDER_H_ 113