Skip to content

Commit 6b13ad5

Browse files
authored
[PHP] - Add range HTTP code support (#20992)
* [PHP] - Add range HTTP code support * Adding response body to 200 * Fix diff; update php-nextgen sample * Working on unit tests * Removes dangling files * Finalize tests * Remove dangling files * Add tests for no response body exception
1 parent 5f41acf commit 6b13ad5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+11122
-6510
lines changed

modules/openapi-generator/src/main/resources/php-nextgen/api.mustache

+74-56
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ use GuzzleHttp\Psr7\MultipartStream;
2626
use GuzzleHttp\Psr7\Request;
2727
use GuzzleHttp\RequestOptions;
2828
use GuzzleHttp\Promise\PromiseInterface;
29+
use Psr\Http\Message\RequestInterface;
30+
use Psr\Http\Message\ResponseInterface;
2931
use {{invokerPackage}}\ApiException;
3032
use {{invokerPackage}}\Configuration;
3133
use {{invokerPackage}}\HeaderSelector;
@@ -289,42 +291,28 @@ use {{invokerPackage}}\ObjectSerializer;
289291
{{#returnType}}
290292
{{#responses}}
291293
{{#-first}}
292-
293294
switch($statusCode) {
294295
{{/-first}}
295296
{{#dataType}}
296297
{{^isRange}}{{^isWildcard}}case {{code}}:{{/isWildcard}}{{#isWildcard}}default:{{/isWildcard}}
297-
if (in_array('{{{dataType}}}', ['\SplFileObject', '\Psr\Http\Message\StreamInterface'])) {
298-
$content = $response->getBody(); //stream goes to serializer
299-
} else {
300-
$content = (string) $response->getBody();
301-
if ('{{{dataType}}}' !== 'string') {
302-
try {
303-
$content = json_decode($content, false, 512, JSON_THROW_ON_ERROR);
304-
} catch (\JsonException $exception) {
305-
throw new ApiException(
306-
sprintf(
307-
'Error JSON decoding server response (%s)',
308-
$request->getUri()
309-
),
310-
$statusCode,
311-
$response->getHeaders(),
312-
$content
313-
);
314-
}
315-
}
316-
}
317-
318-
return [
319-
ObjectSerializer::deserialize($content, '{{{dataType}}}', []),
320-
$response->getStatusCode(),
321-
$response->getHeaders()
322-
];{{/isRange}}
298+
return $this->handleResponseWithDataType(
299+
'{{{dataType}}}',
300+
$request,
301+
$response,
302+
);{{/isRange}}
323303
{{/dataType}}
324304
{{#-last}}
325305
}
326306
{{/-last}}
327307
{{/responses}}
308+
{{#responses}}{{#dataType}}{{#isRange}}{{^isWildcard}}
309+
if ($this->responseWithinRangeCode('{{code}}', $statusCode)) {
310+
return $this->handleResponseWithDataType(
311+
'{{{dataType}}}',
312+
$request,
313+
$response,
314+
);
315+
}{{/isWildcard}}{{/isRange}}{{/dataType}}{{/responses}}
328316

329317
if ($statusCode < 200 || $statusCode > 299) {
330318
throw new ApiException(
@@ -339,39 +327,16 @@ use {{invokerPackage}}\ObjectSerializer;
339327
);
340328
}
341329

342-
$returnType = '{{{returnType}}}';
343-
if (in_array($returnType, ['\SplFileObject', '\Psr\Http\Message\StreamInterface'])) {
344-
$content = $response->getBody(); //stream goes to serializer
345-
} else {
346-
$content = (string) $response->getBody();
347-
if ($returnType !== 'string') {
348-
try {
349-
$content = json_decode($content, false, 512, JSON_THROW_ON_ERROR);
350-
} catch (\JsonException $exception) {
351-
throw new ApiException(
352-
sprintf(
353-
'Error JSON decoding server response (%s)',
354-
$request->getUri()
355-
),
356-
$statusCode,
357-
$response->getHeaders(),
358-
$content
359-
);
360-
}
361-
}
362-
}
363-
364-
return [
365-
ObjectSerializer::deserialize($content, $returnType, []),
366-
$response->getStatusCode(),
367-
$response->getHeaders()
368-
];
330+
return $this->handleResponseWithDataType(
331+
'{{{returnType}}}',
332+
$request,
333+
$response,
334+
);
369335
{{/returnType}}
370336
{{^returnType}}
371337

372338
return [null, $statusCode, $response->getHeaders()];
373339
{{/returnType}}
374-
375340
} catch (ApiException $e) {
376341
switch ($e->getCode()) {
377342
{{#responses}}
@@ -383,10 +348,20 @@ use {{invokerPackage}}\ObjectSerializer;
383348
$e->getResponseHeaders()
384349
);
385350
$e->setResponseObject($data);
386-
break;{{/isRange}}
351+
throw $e;{{/isRange}}
387352
{{/dataType}}
388353
{{/responses}}
389354
}
355+
{{#responses}}{{#dataType}}{{#isRange}}{{^isWildcard}}
356+
if ($this->responseWithinRangeCode('{{code}}', $e->getCode())) {
357+
$data = ObjectSerializer::deserialize(
358+
$e->getResponseBody(),
359+
'{{{dataType}}}',
360+
$e->getResponseHeaders()
361+
);
362+
$e->setResponseObject($data);
363+
throw $e;
364+
}{{/isWildcard}}{{/isRange}}{{/dataType}}{{/responses}}
390365
throw $e;
391366
}
392367
}
@@ -938,5 +913,48 @@ use {{invokerPackage}}\ObjectSerializer;
938913

939914
return $options;
940915
}
916+
917+
private function handleResponseWithDataType(
918+
string $dataType,
919+
RequestInterface $request,
920+
ResponseInterface $response,
921+
): array {
922+
if (in_array($dataType, ['\SplFileObject', '\Psr\Http\Message\StreamInterface'])) {
923+
$content = $response->getBody(); //stream goes to serializer
924+
} else {
925+
$content = (string) $response->getBody();
926+
if ($dataType !== 'string') {
927+
try {
928+
$content = json_decode($content, false, 512, JSON_THROW_ON_ERROR);
929+
} catch (\JsonException $exception) {
930+
throw new ApiException(
931+
sprintf(
932+
'Error JSON decoding server response (%s)',
933+
$request->getUri()
934+
),
935+
$response->getStatusCode(),
936+
$response->getHeaders(),
937+
$content
938+
);
939+
}
940+
}
941+
}
942+
943+
return [
944+
ObjectSerializer::deserialize($content, $dataType, []),
945+
$response->getStatusCode(),
946+
$response->getHeaders()
947+
];
948+
}
949+
950+
private function responseWithinRangeCode(
951+
string $rangeCode,
952+
int $statusCode,
953+
): bool {
954+
$left = (int) ($rangeCode[0].'00');
955+
$right = (int) ($rangeCode[0].'99');
956+
957+
return $statusCode >= $left && $statusCode <= $right;
958+
}
941959
}
942960
{{/operations}}

modules/openapi-generator/src/main/resources/php/api.mustache

+75-55
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ use GuzzleHttp\Exception\RequestException;
2525
use GuzzleHttp\Psr7\MultipartStream;
2626
use GuzzleHttp\Psr7\Request;
2727
use GuzzleHttp\RequestOptions;
28+
use Psr\Http\Message\RequestInterface;
29+
use Psr\Http\Message\ResponseInterface;
2830
use {{invokerPackage}}\ApiException;
2931
use {{invokerPackage}}\Configuration;
3032
use {{invokerPackage}}\HeaderSelector;
@@ -262,38 +264,25 @@ use {{invokerPackage}}\ObjectSerializer;
262264
{{/-first}}
263265
{{#dataType}}
264266
{{^isRange}}{{^isWildcard}}case {{code}}:{{/isWildcard}}{{#isWildcard}}default:{{/isWildcard}}
265-
if ('{{{dataType}}}' === '\SplFileObject') {
266-
$content = $response->getBody(); //stream goes to serializer
267-
} else {
268-
$content = (string) $response->getBody();
269-
if ('{{{dataType}}}' !== 'string') {
270-
try {
271-
$content = json_decode($content, false, 512, JSON_THROW_ON_ERROR);
272-
} catch (\JsonException $exception) {
273-
throw new ApiException(
274-
sprintf(
275-
'Error JSON decoding server response (%s)',
276-
$request->getUri()
277-
),
278-
$statusCode,
279-
$response->getHeaders(),
280-
$content
281-
);
282-
}
283-
}
284-
}
285-
286-
return [
287-
ObjectSerializer::deserialize($content, '{{{dataType}}}', []),
288-
$response->getStatusCode(),
289-
$response->getHeaders()
290-
];{{/isRange}}
267+
return $this->handleResponseWithDataType(
268+
'{{{dataType}}}',
269+
$request,
270+
$response,
271+
);{{/isRange}}
291272
{{/dataType}}
292273
{{#-last}}
293274
}
294275
{{/-last}}
295276
{{/responses}}
296277

278+
{{#responses}}{{#dataType}}{{#isRange}}{{^isWildcard}}if ($this->responseWithinRangeCode('{{code}}', $statusCode)) {
279+
return $this->handleResponseWithDataType(
280+
'{{{dataType}}}',
281+
$request,
282+
$response,
283+
);
284+
}{{/isWildcard}}{{/isRange}}{{/dataType}}{{/responses}}
285+
297286
if ($statusCode < 200 || $statusCode > 299) {
298287
throw new ApiException(
299288
sprintf(
@@ -307,39 +296,16 @@ use {{invokerPackage}}\ObjectSerializer;
307296
);
308297
}
309298

310-
$returnType = '{{{returnType}}}';
311-
if ($returnType === '\SplFileObject') {
312-
$content = $response->getBody(); //stream goes to serializer
313-
} else {
314-
$content = (string) $response->getBody();
315-
if ($returnType !== 'string') {
316-
try {
317-
$content = json_decode($content, false, 512, JSON_THROW_ON_ERROR);
318-
} catch (\JsonException $exception) {
319-
throw new ApiException(
320-
sprintf(
321-
'Error JSON decoding server response (%s)',
322-
$request->getUri()
323-
),
324-
$statusCode,
325-
$response->getHeaders(),
326-
$content
327-
);
328-
}
329-
}
330-
}
331-
332-
return [
333-
ObjectSerializer::deserialize($content, $returnType, []),
334-
$response->getStatusCode(),
335-
$response->getHeaders()
336-
];
299+
return $this->handleResponseWithDataType(
300+
'{{{returnType}}}',
301+
$request,
302+
$response,
303+
);
337304
{{/returnType}}
338305
{{^returnType}}
339306

340307
return [null, $statusCode, $response->getHeaders()];
341308
{{/returnType}}
342-
343309
} catch (ApiException $e) {
344310
switch ($e->getCode()) {
345311
{{#responses}}
@@ -351,10 +317,21 @@ use {{invokerPackage}}\ObjectSerializer;
351317
$e->getResponseHeaders()
352318
);
353319
$e->setResponseObject($data);
354-
break;{{/isRange}}
320+
throw $e;{{/isRange}}
355321
{{/dataType}}
356322
{{/responses}}
357323
}
324+
{{#responses}}{{#dataType}}{{#isRange}}{{^isWildcard}}
325+
if ($this->responseWithinRangeCode('{{code}}', $e->getCode())) {
326+
$data = ObjectSerializer::deserialize(
327+
$e->getResponseBody(),
328+
'{{{dataType}}}',
329+
$e->getResponseHeaders()
330+
);
331+
$e->setResponseObject($data);
332+
throw $e;
333+
}{{/isWildcard}}{{/isRange}}{{/dataType}}{{/responses}}
334+
358335
throw $e;
359336
}
360337
}
@@ -859,5 +836,48 @@ use {{invokerPackage}}\ObjectSerializer;
859836

860837
return $options;
861838
}
839+
840+
private function handleResponseWithDataType(
841+
string $dataType,
842+
RequestInterface $request,
843+
ResponseInterface $response
844+
): array {
845+
if ($dataType === '\SplFileObject') {
846+
$content = $response->getBody(); //stream goes to serializer
847+
} else {
848+
$content = (string) $response->getBody();
849+
if ($dataType !== 'string') {
850+
try {
851+
$content = json_decode($content, false, 512, JSON_THROW_ON_ERROR);
852+
} catch (\JsonException $exception) {
853+
throw new ApiException(
854+
sprintf(
855+
'Error JSON decoding server response (%s)',
856+
$request->getUri()
857+
),
858+
$response->getStatusCode(),
859+
$response->getHeaders(),
860+
$content
861+
);
862+
}
863+
}
864+
}
865+
866+
return [
867+
ObjectSerializer::deserialize($content, $dataType, []),
868+
$response->getStatusCode(),
869+
$response->getHeaders()
870+
];
871+
}
872+
873+
private function responseWithinRangeCode(
874+
string $rangeCode,
875+
int $statusCode
876+
): bool {
877+
$left = (int) ($rangeCode[0].'00');
878+
$right = (int) ($rangeCode[0].'99');
879+
880+
return $statusCode >= $left && $statusCode <= $right;
881+
}
862882
}
863883
{{/operations}}

0 commit comments

Comments
 (0)