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 37083c82155ce0503f237869e3537e1ee8c3c99e..3934685ee22ae2ac1ec7aebe7be05432239cf00c 100644 |
--- a/components/autofill/core/browser/wallet/real_pan_wallet_client.cc |
+++ b/components/autofill/core/browser/wallet/real_pan_wallet_client.cc |
@@ -129,8 +129,8 @@ void RealPanWalletClient::OnURLFetchComplete(const net::URLFetcher* source) { |
std::string data; |
source->GetResponseAsString(&data); |
- // TODO(estade): OAuth2 may fail due to an expired access token, in which case |
- // we should invalidate the token and try again. How is that failure reported? |
+ std::string real_pan; |
+ AutofillClient::GetRealPanResult result = AutofillClient::SUCCESS; |
switch (response_code) { |
// Valid response. |
@@ -140,24 +140,19 @@ void RealPanWalletClient::OnURLFetchComplete(const net::URLFetcher* source) { |
message_value->IsType(base::Value::TYPE_DICTIONARY)) { |
response_dict.reset( |
static_cast<base::DictionaryValue*>(message_value.release())); |
+ response_dict->GetString("pan", &real_pan); |
+ if (real_pan.empty()) |
+ result = AutofillClient::TRY_AGAIN_FAILURE; |
+ // TODO(estade): check response for allow_retry. |
} |
break; |
} |
- // HTTP_BAD_REQUEST means the arguments are invalid. No point retrying. |
- case net::HTTP_BAD_REQUEST: { |
- break; |
- } |
- |
- // Response contains an error to show the user. |
- case net::HTTP_FORBIDDEN: |
- case net::HTTP_INTERNAL_SERVER_ERROR: { |
- break; |
- } |
- |
case net::HTTP_UNAUTHORIZED: { |
- if (has_retried_authorization_) |
+ if (has_retried_authorization_) { |
+ result = AutofillClient::PERMANENT_FAILURE; |
break; |
+ } |
has_retried_authorization_ = true; |
CreateRequest(); |
@@ -165,21 +160,27 @@ void RealPanWalletClient::OnURLFetchComplete(const net::URLFetcher* source) { |
return; |
} |
- // Handle anything else as a generic error. |
- default: |
+ // TODO(estade): is this actually how network connectivity issues are |
+ // reported? |
+ case net::HTTP_REQUEST_TIMEOUT: { |
+ result = AutofillClient::NETWORK_ERROR; |
break; |
- } |
+ } |
- std::string real_pan; |
- if (response_dict) |
- response_dict->GetString("pan", &real_pan); |
+ // Handle anything else as a generic (permanent) failure. |
+ default: { |
+ result = AutofillClient::PERMANENT_FAILURE; |
+ break; |
+ } |
+ } |
if (real_pan.empty()) { |
- NOTIMPLEMENTED() << "Unhandled error: " << response_code |
- << " with data: " << data; |
+ LOG(ERROR) << "Wallet returned error: " << response_code |
+ << " with data: " << data; |
} |
- delegate_->OnDidGetRealPan(real_pan); |
+ DCHECK_EQ(result != AutofillClient::SUCCESS, real_pan.empty()); |
+ delegate_->OnDidGetRealPan(result, real_pan); |
} |
void RealPanWalletClient::OnGetTokenSuccess( |
@@ -198,13 +199,12 @@ void RealPanWalletClient::OnGetTokenFailure( |
const OAuth2TokenService::Request* request, |
const GoogleServiceAuthError& error) { |
DCHECK_EQ(request, access_token_request_.get()); |
+ LOG(ERROR) << "Unhandled OAuth2 error: " << error.ToString(); |
if (request_) { |
request_.reset(); |
- delegate_->OnDidGetRealPan(std::string()); |
+ delegate_->OnDidGetRealPan(AutofillClient::PERMANENT_FAILURE, |
+ std::string()); |
} |
- // TODO(estade): what do we do in the failure case? |
- NOTIMPLEMENTED() << "Unhandled OAuth2 error: " << error.ToString(); |
- |
access_token_request_.reset(); |
} |
@@ -257,7 +257,7 @@ void RealPanWalletClient::StartTokenFetch(bool invalidate_old) { |
void RealPanWalletClient::SetOAuth2TokenAndStartRequest() { |
request_->AddExtraRequestHeader(net::HttpRequestHeaders::kAuthorization + |
- std::string(": Bearer ") + access_token_); |
+ std::string(": Bearer ") + access_token_); |
request_->Start(); |
} |