Index: chrome/browser/net/gaia/gaia_oauth_fetcher.cc |
diff --git a/chrome/browser/net/gaia/gaia_oauth_fetcher.cc b/chrome/browser/net/gaia/gaia_oauth_fetcher.cc |
index 4ede11e4527865e6ac390263b491ee015398498e..2f9e1f602dd8e1942f8accd8c2e30c2e9df9c93a 100644 |
--- a/chrome/browser/net/gaia/gaia_oauth_fetcher.cc |
+++ b/chrome/browser/net/gaia/gaia_oauth_fetcher.cc |
@@ -11,6 +11,7 @@ |
#include "base/json/json_reader.h" |
#include "base/string_split.h" |
#include "base/string_util.h" |
+#include "chrome/browser/net/browser_url_util.h" |
#include "chrome/browser/net/gaia/gaia_oauth_consumer.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/tabs/tab_strip_model.h" |
@@ -671,6 +672,9 @@ void GaiaOAuthFetcher::OnURLFetchComplete(const content::URLFetcher* source) { |
source->GetResponseAsString(&data); |
net::URLRequestStatus status = source->GetStatus(); |
int response_code = source->GetResponseCode(); |
+ VLOG(1) << "GaiaOAuthFetcher::OnURLFetchComplete" |
+ << ", url=" << url.spec() |
+ << ", status=" << response_code; |
if (StartsWithASCII(url.spec(), gaia_urls->get_oauth_token_url(), true)) { |
OnGetOAuthTokenUrlFetched(source->GetCookies(), status, response_code); |
} else if (url.spec() == gaia_urls->oauth1_login_url()) { |
@@ -686,7 +690,45 @@ void GaiaOAuthFetcher::OnURLFetchComplete(const content::URLFetcher* source) { |
true)) { |
OnOAuthRevokeTokenFetched(data, status, response_code); |
} else { |
- NOTREACHED(); |
+ // Invalid cookies cause Gaia to redirect to ServiceLogin. Check if |
+ // this is the case and report failure properly. |
+ std::string url_no_query = url.GetOrigin().spec() + url.path().substr(1); |
+ std::string continue_url; |
+ if (url_no_query == gaia_urls->service_login_url() && |
+ chrome_browser_net::GetValueForKeyInQuery(url, "continue", |
+ &continue_url)) { |
+ LOG(ERROR) << "GaiaOAuthFetcher redirected to service login" |
+ << " , url=" << url.spec(); |
+ |
+ if (StartsWithASCII(continue_url, |
+ gaia_urls->get_oauth_token_url(), |
+ true)) { |
+ consumer_->OnGetOAuthTokenFailure(GoogleServiceAuthError( |
+ GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
+ } else if (continue_url == gaia_urls->oauth1_login_url()) { |
+ consumer_->OnOAuthLoginFailure(GoogleServiceAuthError( |
+ GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
+ } else if (continue_url == gaia_urls->oauth_get_access_token_url()) { |
+ consumer_->OnOAuthGetAccessTokenFailure(GoogleServiceAuthError( |
+ GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
+ } else if (continue_url == gaia_urls->oauth_wrap_bridge_url()) { |
+ consumer_->OnOAuthWrapBridgeFailure(service_scope_, |
+ GoogleServiceAuthError( |
+ GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
+ } else if (continue_url == gaia_urls->oauth_user_info_url()) { |
+ consumer_->OnUserInfoFailure(GoogleServiceAuthError( |
+ GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
+ } else if (StartsWithASCII(continue_url, |
+ gaia_urls->oauth_revoke_token_url(), |
+ true)) { |
+ consumer_->OnOAuthRevokeTokenFailure(GoogleServiceAuthError( |
+ GoogleServiceAuthError::SERVICE_UNAVAILABLE)); |
+ } else { |
+ NOTREACHED(); |
+ } |
+ } else { |
+ NOTREACHED() << "GaiaOAuthFetcher unknown url=" << url.spec(); |
+ } |
} |
} |