Ejegg has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/345790 )

Change subject: WIP cache directory lookup 404s
......................................................................

WIP cache directory lookup 404s

These are legitimate responses in REST-ese. Don't failmail when
someone tries to pay with iDEAL in an unsupported currency.
We should still route them elsewhere in the frontend, tho!

TODO: test with 404

Bug: T161072
Change-Id: I28a1bc71ffc7a8982b686028ab53a558032de3c7
---
M Core/Http/HttpStatusValidator.php
M PaymentProviders/Ingenico/Api.php
M PaymentProviders/Ingenico/ApiException.php
M PaymentProviders/Ingenico/BankPaymentProvider.php
A PaymentProviders/Ingenico/RestResponseValidator.php
M SmashPig.yaml
6 files changed, 51 insertions(+), 12 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/wikimedia/fundraising/SmashPig 
refs/changes/90/345790/1

diff --git a/Core/Http/HttpStatusValidator.php 
b/Core/Http/HttpStatusValidator.php
index a36230b..68c6859 100644
--- a/Core/Http/HttpStatusValidator.php
+++ b/Core/Http/HttpStatusValidator.php
@@ -12,16 +12,13 @@
        public function shouldRetry( $parsedResponse ) {
 
                $statusCode = $parsedResponse['status'];
+               if ( array_search( $statusCode, $this->getSuccessCodes() ) !== 
false ) {
+                       Logger::debug( "Successful request" );
+                       return false;
+               }
                $body = $parsedResponse['body'];
 
                switch ( $statusCode ) {
-                       case 200:   // Everything is AWESOME
-                       case 201:   // Also fine, and we created a thing
-                               $continue = false;
-
-                               Logger::debug( "Successful request" );
-                               break;
-
                        case 400:   // Oh noes! Bad request.. BAD CODE, BAD BAD 
CODE!
                                $continue = false;
                                Logger::error( "Request returned (400) BAD 
REQUEST: $body" );
@@ -39,4 +36,11 @@
                }
                return $continue;
        }
+
+       protected function getSuccessCodes() {
+               return array(
+                       200, // Everything is AWESOME
+                       201  // Also fine, and we created a thing
+               );
+       }
 }
diff --git a/PaymentProviders/Ingenico/Api.php 
b/PaymentProviders/Ingenico/Api.php
index 5da77bb..3a7f0cc 100644
--- a/PaymentProviders/Ingenico/Api.php
+++ b/PaymentProviders/Ingenico/Api.php
@@ -84,7 +84,9 @@
                                $messages[] = "Error code {$error['code']}: 
{$error['message']}.";
                        }
                        $concatenated = implode( ' ', $messages );
-                       throw new ApiException( $concatenated );
+                       $ex = new ApiException( $concatenated );
+                       $ex->setRawErrors( $decoded['errors'] );
+                       throw $ex;
                }
        }
 }
diff --git a/PaymentProviders/Ingenico/ApiException.php 
b/PaymentProviders/Ingenico/ApiException.php
index 44af1fc..3f3ed73 100644
--- a/PaymentProviders/Ingenico/ApiException.php
+++ b/PaymentProviders/Ingenico/ApiException.php
@@ -6,4 +6,13 @@
 
 class ApiException extends SmashPigException {
 
+       protected $rawErrors;
+
+       public function setRawErrors( $errors ) {
+               $this->rawErrors = $errors;
+       }
+
+       public function getRawErrors() {
+               return $this->rawErrors;
+       }
 }
diff --git a/PaymentProviders/Ingenico/BankPaymentProvider.php 
b/PaymentProviders/Ingenico/BankPaymentProvider.php
index 87c034d..5a479ce 100644
--- a/PaymentProviders/Ingenico/BankPaymentProvider.php
+++ b/PaymentProviders/Ingenico/BankPaymentProvider.php
@@ -50,12 +50,21 @@
                                'currencyCode' => $currency
                        );
                        $path = "products/$productId/directory";
-                       $response = $this->api->makeApiCall( $path, 'GET', 
$query );
-
                        $banks = array();
 
-                       foreach ( $response['entries'] as $entry ) {
-                               $banks[$entry['issuerId']] = 
$entry['issuerName'];
+                       try {
+                               $response = $this->api->makeApiCall( $path, 
'GET', $query );
+
+                               foreach ( $response['entries'] as $entry ) {
+                                       $banks[$entry['issuerId']] = 
$entry['issuerName'];
+                               }
+                       } catch ( ApiException $ex ) {
+                               $errors = $ex->getRawErrors();
+                               if ( empty( $errors ) || 
$errors[0]['httpStatusCode'] !== 404 ) {
+                                       throw $ex;
+                               }
+                               // If there is a single 404 error, that means 
there is no directory info for
+                               // the country/currency/product. That's 
legitimate, so cache the empty array
                        }
                        $duration = $this->cacheParameters['duration'];
                        $cacheItem->set( array(
diff --git a/PaymentProviders/Ingenico/RestResponseValidator.php 
b/PaymentProviders/Ingenico/RestResponseValidator.php
new file mode 100644
index 0000000..0a74d33
--- /dev/null
+++ b/PaymentProviders/Ingenico/RestResponseValidator.php
@@ -0,0 +1,12 @@
+<?php
+namespace SmashPig\PaymentProviders\Ingenico;
+
+use SmashPig\Core\Http\HttpStatusValidator;
+
+class RestResponseValidator extends HttpStatusValidator {
+       protected function getSuccessCodes() {
+               $codes = parent::getSuccessCodes();
+               $codes[] = '404'; // also a valid response in REST-ese
+               return $codes;
+       }
+}
diff --git a/SmashPig.yaml b/SmashPig.yaml
index 19e2f1b..ac7159b 100644
--- a/SmashPig.yaml
+++ b/SmashPig.yaml
@@ -477,6 +477,9 @@
                     key: SMASHPIG_IDEAL_BANK_STATUS
                 availability-url: 
https://availability.ideal.nl/api/api/GetIssuers
 
+    curl:
+        validator:
+            class: SmashPig\PaymentProviders\Ingenico\RestResponseValidator
 
 # deprecated, delete when projects using SmashPig rename adaptors
 globalcollect:

-- 
To view, visit https://gerrit.wikimedia.org/r/345790
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I28a1bc71ffc7a8982b686028ab53a558032de3c7
Gerrit-PatchSet: 1
Gerrit-Project: wikimedia/fundraising/SmashPig
Gerrit-Branch: master
Gerrit-Owner: Ejegg <eeggles...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to