Index: components/autofill/core/browser/wallet/real_pan_wallet_client.cc |
diff --git a/components/autofill/core/browser/wallet/real_pan_wallet_client.cc b/components/autofill/core/browser/wallet/real_pan_wallet_client.cc |
index 5020a472a63dbd35c3986b8d8c4dc2da2bea8840..37083c82155ce0503f237869e3537e1ee8c3c99e 100644 |
--- a/components/autofill/core/browser/wallet/real_pan_wallet_client.cc |
+++ b/components/autofill/core/browser/wallet/real_pan_wallet_client.cc |
@@ -86,6 +86,7 @@ RealPanWalletClient::RealPanWalletClient( |
: OAuth2TokenService::Consumer(kTokenServiceConsumerId), |
context_getter_(context_getter), |
delegate_(delegate), |
+ has_retried_authorization_(false), |
weak_ptr_factory_(this) { |
DCHECK(delegate); |
} |
@@ -95,45 +96,20 @@ RealPanWalletClient::~RealPanWalletClient() { |
void RealPanWalletClient::Prepare() { |
if (access_token_.empty()) |
- StartTokenFetch(); |
+ StartTokenFetch(false); |
} |
void RealPanWalletClient::UnmaskCard( |
const CreditCard& card, |
const CardUnmaskDelegate::UnmaskResponse& response) { |
DCHECK_EQ(CreditCard::MASKED_SERVER_CARD, card.record_type()); |
+ card_ = card; |
+ response_ = response; |
+ has_retried_authorization_ = false; |
- request_.reset(net::URLFetcher::Create( |
- 0, GetUnmaskCardRequestUrl(), net::URLFetcher::POST, this)); |
- request_->SetRequestContext(context_getter_.get()); |
- request_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | |
- net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DISABLE_CACHE); |
- |
- base::DictionaryValue request_dict; |
- request_dict.SetString("encrypted_cvc", "__param:s7e_13_cvc"); |
- request_dict.SetString("credit_card_id", card.server_id()); |
- request_dict.SetString("risk_data_base64", response.risk_data); |
- request_dict.Set("context", make_scoped_ptr(new base::DictionaryValue())); |
- |
- int value = 0; |
- if (base::StringToInt(response.exp_month, &value)) |
- request_dict.SetInteger("expiration_month", value); |
- if (base::StringToInt(response.exp_year, &value)) |
- request_dict.SetInteger("expiration_year", value); |
- |
- std::string json_request; |
- base::JSONWriter::Write(&request_dict, &json_request); |
- std::string post_body = |
- base::StringPrintf(kUnmaskCardRequestFormat, |
- net::EscapeUrlEncodedData(json_request, true).c_str(), |
- net::EscapeUrlEncodedData( |
- base::UTF16ToASCII(response.cvc), true).c_str()); |
- request_->SetUploadData("application/x-www-form-urlencoded", post_body); |
- request_->AddExtraRequestHeader( |
- net::HttpRequestHeaders::kAcceptEncoding + std::string(": chunked;q=0")); |
- |
+ CreateRequest(); |
if (access_token_.empty()) |
- StartTokenFetch(); |
+ StartTokenFetch(false); |
else |
SetOAuth2TokenAndStartRequest(); |
} |
@@ -179,6 +155,16 @@ void RealPanWalletClient::OnURLFetchComplete(const net::URLFetcher* source) { |
break; |
} |
+ case net::HTTP_UNAUTHORIZED: { |
+ if (has_retried_authorization_) |
+ break; |
+ has_retried_authorization_ = true; |
+ |
+ CreateRequest(); |
+ StartTokenFetch(true); |
+ return; |
+ } |
+ |
// Handle anything else as a generic error. |
default: |
break; |
@@ -222,17 +208,49 @@ void RealPanWalletClient::OnGetTokenFailure( |
access_token_request_.reset(); |
} |
-void RealPanWalletClient::StartTokenFetch() { |
- // Don't cancel outstanding requests. |
- if (access_token_request_) |
- return; |
+void RealPanWalletClient::CreateRequest() { |
+ request_.reset(net::URLFetcher::Create( |
+ 0, GetUnmaskCardRequestUrl(), net::URLFetcher::POST, this)); |
+ request_->SetRequestContext(context_getter_.get()); |
+ request_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | |
+ net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DISABLE_CACHE); |
- // However, do clear old tokens. |
- access_token_.clear(); |
+ base::DictionaryValue request_dict; |
+ request_dict.SetString("encrypted_cvc", "__param:s7e_13_cvc"); |
+ request_dict.SetString("credit_card_id", card_.server_id()); |
+ request_dict.SetString("risk_data_base64", response_.risk_data); |
+ request_dict.Set("context", make_scoped_ptr(new base::DictionaryValue())); |
+ |
+ int value = 0; |
+ if (base::StringToInt(response_.exp_month, &value)) |
+ request_dict.SetInteger("expiration_month", value); |
+ if (base::StringToInt(response_.exp_year, &value)) |
+ request_dict.SetInteger("expiration_year", value); |
+ |
+ std::string json_request; |
+ base::JSONWriter::Write(&request_dict, &json_request); |
+ std::string post_body = |
+ base::StringPrintf(kUnmaskCardRequestFormat, |
+ net::EscapeUrlEncodedData(json_request, true).c_str(), |
+ net::EscapeUrlEncodedData( |
+ base::UTF16ToASCII(response_.cvc), true).c_str()); |
+ request_->SetUploadData("application/x-www-form-urlencoded", post_body); |
+} |
+ |
+void RealPanWalletClient::StartTokenFetch(bool invalidate_old) { |
+ // We're still waiting for the last request to come back. |
+ if (!invalidate_old && access_token_request_) |
+ return; |
OAuth2TokenService::ScopeSet wallet_scopes; |
wallet_scopes.insert(kWalletOAuth2Scope); |
IdentityProvider* identity = delegate_->GetIdentityProvider(); |
+ if (invalidate_old) { |
+ DCHECK(!access_token_.empty()); |
+ identity->GetTokenService()->InvalidateToken( |
+ identity->GetActiveAccountId(), wallet_scopes, access_token_); |
+ } |
+ access_token_.clear(); |
access_token_request_ = identity->GetTokenService()->StartRequest( |
identity->GetActiveAccountId(), wallet_scopes, this); |
} |