diff --git a/.ddev/web-build/Dockerfile.maven b/.ddev/web-build/Dockerfile.maven new file mode 100644 index 000000000000..60a15dbc2b3a --- /dev/null +++ b/.ddev/web-build/Dockerfile.maven @@ -0,0 +1 @@ +RUN apt update && apt install -y maven diff --git a/modules/openapi-generator/src/main/resources/php/HeaderSelector.mustache b/modules/openapi-generator/src/main/resources/php/HeaderSelector.mustache index 1921b061015c..ad2a00ea7c27 100644 --- a/modules/openapi-generator/src/main/resources/php/HeaderSelector.mustache +++ b/modules/openapi-generator/src/main/resources/php/HeaderSelector.mustache @@ -76,7 +76,7 @@ class HeaderSelector } # If none of the available Accept headers is of type "json", then just use all them - $headersWithJson = preg_grep('~(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$~', $accept); + $headersWithJson = $this->selectJsonMimeList($accept); if (count($headersWithJson) === 0) { return implode(',', $accept); } @@ -86,6 +86,34 @@ class HeaderSelector return $this->getAcceptHeaderWithAdjustedWeight($accept, $headersWithJson); } + /** + * Detects whether a string contains a valid JSON mime type + * + * @param string $searchString + * @return bool + */ + public function isJsonMime(string $searchString): bool + { + return preg_match('~^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)~', $searchString) === 1; + } + + /** + * Select all items from a list containing a JSON mime type + * + * @param array $mimeList + * @return array + */ + private function selectJsonMimeList(array $mimeList): array { + $jsonMimeList = []; + foreach ($mimeList as $mime) { + if($this->isJsonMime($mime)) { + $jsonMimeList[] = $mime; + } + } + return $jsonMimeList; + } + + /** * Create an Accept header string from the given "Accept" headers array, recalculating all weights * diff --git a/modules/openapi-generator/src/main/resources/php/libraries/psr-18/api.mustache b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/api.mustache index 6138ab176608..8321b1d6072b 100644 --- a/modules/openapi-generator/src/main/resources/php/libraries/psr-18/api.mustache +++ b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/api.mustache @@ -613,7 +613,7 @@ use function sprintf; // for model (json/xml) {{#bodyParams}} if (isset(${{paramName}})) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization(${{paramName}})); } else { $httpBody = ${{paramName}}; @@ -637,7 +637,7 @@ use function sprintf; // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { diff --git a/samples/client/petstore/php/OpenAPIClient-php/lib/HeaderSelector.php b/samples/client/petstore/php/OpenAPIClient-php/lib/HeaderSelector.php index 027e82a879b6..1ddbf2c26f53 100644 --- a/samples/client/petstore/php/OpenAPIClient-php/lib/HeaderSelector.php +++ b/samples/client/petstore/php/OpenAPIClient-php/lib/HeaderSelector.php @@ -85,7 +85,7 @@ private function selectAcceptHeader(array $accept): ?string } # If none of the available Accept headers is of type "json", then just use all them - $headersWithJson = preg_grep('~(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$~', $accept); + $headersWithJson = $this->selectJsonMimeList($accept); if (count($headersWithJson) === 0) { return implode(',', $accept); } @@ -95,6 +95,34 @@ private function selectAcceptHeader(array $accept): ?string return $this->getAcceptHeaderWithAdjustedWeight($accept, $headersWithJson); } + /** + * Detects whether a string contains a valid JSON mime type + * + * @param string $searchString + * @return bool + */ + public function isJsonMime(string $searchString): bool + { + return preg_match('~^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)~', $searchString) === 1; + } + + /** + * Select all items from a list containing a JSON mime type + * + * @param array $mimeList + * @return array + */ + private function selectJsonMimeList(array $mimeList): array { + $jsonMimeList = []; + foreach ($mimeList as $mime) { + if($this->isJsonMime($mime)) { + $jsonMimeList[] = $mime; + } + } + return $jsonMimeList; + } + + /** * Create an Accept header string from the given "Accept" headers array, recalculating all weights * diff --git a/samples/client/petstore/php/psr-18/lib/Api/AnotherFakeApi.php b/samples/client/petstore/php/psr-18/lib/Api/AnotherFakeApi.php index 54c36208acae..bdd194c1cac2 100644 --- a/samples/client/petstore/php/psr-18/lib/Api/AnotherFakeApi.php +++ b/samples/client/petstore/php/psr-18/lib/Api/AnotherFakeApi.php @@ -376,7 +376,7 @@ public function call123TestSpecialTagsRequest($client) // for model (json/xml) if (isset($client)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($client)); } else { $httpBody = $client; @@ -396,7 +396,7 @@ public function call123TestSpecialTagsRequest($client) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { diff --git a/samples/client/petstore/php/psr-18/lib/Api/DefaultApi.php b/samples/client/petstore/php/psr-18/lib/Api/DefaultApi.php index 9cfc3dd22e75..0a6d73bd7f3d 100644 --- a/samples/client/petstore/php/psr-18/lib/Api/DefaultApi.php +++ b/samples/client/petstore/php/psr-18/lib/Api/DefaultApi.php @@ -371,7 +371,7 @@ public function fooGetRequest() // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { diff --git a/samples/client/petstore/php/psr-18/lib/Api/FakeApi.php b/samples/client/petstore/php/psr-18/lib/Api/FakeApi.php index a868ced9cf54..67f1e40d98fa 100644 --- a/samples/client/petstore/php/psr-18/lib/Api/FakeApi.php +++ b/samples/client/petstore/php/psr-18/lib/Api/FakeApi.php @@ -371,7 +371,7 @@ public function fakeBigDecimalMapRequest() // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -606,7 +606,7 @@ public function fakeHealthGetRequest() // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -818,7 +818,7 @@ public function fakeHttpSignatureTestRequest($pet, $query_1 = null, $header_1 = // for model (json/xml) if (isset($pet)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($pet)); } else { $httpBody = $pet; @@ -838,7 +838,7 @@ public function fakeHttpSignatureTestRequest($pet, $query_1 = null, $header_1 = // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1056,7 +1056,7 @@ public function fakeOuterBooleanSerializeRequest($body = null) // for model (json/xml) if (isset($body)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($body)); } else { $httpBody = $body; @@ -1076,7 +1076,7 @@ public function fakeOuterBooleanSerializeRequest($body = null) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1294,7 +1294,7 @@ public function fakeOuterCompositeSerializeRequest($outer_composite = null) // for model (json/xml) if (isset($outer_composite)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($outer_composite)); } else { $httpBody = $outer_composite; @@ -1314,7 +1314,7 @@ public function fakeOuterCompositeSerializeRequest($outer_composite = null) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1532,7 +1532,7 @@ public function fakeOuterNumberSerializeRequest($body = null) // for model (json/xml) if (isset($body)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($body)); } else { $httpBody = $body; @@ -1552,7 +1552,7 @@ public function fakeOuterNumberSerializeRequest($body = null) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1770,7 +1770,7 @@ public function fakeOuterStringSerializeRequest($body = null) // for model (json/xml) if (isset($body)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($body)); } else { $httpBody = $body; @@ -1790,7 +1790,7 @@ public function fakeOuterStringSerializeRequest($body = null) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -2014,7 +2014,7 @@ public function fakePropertyEnumIntegerSerializeRequest($outer_object_with_enum_ // for model (json/xml) if (isset($outer_object_with_enum_property)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($outer_object_with_enum_property)); } else { $httpBody = $outer_object_with_enum_property; @@ -2034,7 +2034,7 @@ public function fakePropertyEnumIntegerSerializeRequest($outer_object_with_enum_ // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -2313,7 +2313,7 @@ public function getParameterNameMappingRequest($underscore_type, $type, $type_wi // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -2500,7 +2500,7 @@ public function testAdditionalPropertiesReferenceRequest($request_body) // for model (json/xml) if (isset($request_body)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($request_body)); } else { $httpBody = $request_body; @@ -2520,7 +2520,7 @@ public function testAdditionalPropertiesReferenceRequest($request_body) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -2699,7 +2699,7 @@ public function testBodyWithBinaryRequest($body) // for model (json/xml) if (isset($body)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($body)); } else { $httpBody = $body; @@ -2719,7 +2719,7 @@ public function testBodyWithBinaryRequest($body) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -2898,7 +2898,7 @@ public function testBodyWithFileSchemaRequest($file_schema_test_class) // for model (json/xml) if (isset($file_schema_test_class)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($file_schema_test_class)); } else { $httpBody = $file_schema_test_class; @@ -2918,7 +2918,7 @@ public function testBodyWithFileSchemaRequest($file_schema_test_class) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -3119,7 +3119,7 @@ public function testBodyWithQueryParamsRequest($query, $user) // for model (json/xml) if (isset($user)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($user)); } else { $httpBody = $user; @@ -3139,7 +3139,7 @@ public function testBodyWithQueryParamsRequest($query, $user) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -3371,7 +3371,7 @@ public function testClientModelRequest($client) // for model (json/xml) if (isset($client)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($client)); } else { $httpBody = $client; @@ -3391,7 +3391,7 @@ public function testClientModelRequest($client) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -3786,7 +3786,7 @@ public function testEndpointParametersRequest($number, $double, $pattern_without // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -4099,7 +4099,7 @@ public function testEnumParametersRequest($enum_header_string_array = null, $enu // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -4407,7 +4407,7 @@ public function testGroupParametersRequest($associative_array) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -4598,7 +4598,7 @@ public function testInlineAdditionalPropertiesRequest($request_body) // for model (json/xml) if (isset($request_body)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($request_body)); } else { $httpBody = $request_body; @@ -4618,7 +4618,7 @@ public function testInlineAdditionalPropertiesRequest($request_body) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -4805,7 +4805,7 @@ public function testInlineFreeformAdditionalPropertiesRequest($test_inline_freef // for model (json/xml) if (isset($test_inline_freeform_additional_properties_request)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($test_inline_freeform_additional_properties_request)); } else { $httpBody = $test_inline_freeform_additional_properties_request; @@ -4825,7 +4825,7 @@ public function testInlineFreeformAdditionalPropertiesRequest($test_inline_freef // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -5045,7 +5045,7 @@ public function testJsonFormDataRequest($param, $param2) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -5359,7 +5359,7 @@ public function testQueryParameterCollectionFormatRequest($pipe, $ioutil, $http, // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -5546,7 +5546,7 @@ public function testStringMapReferenceRequest($request_body) // for model (json/xml) if (isset($request_body)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($request_body)); } else { $httpBody = $request_body; @@ -5566,7 +5566,7 @@ public function testStringMapReferenceRequest($request_body) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { diff --git a/samples/client/petstore/php/psr-18/lib/Api/FakeClassnameTags123Api.php b/samples/client/petstore/php/psr-18/lib/Api/FakeClassnameTags123Api.php index 58953b65e466..9c4d80eb7f9b 100644 --- a/samples/client/petstore/php/psr-18/lib/Api/FakeClassnameTags123Api.php +++ b/samples/client/petstore/php/psr-18/lib/Api/FakeClassnameTags123Api.php @@ -376,7 +376,7 @@ public function testClassnameRequest($client) // for model (json/xml) if (isset($client)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($client)); } else { $httpBody = $client; @@ -396,7 +396,7 @@ public function testClassnameRequest($client) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { diff --git a/samples/client/petstore/php/psr-18/lib/Api/PetApi.php b/samples/client/petstore/php/psr-18/lib/Api/PetApi.php index 4bd148dfdc29..3a6228ecdacf 100644 --- a/samples/client/petstore/php/psr-18/lib/Api/PetApi.php +++ b/samples/client/petstore/php/psr-18/lib/Api/PetApi.php @@ -356,7 +356,7 @@ public function addPetRequest($pet) // for model (json/xml) if (isset($pet)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($pet)); } else { $httpBody = $pet; @@ -376,7 +376,7 @@ public function addPetRequest($pet) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -602,7 +602,7 @@ public function deletePetRequest($pet_id, $api_key = null) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -859,7 +859,7 @@ public function findPetsByStatusRequest($status) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1117,7 +1117,7 @@ public function findPetsByTagsRequest($tags) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1375,7 +1375,7 @@ public function getPetByIdRequest($pet_id) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1592,7 +1592,7 @@ public function updatePetRequest($pet) // for model (json/xml) if (isset($pet)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($pet)); } else { $httpBody = $pet; @@ -1612,7 +1612,7 @@ public function updatePetRequest($pet) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1847,7 +1847,7 @@ public function updatePetWithFormRequest($pet_id, $name = null, $status = null) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -2131,7 +2131,7 @@ public function uploadFileRequest($pet_id, $additional_metadata = null, $file = // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -2421,7 +2421,7 @@ public function uploadFileWithRequiredFileRequest($pet_id, $required_file, $addi // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { diff --git a/samples/client/petstore/php/psr-18/lib/Api/StoreApi.php b/samples/client/petstore/php/psr-18/lib/Api/StoreApi.php index 49b02997d16a..1788c5430ec0 100644 --- a/samples/client/petstore/php/psr-18/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/psr-18/lib/Api/StoreApi.php @@ -353,7 +353,7 @@ public function deleteOrderRequest($order_id) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -588,7 +588,7 @@ public function getInventoryRequest() // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -854,7 +854,7 @@ public function getOrderByIdRequest($order_id) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1086,7 +1086,7 @@ public function placeOrderRequest($order) // for model (json/xml) if (isset($order)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($order)); } else { $httpBody = $order; @@ -1106,7 +1106,7 @@ public function placeOrderRequest($order) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { diff --git a/samples/client/petstore/php/psr-18/lib/Api/UserApi.php b/samples/client/petstore/php/psr-18/lib/Api/UserApi.php index 12bff75ef018..7b27e57c518e 100644 --- a/samples/client/petstore/php/psr-18/lib/Api/UserApi.php +++ b/samples/client/petstore/php/psr-18/lib/Api/UserApi.php @@ -331,7 +331,7 @@ public function createUserRequest($user) // for model (json/xml) if (isset($user)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($user)); } else { $httpBody = $user; @@ -351,7 +351,7 @@ public function createUserRequest($user) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -538,7 +538,7 @@ public function createUsersWithArrayInputRequest($user) // for model (json/xml) if (isset($user)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($user)); } else { $httpBody = $user; @@ -558,7 +558,7 @@ public function createUsersWithArrayInputRequest($user) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -745,7 +745,7 @@ public function createUsersWithListInputRequest($user) // for model (json/xml) if (isset($user)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($user)); } else { $httpBody = $user; @@ -765,7 +765,7 @@ public function createUsersWithListInputRequest($user) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -974,7 +974,7 @@ public function deleteUserRequest($username) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1228,7 +1228,7 @@ public function getUserByNameRequest($username) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1507,7 +1507,7 @@ public function loginUserRequest($username, $password) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1697,7 +1697,7 @@ public function logoutUserRequest() // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { @@ -1903,7 +1903,7 @@ public function updateUserRequest($username, $user) // for model (json/xml) if (isset($user)) { - if ($headers['Content-Type'] === 'application/json') { + if ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($user)); } else { $httpBody = $user; @@ -1923,7 +1923,7 @@ public function updateUserRequest($username, $user) // for HTTP post (form) $httpBody = new MultipartStream($multipartContents); - } elseif ($headers['Content-Type'] === 'application/json') { + } elseif ($this->headerSelector->isJsonMime($headers['Content-Type'])) { $httpBody = json_encode($formParams); } else { diff --git a/samples/client/petstore/php/psr-18/lib/HeaderSelector.php b/samples/client/petstore/php/psr-18/lib/HeaderSelector.php index 027e82a879b6..1ddbf2c26f53 100644 --- a/samples/client/petstore/php/psr-18/lib/HeaderSelector.php +++ b/samples/client/petstore/php/psr-18/lib/HeaderSelector.php @@ -85,7 +85,7 @@ private function selectAcceptHeader(array $accept): ?string } # If none of the available Accept headers is of type "json", then just use all them - $headersWithJson = preg_grep('~(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$~', $accept); + $headersWithJson = $this->selectJsonMimeList($accept); if (count($headersWithJson) === 0) { return implode(',', $accept); } @@ -95,6 +95,34 @@ private function selectAcceptHeader(array $accept): ?string return $this->getAcceptHeaderWithAdjustedWeight($accept, $headersWithJson); } + /** + * Detects whether a string contains a valid JSON mime type + * + * @param string $searchString + * @return bool + */ + public function isJsonMime(string $searchString): bool + { + return preg_match('~^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)~', $searchString) === 1; + } + + /** + * Select all items from a list containing a JSON mime type + * + * @param array $mimeList + * @return array + */ + private function selectJsonMimeList(array $mimeList): array { + $jsonMimeList = []; + foreach ($mimeList as $mime) { + if($this->isJsonMime($mime)) { + $jsonMimeList[] = $mime; + } + } + return $jsonMimeList; + } + + /** * Create an Accept header string from the given "Accept" headers array, recalculating all weights *