Chromium Code Reviews| Index: chrome/common/net/gaia/gaia_auth_fetcher.cc |
| =================================================================== |
| --- chrome/common/net/gaia/gaia_auth_fetcher.cc (revision 95804) |
| +++ chrome/common/net/gaia/gaia_auth_fetcher.cc (working copy) |
| @@ -54,6 +54,11 @@ |
| "auth=%s&" |
| "continue=%s&" |
| "source=%s"; |
| +// static |
| +const char GaiaAuthFetcher::kMergeSessionFormat[] = |
| + "uberauth=%s&" |
| + "continue=%s&" |
| + "source=%s"; |
| // static |
| const char GaiaAuthFetcher::kAccountDeletedError[] = "AccountDeleted"; |
| @@ -104,6 +109,7 @@ |
| issue_auth_token_gurl_(GaiaUrls::GetInstance()->issue_auth_token_url()), |
| get_user_info_gurl_(GaiaUrls::GetInstance()->get_user_info_url()), |
| token_auth_gurl_(GaiaUrls::GetInstance()->token_auth_url()), |
| + merge_session_gurl_(GaiaUrls::GetInstance()->merge_session_url()), |
| fetch_pending_(false) {} |
| GaiaAuthFetcher::~GaiaAuthFetcher() {} |
| @@ -123,14 +129,25 @@ |
| const std::string& body, |
| const GURL& gaia_gurl, |
| URLFetcher::Delegate* delegate) { |
| + return CreateGaiaFetcherWithFlags(getter, body, gaia_gurl, |
| + net::LOAD_DO_NOT_SEND_COOKIES, delegate); |
| +} |
| +// static |
| +URLFetcher* GaiaAuthFetcher::CreateGaiaFetcherWithFlags( |
| + net::URLRequestContextGetter* getter, |
| + const std::string& body, |
| + const GURL& gaia_gurl, |
| + int flags, |
| + URLFetcher::Delegate* delegate) { |
| + |
| URLFetcher* to_return = |
| URLFetcher::Create(0, |
| gaia_gurl, |
| URLFetcher::POST, |
| delegate); |
| to_return->set_request_context(getter); |
| - to_return->set_load_flags(net::LOAD_DO_NOT_SEND_COOKIES); |
| + to_return->set_load_flags(flags); |
| to_return->set_upload_data("application/x-www-form-urlencoded", body); |
| return to_return; |
| } |
| @@ -213,6 +230,20 @@ |
| encoded_source.c_str()); |
| } |
| +// static |
| +std::string GaiaAuthFetcher::MakeMergeSessionBody( |
| + const std::string& auth_token, |
| + const std::string& continue_url, |
| + const std::string& source) { |
| + std::string encoded_auth_token = EscapeUrlEncodedData(auth_token, true); |
| + std::string encoded_continue_url = EscapeUrlEncodedData(continue_url, true); |
| + std::string encoded_source = EscapeUrlEncodedData(source, true); |
| + return base::StringPrintf(kMergeSessionFormat, |
| + encoded_auth_token.c_str(), |
| + encoded_continue_url.c_str(), |
| + encoded_source.c_str()); |
| +} |
| + |
| // Helper method that extracts tokens from a successful reply. |
| // static |
| void GaiaAuthFetcher::ParseClientLoginResponse(const std::string& data, |
| @@ -342,6 +373,30 @@ |
| fetcher_->Start(); |
| } |
| +void GaiaAuthFetcher::StartMergeSession(const std::string& auth_token) { |
| + DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; |
| + |
| + VLOG(1) << "Starting MergeSession with auth_token=" << auth_token; |
| + |
| + // The continue URL is a required parameter of the MergeSession API, but in |
| + // this case we don't actually need or want to navigate to it. Setting it to |
| + // an arbitrary Google URL. |
| + // |
| + // In order for the new session to be merged correctly, the server needs to |
| + // know what sessions already exist in the browser. The fecther needs to be |
|
Rick Campbell
2011/08/08 21:24:51
TYPO: fetcher
Roger Tawa OOO till Jul 10th
2011/08/09 20:50:49
Done.
|
| + // created such that it sends the cookies with the request, which is |
| + // different from all other requests the fetcher can make. |
| + std::string continue_url("http://www.google.com"); |
| + request_body_ = MakeMergeSessionBody(auth_token, continue_url, source_); |
| + fetcher_.reset(CreateGaiaFetcherWithFlags(getter_, |
| + request_body_, |
| + merge_session_gurl_, |
| + net::LOAD_NORMAL, |
|
Rick Campbell
2011/08/08 21:24:51
Just looping back to my comment about preferring a
Roger Tawa OOO till Jul 10th
2011/08/09 20:50:49
Done.
|
| + this)); |
| + fetch_pending_ = true; |
| + fetcher_->Start(); |
| +} |
| + |
| // static |
| GoogleServiceAuthError GaiaAuthFetcher::GenerateAuthError( |
| const std::string& data, |
| @@ -512,6 +567,16 @@ |
| } |
| } |
| +void GaiaAuthFetcher::OnMergeSessionFetched(const std::string& data, |
| + const net::URLRequestStatus& status, |
| + int response_code) { |
| + if (status.is_success() && response_code == RC_REQUEST_OK) { |
| + consumer_->OnMergeSessionSuccess(data); |
| + } else { |
| + consumer_->OnMergeSessionFailure(GenerateAuthError(data, status)); |
| + } |
| +} |
| + |
| void GaiaAuthFetcher::OnURLFetchComplete(const URLFetcher* source, |
| const GURL& url, |
| const net::URLRequestStatus& status, |
| @@ -527,6 +592,10 @@ |
| OnGetUserInfoFetched(data, status, response_code); |
| } else if (url == token_auth_gurl_) { |
| OnTokenAuthFetched(data, status, response_code); |
| + } else if (url == merge_session_gurl_ || |
| + (source && source->original_url() == merge_session_gurl_)) { |
| + // MergeSession may redirect, so check the original URL of the fetcher. |
| + OnMergeSessionFetched(data, status, response_code); |
| } else { |
| NOTREACHED(); |
| } |