Skip to content

Commit 00c0f24

Browse files
Stephan Wentzpl-github
authored andcommitted
fix: Allow array query parameters
1 parent 3299251 commit 00c0f24

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

src/HttpClientMock/RealRequestFactory.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Riverline\MultiPartParser\StreamedPart;
99

1010
use function array_key_exists;
11+
use function array_merge;
1112
use function assert;
1213
use function explode;
1314
use function is_array;
@@ -19,6 +20,8 @@
1920
use function Safe\preg_match;
2021
use function Safe\rewind;
2122
use function str_contains;
23+
use function str_ends_with;
24+
use function str_replace;
2225
use function strpos;
2326
use function strtolower;
2427
use function substr;
@@ -157,7 +160,18 @@ private function parseEncodedParams(string $encodedParams): array
157160
$value = '';
158161
}
159162

160-
$params[urldecode((string) $key)] = urldecode((string) $value);
163+
$key = urldecode($key);
164+
$value = urldecode($value);
165+
166+
if (str_ends_with($key, '[]')) {
167+
$key = str_replace('[]', '', $key);
168+
$value = array_merge(
169+
$params[$key] ?? [],
170+
[$value],
171+
);
172+
}
173+
174+
$params[$key] = $value;
161175
}
162176

163177
return $params;

tests/HttpClientMock/RealRequestFactoryTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,26 @@ public function testBuildsRequestWithoutBody(): void
3232
self::assertSame(['foo' => 'bar'], $request->getJson());
3333
}
3434

35+
public function testBuildsRequestWithMultipleQueryParams(): void
36+
{
37+
$options = ['query_params' => ['name' => ['abc', 'def']]];
38+
$request = ($this->realRequestFactory)('POST', 'https://service.com', $options);
39+
40+
self::assertSame('POST', $request->getMethod());
41+
self::assertSame('https://service.com', $request->getUri());
42+
self::assertSame(['name' => ['abc', 'def']], $request->getQueryParams());
43+
}
44+
45+
public function testBuildsRequestWithMultipleQueryParamsInUri(): void
46+
{
47+
$options = [];
48+
$request = ($this->realRequestFactory)('POST', 'https://service.com?name[]=abc&name[]=def', $options);
49+
50+
self::assertSame('POST', $request->getMethod());
51+
self::assertSame('https://service.com', $request->getUri());
52+
self::assertSame(['name' => ['abc', 'def']], $request->getQueryParams());
53+
}
54+
3555
public function testBuildsRequestWithJsonInBody(): void
3656
{
3757
$options = [

0 commit comments

Comments
 (0)