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

Side by Side Diff: components/autofill/content/browser/wallet/wallet_client.cc

Issue 123733002: WalletClient: don't bother queuing requests; we don't make multiple requests concurrently anyway (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sync Created 6 years, 11 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/autofill/content/browser/wallet/wallet_client.h" 5 #include "components/autofill/content/browser/wallet/wallet_client.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/json/json_reader.h" 8 #include "base/json/json_reader.h"
9 #include "base/json/json_writer.h" 9 #include "base/json/json_writer.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 251
252 WalletClient::FullWalletRequest::~FullWalletRequest() {} 252 WalletClient::FullWalletRequest::~FullWalletRequest() {}
253 253
254 WalletClient::WalletClient(net::URLRequestContextGetter* context_getter, 254 WalletClient::WalletClient(net::URLRequestContextGetter* context_getter,
255 WalletClientDelegate* delegate, 255 WalletClientDelegate* delegate,
256 const GURL& source_url) 256 const GURL& source_url)
257 : context_getter_(context_getter), 257 : context_getter_(context_getter),
258 delegate_(delegate), 258 delegate_(delegate),
259 user_index_(0U), 259 user_index_(0U),
260 source_url_(source_url), 260 source_url_(source_url),
261 request_type_(NO_PENDING_REQUEST), 261 request_type_(NO_REQUEST),
262 one_time_pad_(kOneTimePadLength), 262 one_time_pad_(kOneTimePadLength),
263 weak_ptr_factory_(this) { 263 weak_ptr_factory_(this) {
264 DCHECK(context_getter_.get()); 264 DCHECK(context_getter_.get());
265 DCHECK(delegate_); 265 DCHECK(delegate_);
266 } 266 }
267 267
268 WalletClient::~WalletClient() {} 268 WalletClient::~WalletClient() {}
269 269
270 void WalletClient::AcceptLegalDocuments( 270 void WalletClient::AcceptLegalDocuments(
271 const std::vector<WalletItems::LegalDocument*>& documents, 271 const std::vector<WalletItems::LegalDocument*>& documents,
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 MakeWalletRequest(GetGetWalletItemsUrl(user_index_), 469 MakeWalletRequest(GetGetWalletItemsUrl(user_index_),
470 post_body, 470 post_body,
471 kJsonMimeType, 471 kJsonMimeType,
472 GET_WALLET_ITEMS); 472 GET_WALLET_ITEMS);
473 } 473 }
474 474
475 bool WalletClient::HasRequestInProgress() const { 475 bool WalletClient::HasRequestInProgress() const {
476 return request_; 476 return request_;
477 } 477 }
478 478
479 void WalletClient::CancelRequests() { 479 void WalletClient::CancelRequest() {
480 request_.reset(); 480 request_.reset();
481 request_type_ = NO_PENDING_REQUEST; 481 request_type_ = NO_REQUEST;
482 while (!pending_requests_.empty()) {
483 pending_requests_.pop();
484 }
485 } 482 }
486 483
487 void WalletClient::SetUserIndex(size_t user_index) { 484 void WalletClient::SetUserIndex(size_t user_index) {
488 CancelRequests(); 485 CancelRequest();
489 user_index_ = user_index; 486 user_index_ = user_index;
490 } 487 }
491 488
492 void WalletClient::DoAcceptLegalDocuments( 489 void WalletClient::DoAcceptLegalDocuments(
493 const std::vector<std::string>& document_ids, 490 const std::vector<std::string>& document_ids,
494 const std::string& google_transaction_id) { 491 const std::string& google_transaction_id) {
495 base::DictionaryValue request_dict; 492 base::DictionaryValue request_dict;
496 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey()); 493 request_dict.SetString(kApiKeyKey, google_apis::GetAPIKey());
497 request_dict.SetString(kGoogleTransactionIdKey, google_transaction_id); 494 request_dict.SetString(kGoogleTransactionIdKey, google_transaction_id);
498 request_dict.SetString(kMerchantDomainKey, 495 request_dict.SetString(kMerchantDomainKey,
(...skipping 12 matching lines...) Expand all
511 MakeWalletRequest(GetAcceptLegalDocumentsUrl(user_index_), 508 MakeWalletRequest(GetAcceptLegalDocumentsUrl(user_index_),
512 post_body, 509 post_body,
513 kJsonMimeType, 510 kJsonMimeType,
514 ACCEPT_LEGAL_DOCUMENTS); 511 ACCEPT_LEGAL_DOCUMENTS);
515 } 512 }
516 513
517 void WalletClient::MakeWalletRequest(const GURL& url, 514 void WalletClient::MakeWalletRequest(const GURL& url,
518 const std::string& post_body, 515 const std::string& post_body,
519 const std::string& mime_type, 516 const std::string& mime_type,
520 RequestType request_type) { 517 RequestType request_type) {
521 if (HasRequestInProgress()) { 518 DCHECK_EQ(request_type_, NO_REQUEST);
522 pending_requests_.push(base::Bind(&WalletClient::MakeWalletRequest,
523 base::Unretained(this),
524 url,
525 post_body,
526 mime_type,
527 request_type));
528 return;
529 }
530
531 DCHECK_EQ(request_type_, NO_PENDING_REQUEST);
532 request_type_ = request_type; 519 request_type_ = request_type;
533 520
534 request_.reset(net::URLFetcher::Create( 521 request_.reset(net::URLFetcher::Create(
535 0, url, net::URLFetcher::POST, this)); 522 0, url, net::URLFetcher::POST, this));
536 request_->SetRequestContext(context_getter_.get()); 523 request_->SetRequestContext(context_getter_.get());
537 DVLOG(1) << "Making request to " << url << " with post_body=" << post_body; 524 DVLOG(1) << "Making request to " << url << " with post_body=" << post_body;
538 request_->SetUploadData(mime_type, post_body); 525 request_->SetUploadData(mime_type, post_body);
539 request_->AddExtraRequestHeader("Authorization: GoogleLogin auth=" + 526 request_->AddExtraRequestHeader("Authorization: GoogleLogin auth=" +
540 delegate_->GetWalletCookieValue()); 527 delegate_->GetWalletCookieValue());
541 DVLOG(1) << "Setting authorization header value to " 528 DVLOG(1) << "Setting authorization header value to "
(...skipping 14 matching lines...) Expand all
556 RequestTypeToUmaMetric(request_type_), 543 RequestTypeToUmaMetric(request_type_),
557 base::Time::Now() - request_started_timestamp_); 544 base::Time::Now() - request_started_timestamp_);
558 545
559 DCHECK_EQ(source, request_.get()); 546 DCHECK_EQ(source, request_.get());
560 DVLOG(1) << "Got response from " << source->GetOriginalURL(); 547 DVLOG(1) << "Got response from " << source->GetOriginalURL();
561 548
562 // |request_|, which is aliased to |source|, might continue to be used in this 549 // |request_|, which is aliased to |source|, might continue to be used in this
563 // |method, but should be freed once control leaves the method. 550 // |method, but should be freed once control leaves the method.
564 scoped_ptr<net::URLFetcher> scoped_request(request_.Pass()); 551 scoped_ptr<net::URLFetcher> scoped_request(request_.Pass());
565 552
566 // Prepare to start the next pending request. This is queued up as an
567 // asynchronous message because |this| WalletClient instance can be destroyed
568 // before the end of the method in response to the current incoming request.
569 base::MessageLoop::current()->PostTask(
570 FROM_HERE,
571 base::Bind(&WalletClient::StartNextPendingRequest,
572 weak_ptr_factory_.GetWeakPtr()));;
573
574 std::string data; 553 std::string data;
575 source->GetResponseAsString(&data); 554 source->GetResponseAsString(&data);
576 DVLOG(1) << "Response body: " << data; 555 DVLOG(1) << "Response body: " << data;
577 556
578 scoped_ptr<base::DictionaryValue> response_dict; 557 scoped_ptr<base::DictionaryValue> response_dict;
579 558
580 int response_code = source->GetResponseCode(); 559 int response_code = source->GetResponseCode();
581 delegate_->GetMetricLogger().LogWalletResponseCode(response_code); 560 delegate_->GetMetricLogger().LogWalletResponseCode(response_code);
582 561
583 switch (response_code) { 562 switch (response_code) {
584 // HTTP_BAD_REQUEST means the arguments are invalid. No point retrying. 563 // HTTP_BAD_REQUEST means the arguments are invalid. No point retrying.
585 case net::HTTP_BAD_REQUEST: { 564 case net::HTTP_BAD_REQUEST: {
586 request_type_ = NO_PENDING_REQUEST; 565 request_type_ = NO_REQUEST;
587 HandleWalletError(BAD_REQUEST); 566 HandleWalletError(BAD_REQUEST);
588 return; 567 return;
589 } 568 }
590 // HTTP_OK holds a valid response and HTTP_INTERNAL_SERVER_ERROR holds an 569 // HTTP_OK holds a valid response and HTTP_INTERNAL_SERVER_ERROR holds an
591 // error code and message for the user. 570 // error code and message for the user.
592 case net::HTTP_OK: 571 case net::HTTP_OK:
593 case net::HTTP_INTERNAL_SERVER_ERROR: { 572 case net::HTTP_INTERNAL_SERVER_ERROR: {
594 scoped_ptr<base::Value> message_value(base::JSONReader::Read(data)); 573 scoped_ptr<base::Value> message_value(base::JSONReader::Read(data));
595 if (message_value.get() && 574 if (message_value.get() &&
596 message_value->IsType(base::Value::TYPE_DICTIONARY)) { 575 message_value->IsType(base::Value::TYPE_DICTIONARY)) {
597 response_dict.reset( 576 response_dict.reset(
598 static_cast<base::DictionaryValue*>(message_value.release())); 577 static_cast<base::DictionaryValue*>(message_value.release()));
599 } 578 }
600 if (response_code == net::HTTP_INTERNAL_SERVER_ERROR) { 579 if (response_code == net::HTTP_INTERNAL_SERVER_ERROR) {
601 request_type_ = NO_PENDING_REQUEST; 580 request_type_ = NO_REQUEST;
602 581
603 std::string error_type_string; 582 std::string error_type_string;
604 if (!response_dict->GetString(kErrorTypeKey, &error_type_string)) { 583 if (!response_dict->GetString(kErrorTypeKey, &error_type_string)) {
605 HandleWalletError(UNKNOWN_ERROR); 584 HandleWalletError(UNKNOWN_ERROR);
606 return; 585 return;
607 } 586 }
608 WalletClient::ErrorType error_type = 587 WalletClient::ErrorType error_type =
609 StringToErrorType(error_type_string); 588 StringToErrorType(error_type_string);
610 if (error_type == BUYER_ACCOUNT_ERROR) { 589 if (error_type == BUYER_ACCOUNT_ERROR) {
611 // If the error_type is |BUYER_ACCOUNT_ERROR|, then 590 // If the error_type is |BUYER_ACCOUNT_ERROR|, then
612 // message_type_for_buyer field contains more specific information 591 // message_type_for_buyer field contains more specific information
613 // about the error. 592 // about the error.
614 std::string message_type_for_buyer_string; 593 std::string message_type_for_buyer_string;
615 if (response_dict->GetString(kMessageTypeForBuyerKey, 594 if (response_dict->GetString(kMessageTypeForBuyerKey,
616 &message_type_for_buyer_string)) { 595 &message_type_for_buyer_string)) {
617 error_type = BuyerErrorStringToErrorType( 596 error_type = BuyerErrorStringToErrorType(
618 message_type_for_buyer_string); 597 message_type_for_buyer_string);
619 } 598 }
620 } 599 }
621 600
622 HandleWalletError(error_type); 601 HandleWalletError(error_type);
623 return; 602 return;
624 } 603 }
625 break; 604 break;
626 } 605 }
627 606
628 // Anything else is an error. 607 // Anything else is an error.
629 default: 608 default:
630 request_type_ = NO_PENDING_REQUEST; 609 request_type_ = NO_REQUEST;
631 HandleWalletError(NETWORK_ERROR); 610 HandleWalletError(NETWORK_ERROR);
632 return; 611 return;
633 } 612 }
634 613
635 RequestType type = request_type_; 614 RequestType type = request_type_;
636 request_type_ = NO_PENDING_REQUEST; 615 request_type_ = NO_REQUEST;
637 616
638 if (type != ACCEPT_LEGAL_DOCUMENTS && !response_dict) { 617 if (type != ACCEPT_LEGAL_DOCUMENTS && !response_dict) {
639 HandleMalformedResponse(type, scoped_request.get()); 618 HandleMalformedResponse(type, scoped_request.get());
640 return; 619 return;
641 } 620 }
642 621
643 switch (type) { 622 switch (type) {
644 case ACCEPT_LEGAL_DOCUMENTS: 623 case ACCEPT_LEGAL_DOCUMENTS:
645 delegate_->OnDidAcceptLegalDocuments(); 624 delegate_->OnDidAcceptLegalDocuments();
646 break; 625 break;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 } else { 680 } else {
702 LogRequiredActions(required_actions); 681 LogRequiredActions(required_actions);
703 delegate_->OnDidSaveToWallet(instrument_id, 682 delegate_->OnDidSaveToWallet(instrument_id,
704 shipping_address_id, 683 shipping_address_id,
705 required_actions, 684 required_actions,
706 form_errors); 685 form_errors);
707 } 686 }
708 break; 687 break;
709 } 688 }
710 689
711 case NO_PENDING_REQUEST: 690 case NO_REQUEST:
712 NOTREACHED(); 691 NOTREACHED();
713 } 692 }
714 } 693 }
715 694
716 void WalletClient::StartNextPendingRequest() {
717 if (pending_requests_.empty())
718 return;
719
720 base::Closure next_request = pending_requests_.front();
721 pending_requests_.pop();
722 next_request.Run();
723 }
724
725 void WalletClient::HandleMalformedResponse(RequestType request_type, 695 void WalletClient::HandleMalformedResponse(RequestType request_type,
726 net::URLFetcher* request) { 696 net::URLFetcher* request) {
727 // Called to inform exponential backoff logic of the error. 697 // Called to inform exponential backoff logic of the error.
728 request->ReceivedContentWasMalformed(); 698 request->ReceivedContentWasMalformed();
729 // Record failed API call in metrics. 699 // Record failed API call in metrics.
730 delegate_->GetMetricLogger().LogWalletMalformedResponseMetric( 700 delegate_->GetMetricLogger().LogWalletMalformedResponseMetric(
731 RequestTypeToUmaMetric(request_type)); 701 RequestTypeToUmaMetric(request_type));
732 HandleWalletError(MALFORMED_RESPONSE); 702 HandleWalletError(MALFORMED_RESPONSE);
733 } 703 }
734 704
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
795 case ACCEPT_LEGAL_DOCUMENTS: 765 case ACCEPT_LEGAL_DOCUMENTS:
796 return AutofillMetrics::ACCEPT_LEGAL_DOCUMENTS; 766 return AutofillMetrics::ACCEPT_LEGAL_DOCUMENTS;
797 case AUTHENTICATE_INSTRUMENT: 767 case AUTHENTICATE_INSTRUMENT:
798 return AutofillMetrics::AUTHENTICATE_INSTRUMENT; 768 return AutofillMetrics::AUTHENTICATE_INSTRUMENT;
799 case GET_FULL_WALLET: 769 case GET_FULL_WALLET:
800 return AutofillMetrics::GET_FULL_WALLET; 770 return AutofillMetrics::GET_FULL_WALLET;
801 case GET_WALLET_ITEMS: 771 case GET_WALLET_ITEMS:
802 return AutofillMetrics::GET_WALLET_ITEMS; 772 return AutofillMetrics::GET_WALLET_ITEMS;
803 case SAVE_TO_WALLET: 773 case SAVE_TO_WALLET:
804 return AutofillMetrics::SAVE_TO_WALLET; 774 return AutofillMetrics::SAVE_TO_WALLET;
805 case NO_PENDING_REQUEST: 775 case NO_REQUEST:
806 NOTREACHED(); 776 NOTREACHED();
807 return AutofillMetrics::UNKNOWN_API_CALL; 777 return AutofillMetrics::UNKNOWN_API_CALL;
808 } 778 }
809 779
810 NOTREACHED(); 780 NOTREACHED();
811 return AutofillMetrics::UNKNOWN_API_CALL; 781 return AutofillMetrics::UNKNOWN_API_CALL;
812 } 782 }
813 783
814 } // namespace wallet 784 } // namespace wallet
815 } // namespace autofill 785 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698