diff --git a/src/State/Provider/ContentNegotiationProvider.php b/src/State/Provider/ContentNegotiationProvider.php index d9f242ce85e..2f842fdf831 100644 --- a/src/State/Provider/ContentNegotiationProvider.php +++ b/src/State/Provider/ContentNegotiationProvider.php @@ -67,7 +67,9 @@ public function provide(Operation $operation, array $uriVariables = [], array $c private function addRequestFormats(Request $request, array $formats): void { foreach ($formats as $format => $mimeTypes) { - $request->setFormat($format, (array) $mimeTypes); + $existingMimeTypes = $request->getMimeTypes($format); + $newMimeTypes = array_unique(array_merge((array) $mimeTypes, $existingMimeTypes)); + $request->setFormat($format, $newMimeTypes); } } diff --git a/tests/State/Provider/ContentNegotiationProviderTest.php b/tests/State/Provider/ContentNegotiationProviderTest.php index dd610bd4b8d..9094bac7949 100644 --- a/tests/State/Provider/ContentNegotiationProviderTest.php +++ b/tests/State/Provider/ContentNegotiationProviderTest.php @@ -27,6 +27,23 @@ class ContentNegotiationProviderTest extends TestCase { use ProphecyTrait; + public function testAddRequestFormatsAddsMimeTypesToFormat(): void + { + $provider = new ContentNegotiationProvider(); + $request = new Request(); + $formats = ['json' => ['application/problem+json']]; + + $operation = new Post(outputFormats: $formats); + $context = ['request' => $request]; + + $provider->provide($operation, [], $context); + + $mimeTypes = $request->getMimeTypes('json'); + + $this->assertContains('application/problem+json', $mimeTypes); + $this->assertContains('application/json', $mimeTypes); + } + public function testRequestWithEmptyContentType(): void { $expectedResult = new \stdClass();