Skip to content

Commit 8727ddc

Browse files
authored
fix(php): make requestOptions match other clients (#497)
1 parent 1b8eeec commit 8727ddc

File tree

6 files changed

+50
-107
lines changed

6 files changed

+50
-107
lines changed

clients/algoliasearch-client-javascript/packages/client-common/src/transporter/createTransporter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,13 +240,13 @@ export function createTransporter({
240240
cacheable: baseRequestOptions?.cacheable,
241241
timeout: baseRequestOptions?.timeout,
242242
queryParameters: {
243-
...baseRequestOptions?.queryParameters,
244243
...methodOptions.queryParameters,
244+
...baseRequestOptions?.queryParameters,
245245
},
246246
headers: {
247247
Accept: 'application/json',
248-
...baseRequestOptions?.headers,
249248
...methodOptions.headers,
249+
...baseRequestOptions?.headers,
250250
},
251251
};
252252

clients/algoliasearch-client-php/lib/RequestOptions/RequestOptions.php

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ final class RequestOptions
88
{
99
private $headers = [];
1010

11-
private $query = [];
11+
private $queryParameters = [];
1212

1313
private $body = [];
1414

@@ -20,7 +20,7 @@ final class RequestOptions
2020

2121
public function __construct(array $options = [])
2222
{
23-
foreach (['headers', 'query', 'body'] as $name) {
23+
foreach (['headers', 'queryParameters', 'body'] as $name) {
2424
if (isset($options[$name]) && !empty($options[$name])) {
2525
$this->{$name} = $options[$name];
2626
}
@@ -120,15 +120,15 @@ public function setHeaders($headers)
120120
*/
121121
public function getQueryParameters()
122122
{
123-
return $this->query;
123+
return $this->queryParameters;
124124
}
125125

126126
/**
127127
* @return string URL-encoded query string
128128
*/
129129
public function getBuiltQueryParameters()
130130
{
131-
return Helpers::buildQuery($this->query);
131+
return Helpers::buildQuery($this->queryParameters);
132132
}
133133

134134
/**
@@ -141,7 +141,7 @@ public function getBuiltQueryParameters()
141141
*/
142142
public function addQueryParameter($name, $value)
143143
{
144-
$this->query[$name] = $value;
144+
$this->queryParameters[$name] = $value;
145145

146146
return $this;
147147
}
@@ -156,7 +156,10 @@ public function addQueryParameter($name, $value)
156156
*/
157157
public function addQueryParameters($parameters)
158158
{
159-
$this->query = array_merge($this->query, $parameters);
159+
$this->queryParameters = array_merge(
160+
$this->queryParameters,
161+
$parameters
162+
);
160163

161164
return $this;
162165
}
@@ -171,8 +174,8 @@ public function addQueryParameters($parameters)
171174
*/
172175
public function addDefaultQueryParameter($name, $value)
173176
{
174-
if (!isset($this->query[$name])) {
175-
$this->query[$name] = $value;
177+
if (!isset($this->queryParameters[$name])) {
178+
$this->queryParameters[$name] = $value;
176179
}
177180

178181
return $this;
@@ -203,7 +206,7 @@ public function addDefaultQueryParameters($queryParameters)
203206
*/
204207
public function setQueryParameters($queryParameters)
205208
{
206-
$this->query = $queryParameters;
209+
$this->queryParameters = $queryParameters;
207210

208211
return $this;
209212
}

clients/algoliasearch-client-php/lib/RequestOptions/RequestOptionsFactory.php

Lines changed: 10 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ final class RequestOptionsFactory
99
{
1010
private $config;
1111

12-
private $validHeaders = ['Content-type', 'User-Agent'];
13-
1412
public function __construct(Configuration $config)
1513
{
1614
$this->config = $config;
@@ -22,21 +20,14 @@ public function __construct(Configuration $config)
2220
*
2321
* @return \Algolia\AlgoliaSearch\RequestOptions\RequestOptions
2422
*/
25-
public function create($options, $defaults = [])
23+
public function create($options)
2624
{
2725
if (is_array($options)) {
28-
$options += $defaults;
29-
$options = $this->format($options);
3026
$options = $this->normalize($options);
3127

3228
$options = new RequestOptions($options);
3329
} elseif ($options instanceof RequestOptions) {
34-
$defaults = $this->create($defaults);
35-
$options->addDefaultHeaders($defaults->getHeaders());
36-
$options->addDefaultQueryParameters(
37-
$defaults->getQueryParameters()
38-
);
39-
$options->addDefaultBodyParameters($defaults->getBody());
30+
$options = $this->create($options);
4031
} else {
4132
throw new \InvalidArgumentException(
4233
'RequestOptions can only be created from array or from RequestOptions object'
@@ -46,9 +37,9 @@ public function create($options, $defaults = [])
4637
return $options->addDefaultHeaders($this->config->getDefaultHeaders());
4738
}
4839

49-
public function createBodyLess($options, $defaults = [])
40+
public function createBodyLess($options)
5041
{
51-
$options = $this->create($options, $defaults);
42+
$options = $this->create($options);
5243

5344
return $options->addQueryParameters($options->getBody())->setBody([]);
5445
}
@@ -59,31 +50,24 @@ private function normalize($options)
5950
'headers' => [
6051
'X-Algolia-Application-Id' => $this->config->getAppId(),
6152
'X-Algolia-API-Key' => $this->config->getAlgoliaApiKey(),
62-
'User-Agent' => $this->config->getUserAgent() !== null
53+
'User-Agent' =>
54+
$this->config->getUserAgent() !== null
6355
? $this->config->getUserAgent()
6456
: UserAgent::get(),
6557
'Content-Type' => 'application/json',
6658
],
67-
'query' => [],
59+
'queryParameters' => [],
6860
'body' => [],
6961
'readTimeout' => $this->config->getReadTimeout(),
7062
'writeTimeout' => $this->config->getWriteTimeout(),
7163
'connectTimeout' => $this->config->getConnectTimeout(),
7264
];
7365

7466
foreach ($options as $optionName => $value) {
75-
$type = $this->getOptionType($optionName);
76-
77-
if (
78-
in_array(
79-
$type,
80-
['readTimeout', 'writeTimeout', 'connectTimeout'],
81-
true
82-
)
83-
) {
84-
$normalized[$type] = $value;
67+
if (is_array($value)) {
68+
$normalized[$optionName] = $this->format($value);
8569
} else {
86-
$normalized[$type][$optionName] = $value;
70+
$normalized[$optionName] = $value;
8771
}
8872
}
8973

@@ -103,36 +87,6 @@ private function format($options)
10387
return $options;
10488
}
10589

106-
private function getOptionType($optionName)
107-
{
108-
if ($this->isValidHeaderName($optionName)) {
109-
return 'headers';
110-
} elseif (
111-
in_array(
112-
$optionName,
113-
['connectTimeout', 'readTimeout', 'writeTimeout'],
114-
true
115-
)
116-
) {
117-
return $optionName;
118-
}
119-
120-
return 'query';
121-
}
122-
123-
private function isValidHeaderName($name)
124-
{
125-
if (preg_match('/^X-[a-zA-Z-]+/', $name)) {
126-
return true;
127-
}
128-
129-
if (in_array($name, $this->validHeaders, true)) {
130-
return true;
131-
}
132-
133-
return false;
134-
}
135-
13690
public static function getAttributesToFormat()
13791
{
13892
return ['attributesToRetrieve', 'type'];

clients/algoliasearch-client-php/lib/RetryStrategy/ApiWrapper.php

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,21 +66,15 @@ public function __construct(
6666
}
6767
}
6868

69-
public function read(
70-
$method,
71-
$path,
72-
$requestOptions = [],
73-
$defaultRequestOptions = []
74-
) {
69+
public function read($method, $path, $requestOptions = [])
70+
{
7571
if ('GET' === mb_strtoupper($method)) {
7672
$requestOptions = $this->requestOptionsFactory->createBodyLess(
77-
$requestOptions,
78-
$defaultRequestOptions
73+
$requestOptions
7974
);
8075
} else {
8176
$requestOptions = $this->requestOptionsFactory->create(
82-
$requestOptions,
83-
$defaultRequestOptions
77+
$requestOptions
8478
);
8579
}
8680

@@ -93,23 +87,16 @@ public function read(
9387
);
9488
}
9589

96-
public function write(
97-
$method,
98-
$path,
99-
$data = [],
100-
$requestOptions = [],
101-
$defaultRequestOptions = []
102-
) {
90+
public function write($method, $path, $data = [], $requestOptions = [])
91+
{
10392
if ('DELETE' === mb_strtoupper($method)) {
10493
$requestOptions = $this->requestOptionsFactory->createBodyLess(
105-
$requestOptions,
106-
$defaultRequestOptions
94+
$requestOptions
10795
);
10896
$data = [];
10997
} else {
11098
$requestOptions = $this->requestOptionsFactory->create(
111-
$requestOptions,
112-
$defaultRequestOptions
99+
$requestOptions
113100
);
114101
}
115102

clients/algoliasearch-client-php/lib/RetryStrategy/ApiWrapperInterface.php

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,9 @@
44

55
interface ApiWrapperInterface
66
{
7-
public function read(
8-
$method,
9-
$path,
10-
$requestOptions = [],
11-
$defaultRequestOptions = []
12-
);
7+
public function read($method, $path, $requestOptions = []);
138

14-
public function write(
15-
$method,
16-
$path,
17-
$data = [],
18-
$requestOptions = [],
19-
$defaultRequestOptions = []
20-
);
9+
public function write($method, $path, $data = [], $requestOptions = []);
2110

2211
public function send($method, $path, $requestOptions = [], $hosts = null);
2312
}

templates/php/api.mustache

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ use {{invokerPackage}}\RetryStrategy\ClusterHosts;
139139
* @see {{{dataType}}}
140140
{{/isModel}}
141141
{{/allParams}}
142-
* @param array $requestOptions Request Options
142+
* @param array $requestOptions The requestOptions to send along with the query, they will be merged with the transporter requestOptions.
143143
*
144144
* @return {{#returnType}}{{#responses}}{{#dataType}}{{#-first}}array<string, mixed>|{{{dataType}}}{{/-first}}{{/dataType}}{{/responses}}{{/returnType}}{{^returnType}}void{{/returnType}}
145145
{{#isDeprecated}}
@@ -206,6 +206,7 @@ use {{invokerPackage}}\RetryStrategy\ClusterHosts;
206206

207207
$resourcePath = '{{{path}}}';
208208
$queryParameters = [];
209+
$headers = [];
209210
$httpBody = [];
210211
{{#vendorExtensions}}{{#queryParams}}
211212

@@ -257,7 +258,7 @@ use {{invokerPackage}}\RetryStrategy\ClusterHosts;
257258
}
258259
{{/bodyParams}}
259260
{{#headerParams}}
260-
$queryParameters['{{baseName}}'] = ${{paramName}};
261+
$headers['{{baseName}}'] = ${{paramName}};
261262
{{/headerParams}}
262263
{{#servers.0}}
263264
$operationHosts = [{{#servers}}"{{{url}}}"{{^-last}}, {{/-last}}{{/servers}}];
@@ -267,16 +268,25 @@ use {{invokerPackage}}\RetryStrategy\ClusterHosts;
267268
$operationHost = $operationHosts[$this->hostIndex];
268269

269270
{{/servers.0}}
270-
$requestOptions += $queryParameters;
271271

272-
return $this->sendRequest('{{httpMethod}}', $resourcePath, $queryParameters, $httpBody, $requestOptions);
272+
return $this->sendRequest('{{httpMethod}}', $resourcePath, $headers, $queryParameters, $httpBody, $requestOptions);
273273
}
274274

275275
{{/operation}}
276276

277-
private function sendRequest($method, $resourcePath, $queryParameters, $httpBody, $requestOptions)
277+
private function sendRequest($method, $resourcePath, $headers, $queryParameters, $httpBody, $requestOptions)
278278
{
279-
$query = \GuzzleHttp\Psr7\Query::build($queryParameters);
279+
if (!isset($requestOptions['headers'])) {
280+
$requestOptions['headers'] = [];
281+
}
282+
if (!isset($requestOptions['queryParameters'])) {
283+
$requestOptions['queryParameters'] = [];
284+
}
285+
286+
$requestOptions['headers'] = array_merge($headers, $requestOptions['headers']);
287+
$requestOptions['queryParameters'] = array_merge($queryParameters, $requestOptions['queryParameters']);
288+
289+
$query = \GuzzleHttp\Psr7\Query::build($requestOptions['queryParameters']);
280290

281291
if($method == 'GET') {
282292
$request = $this->api->read(

0 commit comments

Comments
 (0)