Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4473)

Unified Diff: chrome/browser/chromeos/login/login_utils.cc

Issue 10446033: Retry fetching OAuth1 request token on failure (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add error message for log diagnosis. Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chromeos/login/login_utils.cc
diff --git a/chrome/browser/chromeos/login/login_utils.cc b/chrome/browser/chromeos/login/login_utils.cc
index 52ffb3c6e36dc6e127faab35688264363f6a2d27..93529c0e9545b1f6fb59f5c1a4db900586144254 100644
--- a/chrome/browser/chromeos/login/login_utils.cc
+++ b/chrome/browser/chromeos/login/login_utils.cc
@@ -94,10 +94,15 @@ namespace chromeos {
namespace {
-// OAuth token verification retry count.
+// OAuth token verification max retry count.
const int kMaxOAuthTokenVerificationAttemptCount = 5;
-// OAuth token verification retry delay.
-const int kOAuthVerificationRestartDelay = 10000; // ms
+// OAuth token verification retry delay in milliseconds.
+const int kOAuthVerificationRestartDelay = 10000;
+
+// OAuth token request max retry count.
+const int kMaxOAuthTokenRequestAttemptCount = 5;
+// OAuth token request retry delay in milliseconds.
+const int kOAuthTokenRequestRestartDelay = 3000;
// Affixes for Auth token received from ClientLogin request.
const char kAuthPrefix[] = "Auth=";
@@ -334,7 +339,7 @@ class OAuthLoginVerifier : public base::SupportsWeakPtr<OAuthLoginVerifier>,
delegate_->OnOAuthVerificationFailed(username_);
}
- void OnCookueFetchFailed(const GoogleServiceAuthError& error) {
+ void OnCookieFetchFailed(const GoogleServiceAuthError& error) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (!RetryOnError(error))
delegate_->OnUserCookiesFetchFailed(username_);
@@ -350,7 +355,7 @@ class OAuthLoginVerifier : public base::SupportsWeakPtr<OAuthLoginVerifier>,
const GoogleServiceAuthError& error) OVERRIDE {
DVLOG(1) << "Failed IssueAuthToken request,"
<< " error.state=" << error.state();
- OnCookueFetchFailed(error);
+ OnCookieFetchFailed(error);
}
virtual void OnMergeSessionSuccess(const std::string& data) OVERRIDE {
@@ -364,7 +369,7 @@ class OAuthLoginVerifier : public base::SupportsWeakPtr<OAuthLoginVerifier>,
const GoogleServiceAuthError& error) OVERRIDE {
DVLOG(1) << "Failed MergeSession request,"
<< " error.state=" << error.state();
- OnCookueFetchFailed(error);
+ OnCookieFetchFailed(error);
}
OAuthLoginVerifier::Delegate* delegate_;
@@ -548,7 +553,8 @@ class LoginUtilsImpl
has_cookies_(false),
delegate_(NULL),
job_restart_request_(NULL),
- should_restore_auth_session_(false) {
+ should_restore_auth_session_(false),
+ token_request_count_(0) {
net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
}
@@ -676,6 +682,9 @@ class LoginUtilsImpl
// online state change.
bool should_restore_auth_session_;
+ // Number of retries we have requested for OAuth1 access token.
+ int token_request_count_;
+
DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl);
};
@@ -890,7 +899,18 @@ void LoginUtilsImpl::OnProfileCreated(
// authentication UI.
//
// TODO(rickcam) We should use an isolated App here.
- FetchOAuth1AccessToken(authenticator_->authentication_profile());
+ NetworkLibrary* network_library = CrosLibrary::Get()->GetNetworkLibrary();
+ if (network_library && network_library->Connected()) {
+ FetchOAuth1AccessToken(authenticator_->authentication_profile());
+ } else {
+ VLOG(1) << "Network is unreacheable; deferring token request.";
+ BrowserThread::PostDelayedTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&LoginUtilsImpl::FetchOAuth1AccessToken,
+ base::Unretained(this),
+ authenticator_->authentication_profile()),
+ base::TimeDelta::FromMilliseconds(kOAuthTokenRequestRestartDelay));
+ }
}
}
@@ -1273,13 +1293,24 @@ void LoginUtilsImpl::StopBackgroundFetchers() {
void LoginUtilsImpl::OnGetOAuthTokenSuccess(const std::string& oauth_token) {
VLOG(1) << "Got OAuth request token!";
+ token_request_count_ = 0;
}
void LoginUtilsImpl::OnGetOAuthTokenFailure(
const GoogleServiceAuthError& error) {
- // TODO(zelidrag): Pop up sync setup UI here?
LOG(WARNING) << "Failed fetching OAuth request token, error: "
<< error.state();
+ // If the request failed due to network flakiness, try again.
zel 2012/05/25 15:19:36 Since this process is no longer super simple, let'
kochi 2012/05/28 08:46:12 Done.
+ if (error.state() == GoogleServiceAuthError::SERVICE_UNAVAILABLE &&
Nikita (slow) 2012/05/25 18:12:08 error.state() == GoogleServiceAuthError::CONNECTIO
kochi 2012/05/28 08:46:12 Done.
+ token_request_count_++ < kMaxOAuthTokenRequestAttemptCount) {
+ BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&LoginUtilsImpl::FetchOAuth1AccessToken,
+ base::Unretained(this),
+ authenticator_->authentication_profile()),
+ base::TimeDelta::FromMilliseconds(kOAuthTokenRequestRestartDelay));
+ return;
+ }
+ LOG(WARNING) << "Unrecoverable error or retry count max reached, giving up.";
}
void LoginUtilsImpl::OnOAuthGetAccessTokenSuccess(const std::string& token,
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698