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