1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#ifndef GOOGLE_APIS_DRIVE_REQUEST_SENDER_H_ 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define GOOGLE_APIS_DRIVE_REQUEST_SENDER_H_ 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <set> 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <string> 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/basictypes.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/callback_forward.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/ref_counted.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/weak_ptr.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/threading/thread_checker.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_errorcode.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace base { 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SequencedTaskRunner; 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace net { 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class URLRequestContextGetter; 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace google_apis { 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class AuthenticatedRequestInterface; 309ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochclass AuthServiceInterface; 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Helper class that sends requests implementing 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// AuthenticatedRequestInterface and handles retries and authentication. 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class RequestSender { 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 369ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // |auth_service| is used for fetching OAuth tokens. It'll be owned by 379ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // this RequestSender. 389ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |url_request_context_getter| is the context used to perform network 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // requests from this RequestSender. 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |blocking_task_runner| is used for running blocking operation, e.g., 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // parsing JSON response from the server. 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |custom_user_agent| will be used for the User-Agent header in HTTP 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // requests issued through the request sender if the value is not empty. 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RequestSender( 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AuthServiceInterface* auth_service, 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::URLRequestContextGetter* url_request_context_getter, 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner, 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& custom_user_agent); 529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch ~RequestSender(); 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 549ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch AuthServiceInterface* auth_service() { return auth_service_.get(); } 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch net::URLRequestContextGetter* url_request_context_getter() const { 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return url_request_context_getter_.get(); 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::SequencedTaskRunner* blocking_task_runner() const { 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return blocking_task_runner_.get(); 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Starts a request implementing the AuthenticatedRequestInterface 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // interface, and makes the request retry upon authentication failures by 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // calling back to RetryRequest. The |request| object is owned by this 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // RequestSender. It will be deleted in RequestSender's destructor or 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // in RequestFinished(). 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Returns a closure to cancel the request. The closure cancels the request 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // if it is in-flight, and does nothing if it is already terminated. 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Closure StartRequestWithRetry(AuthenticatedRequestInterface* request); 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Notifies to this RequestSender that |request| has finished. 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(kinaba): refactor the life time management and make this at private. 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void RequestFinished(AuthenticatedRequestInterface* request); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private: 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Called when the access token is fetched. 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void OnAccessTokenFetched( 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::WeakPtr<AuthenticatedRequestInterface>& request, 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GDataErrorCode error, 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& access_token); 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Clears any authentication token and retries the request, which forces 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // an authentication token refresh. 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void RetryRequest(AuthenticatedRequestInterface* request); 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Cancels the request. Used for implementing the returned closure of 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // StartRequestWithRetry. 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) void CancelRequest( 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::WeakPtr<AuthenticatedRequestInterface>& request); 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch scoped_ptr<AuthServiceInterface> auth_service_; 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::set<AuthenticatedRequestInterface*> in_flight_requests_; 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string custom_user_agent_; 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::ThreadChecker thread_checker_; 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Note: This should remain the last member so it'll be destroyed and 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // invalidate its weak pointers before any other members are destroyed. 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::WeakPtrFactory<RequestSender> weak_ptr_factory_; 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RequestSender); 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace google_apis 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // GOOGLE_APIS_DRIVE_REQUEST_SENDER_H_ 113