Index: chrome/browser/history/web_history_service.cc |
diff --git a/chrome/browser/history/web_history_service.cc b/chrome/browser/history/web_history_service.cc |
index 91f102174180cee369cc544a2d441a61d5dec847..0a792307ca2e513b7aa3a167a1bb23e020a1433f 100644 |
--- a/chrome/browser/history/web_history_service.cc |
+++ b/chrome/browser/history/web_history_service.cc |
@@ -64,6 +64,7 @@ class RequestImpl : public WebHistoryService::Request, |
: profile_(profile), |
url_(GURL(url)), |
response_code_(0), |
+ auth_retry_count_(0), |
callback_(callback) { |
} |
@@ -81,6 +82,19 @@ class RequestImpl : public WebHistoryService::Request, |
virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE { |
DCHECK_EQ(source, url_fetcher_.get()); |
response_code_ = url_fetcher_->GetResponseCode(); |
+ |
+ // If the response code indicates that the token might not be valid, |
+ // invalidate the token and try again. |
+ if (response_code_ == net::HTTP_UNAUTHORIZED && ++auth_retry_count_ <= 1) { |
+ OAuth2TokenService::ScopeSet oauth_scopes; |
+ oauth_scopes.insert(kHistoryOAuthScope); |
+ OAuth2TokenServiceFactory::GetForProfile(profile_)->InvalidateToken( |
+ oauth_scopes, access_token_); |
+ |
+ access_token_ = std::string(); |
+ Start(); |
+ return; |
+ } |
url_fetcher_->GetResponseAsString(&response_body_); |
url_fetcher_.reset(); |
callback_.Run(this, true); |
@@ -93,6 +107,7 @@ class RequestImpl : public WebHistoryService::Request, |
const base::Time& expiration_time) OVERRIDE { |
token_request_.reset(); |
DCHECK(!access_token.empty()); |
+ access_token_ = access_token; |
// Got an access token -- start the actual API request. |
url_fetcher_.reset(CreateUrlFetcher(access_token)); |
@@ -140,6 +155,9 @@ class RequestImpl : public WebHistoryService::Request, |
// The OAuth2 access token request. |
scoped_ptr<OAuth2TokenService::Request> token_request_; |
+ // The current OAuth2 access token. |
+ std::string access_token_; |
+ |
// Handles the actual API requests after the OAuth token is acquired. |
scoped_ptr<net::URLFetcher> url_fetcher_; |
@@ -149,6 +167,10 @@ class RequestImpl : public WebHistoryService::Request, |
// Holds the response body received from the server. |
std::string response_body_; |
+ // The number of times this request has already been retried due to |
+ // authorization problems. |
+ int auth_retry_count_; |
+ |
// The callback to execute when the query is complete. |
CompletionCallback callback_; |
}; |