]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #2751 from bdunogier/2.2-guzzle_subscribers_improvement
authorJérémy Benoist <j0k3r@users.noreply.github.com>
Tue, 9 May 2017 15:10:03 +0000 (17:10 +0200)
committerGitHub <noreply@github.com>
Tue, 9 May 2017 15:10:03 +0000 (17:10 +0200)
Improved Guzzle subscribers extensibility

src/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilder.php
src/Wallabag/CoreBundle/Helper/HttpClientFactory.php
src/Wallabag/CoreBundle/Resources/config/services.yml
tests/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilderTest.php

index 6d4129e8063216ecd3ee97981bd43df3c047ad41..1c866f17e47eb6f228028caef5293b7dbee76039 100644 (file)
@@ -54,7 +54,7 @@ class GrabySiteConfigBuilder implements SiteConfigBuilder
             'loginUri' => $config->login_uri ?: null,
             'usernameField' => $config->login_username_field ?: null,
             'passwordField' => $config->login_password_field ?: null,
-            'extraFields' => is_array($config->login_extra_fields) ? $config->login_extra_fields : [],
+            'extraFields' => $this->processExtraFields($config->login_extra_fields),
             'notLoggedInXpath' => $config->not_logged_in_xpath ?: null,
         ];
 
@@ -65,4 +65,30 @@ class GrabySiteConfigBuilder implements SiteConfigBuilder
 
         return new SiteConfig($parameters);
     }
+
+    /**
+     * Processes login_extra_fields config, transforming an '=' separated array of strings
+     * into a key/value array.
+     *
+     * @param array|mixed $extraFieldsStrings
+     *
+     * @return array
+     */
+    protected function processExtraFields($extraFieldsStrings)
+    {
+        if (!is_array($extraFieldsStrings)) {
+            return [];
+        }
+
+        $extraFields = [];
+        foreach ($extraFieldsStrings as $extraField) {
+            if (strpos($extraField, '=') === false) {
+                continue;
+            }
+            list($fieldName, $fieldValue) = explode('=', $extraField, 2);
+            $extraFields[$fieldName] = $fieldValue;
+        }
+
+        return $extraFields;
+    }
 }
index 1ac8feb17b5c0aadb9c7744acca171d0eb47c9af..11ef26d83b78c7f74ed68a440a2fbdd2c6de3b7e 100644 (file)
@@ -13,8 +13,8 @@ use Psr\Log\LoggerInterface;
  */
 class HttpClientFactory
 {
-    /** @var \GuzzleHttp\Event\SubscriberInterface */
-    private $authenticatorSubscriber;
+    /** @var [\GuzzleHttp\Event\SubscriberInterface] */
+    private $subscribers = [];
 
     /** @var \GuzzleHttp\Cookie\CookieJar */
     private $cookieJar;
@@ -25,14 +25,12 @@ class HttpClientFactory
     /**
      * HttpClientFactory constructor.
      *
-     * @param \GuzzleHttp\Event\SubscriberInterface $authenticatorSubscriber
-     * @param \GuzzleHttp\Cookie\CookieJar          $cookieJar
-     * @param string                                $restrictedAccess        this param is a kind of boolean. Values: 0 or 1
-     * @param LoggerInterface                       $logger
+     * @param \GuzzleHttp\Cookie\CookieJar $cookieJar
+     * @param string                       $restrictedAccess This param is a kind of boolean. Values: 0 or 1
+     * @param LoggerInterface              $logger
      */
-    public function __construct(SubscriberInterface $authenticatorSubscriber, CookieJar $cookieJar, $restrictedAccess, LoggerInterface $logger)
+    public function __construct(CookieJar $cookieJar, $restrictedAccess, LoggerInterface $logger)
     {
-        $this->authenticatorSubscriber = $authenticatorSubscriber;
         $this->cookieJar = $cookieJar;
         $this->restrictedAccess = $restrictedAccess;
         $this->logger = $logger;
@@ -53,8 +51,20 @@ class HttpClientFactory
         $this->cookieJar->clear();
         // need to set the (shared) cookie jar
         $client = new Client(['handler' => new SafeCurlHandler(), 'defaults' => ['cookies' => $this->cookieJar]]);
-        $client->getEmitter()->attach($this->authenticatorSubscriber);
+        foreach ($this->subscribers as $subscriber) {
+            $client->getEmitter()->attach($subscriber);
+        }
 
         return $client;
     }
+
+    /**
+     * Adds a subscriber to the HTTP client.
+     *
+     * @param SubscriberInterface $subscriber
+     */
+    public function addSubscriber(SubscriberInterface $subscriber)
+    {
+        $this->subscribers[] = $subscriber;
+    }
 }
index bccb2e19ac122172f0ca8e4167c850dac6772c3e..68f900a1f58392289e8688f021aa9bcf2465f68c 100644 (file)
@@ -71,10 +71,11 @@ services:
     wallabag_core.guzzle.http_client_factory:
         class: Wallabag\CoreBundle\Helper\HttpClientFactory
         arguments:
-            - "@bd_guzzle_site_authenticator.authenticator_subscriber"
             - "@wallabag_core.guzzle.cookie_jar"
             - '@=service(''craue_config'').get(''restricted_access'')'
             - '@logger'
+        calls:
+            - ["addSubscriber", ["@bd_guzzle_site_authenticator.authenticator_subscriber"]]
 
     wallabag_core.guzzle.cookie_jar:
         class: GuzzleHttp\Cookie\FileCookieJar
index aee6725965b9fae7da198d18419e2710b541b563..8341b11f468aedafd429bd44c78c309c22b0081c 100644 (file)
@@ -24,7 +24,7 @@ class GrabySiteConfigBuilderTest extends PHPUnit_Framework_TestCase
         $grabySiteConfig->login_uri = 'http://example.com/login';
         $grabySiteConfig->login_username_field = 'login';
         $grabySiteConfig->login_password_field = 'password';
-        $grabySiteConfig->login_extra_fields = ['field' => 'value'];
+        $grabySiteConfig->login_extra_fields = ['field=value'];
         $grabySiteConfig->not_logged_in_xpath = '//div[@class="need-login"]';
 
         $grabyConfigBuilderMock