From 2bd6b44484b9f504ce4d1342ee402f32d8dd5b55 Mon Sep 17 00:00:00 2001 From: robertsaternus Date: Tue, 24 Feb 2026 13:33:46 +0100 Subject: [PATCH 1/3] INT-227: Add Query Array Normalizer middleware Add Query Array Normalizer middleware --- CHANGELOG.md | 4 ++ src/Client/ClientBuilder.php | 2 + .../Middleware/QueryArrayNormalizer.php | 45 +++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 src/Client/Middleware/QueryArrayNormalizer.php diff --git a/CHANGELOG.md b/CHANGELOG.md index ce38567..fbcd4cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ # Changelog +## Unreleased +### BREAKING +- Add QueryArrayNormalizer middleware to ClientBuilder + ## [v0.9.9] - 2024.06.06 ### Added - Add support to API key authorization diff --git a/src/Client/ClientBuilder.php b/src/Client/ClientBuilder.php index 4194b21..bf98a2b 100644 --- a/src/Client/ClientBuilder.php +++ b/src/Client/ClientBuilder.php @@ -7,6 +7,7 @@ use GuzzleHttp\HandlerStack; use Omikron\FactFinder\Communication\Client\Middleware\Authenticator; use Omikron\FactFinder\Communication\Client\Middleware\HttpErrors; +use Omikron\FactFinder\Communication\Client\Middleware\QueryArrayNormalizer; use Omikron\FactFinder\Communication\Credentials; use Omikron\FactFinder\Communication\ServerUrl; use Omikron\FactFinder\Communication\Version; @@ -57,6 +58,7 @@ public function build(): ClientInterface { $handler = HandlerStack::create(); $handler->push(new HttpErrors()); + $handler->push(new QueryArrayNormalizer()); $config = [ 'base_uri' => $this->serverUrl, diff --git a/src/Client/Middleware/QueryArrayNormalizer.php b/src/Client/Middleware/QueryArrayNormalizer.php new file mode 100644 index 0000000..b5f4889 --- /dev/null +++ b/src/Client/Middleware/QueryArrayNormalizer.php @@ -0,0 +1,45 @@ +getUri(); + $query = $uri->getQuery(); + + if (!$query) { + return $handler($request, $options); + } + + parse_str($query, $params); + + $normalized = []; + + foreach ($params as $key => $value) { + if (is_array($value)) { + foreach ($value as $v) { + $normalized[] = rawurlencode($key) . '=' . rawurlencode((string) $v); + } + } else { + $normalized[] = rawurlencode($key) . '=' . rawurlencode((string) $value); + } + } + + $newQuery = implode('&', $normalized); + + $request = $request->withUri( + $uri->withQuery($newQuery) + ); + + return $handler($request, $options); + }; + } +} \ No newline at end of file From 0035fbc2ac3d6812aaa691f6ef3539b3321e6064 Mon Sep 17 00:00:00 2001 From: robertsaternus Date: Tue, 24 Feb 2026 14:11:36 +0100 Subject: [PATCH 2/3] Fix CI --- composer.json | 2 +- src/Client/Middleware/QueryArrayNormalizer.php | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 3877141..202d8a9 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,7 @@ }, "scripts": { "test": [ - "php-cs-fixer fix --dry-run -v", + "php-cs-fixer fix -v", "phpmd src text phpmd.xml.dist", "phpspec run --format=dot" ] diff --git a/src/Client/Middleware/QueryArrayNormalizer.php b/src/Client/Middleware/QueryArrayNormalizer.php index b5f4889..48e2b84 100644 --- a/src/Client/Middleware/QueryArrayNormalizer.php +++ b/src/Client/Middleware/QueryArrayNormalizer.php @@ -12,7 +12,7 @@ public function __invoke(callable $handler) { return function (RequestInterface $request, array $options) use ($handler) { - $uri = $request->getUri(); + $uri = $request->getUri(); $query = $uri->getQuery(); if (!$query) { @@ -28,9 +28,11 @@ public function __invoke(callable $handler) foreach ($value as $v) { $normalized[] = rawurlencode($key) . '=' . rawurlencode((string) $v); } - } else { - $normalized[] = rawurlencode($key) . '=' . rawurlencode((string) $value); + + continue; } + + $normalized[] = rawurlencode($key) . '=' . rawurlencode((string) $value); } $newQuery = implode('&', $normalized); @@ -42,4 +44,4 @@ public function __invoke(callable $handler) return $handler($request, $options); }; } -} \ No newline at end of file +} From 71b00db83325e9187d7757c88fb4a6b252277b77 Mon Sep 17 00:00:00 2001 From: robertsaternus Date: Tue, 24 Feb 2026 14:15:15 +0100 Subject: [PATCH 3/3] Fix CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 431f3be..b744b39 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: run: echo "::set-output name=dir::$(composer config cache-files-dir)" - name: Load Composer cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-${{ matrix.php }}-${{ matrix.deps }}-composer