diff --git a/src/HttpCache/EventListener/AddHeadersListener.php b/src/HttpCache/EventListener/AddHeadersListener.php index d1d5bfbfd3a..d7da237c6d4 100644 --- a/src/HttpCache/EventListener/AddHeadersListener.php +++ b/src/HttpCache/EventListener/AddHeadersListener.php @@ -13,7 +13,7 @@ namespace ApiPlatform\HttpCache\EventListener; -use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface; +//use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface; use ApiPlatform\Util\RequestAttributesExtractor; use Symfony\Component\HttpKernel\Event\ResponseEvent; @@ -31,18 +31,16 @@ final class AddHeadersListener private $sharedMaxAge; private $vary; private $public; - private $resourceMetadataFactory; private $staleWhileRevalidate; private $staleIfError; - public function __construct(bool $etag = false, int $maxAge = null, int $sharedMaxAge = null, array $vary = null, bool $public = null, ResourceMetadataFactoryInterface $resourceMetadataFactory = null, int $staleWhileRevalidate = null, int $staleIfError = null) + public function __construct(bool $etag = false, int $maxAge = null, int $sharedMaxAge = null, array $vary = null, bool $public = null, int $staleWhileRevalidate = null, int $staleIfError = null) { $this->etag = $etag; $this->maxAge = $maxAge; $this->sharedMaxAge = $sharedMaxAge; $this->vary = $vary; $this->public = $public; - $this->resourceMetadataFactory = $resourceMetadataFactory; $this->staleWhileRevalidate = $staleWhileRevalidate; $this->staleIfError = $staleIfError; } @@ -65,14 +63,7 @@ public function onKernelResponse(ResponseEvent $event): void return; } - $resourceCacheHeaders = []; - - if ($this->resourceMetadataFactory) { - $resourceMetadata = $this->resourceMetadataFactory->create($attributes['resource_class']); - $resourceCacheHeaders = $resourceMetadata->getOperationAttribute($attributes, 'cache_headers', [], true); - } else { - $resourceCacheHeaders = $attributes['cache_headers'] ?? []; - } + $resourceCacheHeaders = $attributes['cache_headers'] ?? []; if ($this->etag && !$response->getEtag()) { $response->setEtag(md5((string) $response->getContent())); diff --git a/src/Symfony/Bundle/Resources/config/http_cache.xml b/src/Symfony/Bundle/Resources/config/http_cache.xml index 9c7ddd21bf1..c2bea69a9cd 100644 --- a/src/Symfony/Bundle/Resources/config/http_cache.xml +++ b/src/Symfony/Bundle/Resources/config/http_cache.xml @@ -11,7 +11,6 @@ %api_platform.http_cache.shared_max_age% %api_platform.http_cache.vary% %api_platform.http_cache.public% - null diff --git a/src/Util/AttributesExtractor.php b/src/Util/AttributesExtractor.php index 6225c7fc170..7d9bf27687a 100644 --- a/src/Util/AttributesExtractor.php +++ b/src/Util/AttributesExtractor.php @@ -37,27 +37,14 @@ public static function extractAttributes(array $attributes): array $result['subresource_context'] = $subresourceContext; } - // // Normalizing identifiers tuples - // // TODO: 3.0 remove - // $identifiers = []; - // foreach (($attributes['_api_identifiers'] ?? ['id']) as $parameterName => $identifiedBy) { - // if (\is_string($identifiedBy)) { - // $identifiers[$identifiedBy] = [$result['resource_class'], $identifiedBy]; - // } else { - // $identifiers[$parameterName] = $identifiedBy; - // } - // } - // - // $result['identifiers'] = $identifiers; - if (null === $result['resource_class']) { return []; } $hasRequestAttributeKey = false; - if (isset($attributes['_api_operation_name'])) { + if (isset($attributes['_api_item_operation_name'])) { $hasRequestAttributeKey = true; - $result['operation_name'] = $attributes['_api_operation_name']; + $result['operation_name'] = $attributes['_api_item_operation_name']; } if (isset($attributes['_api_operation'])) { $result['operation'] = $attributes['_api_operation']; diff --git a/tests/HttpCache/EventListener/AddHeadersListenerTest.php b/tests/HttpCache/EventListener/AddHeadersListenerTest.php index e2807f27d8d..a2b557e7b52 100644 --- a/tests/HttpCache/EventListener/AddHeadersListenerTest.php +++ b/tests/HttpCache/EventListener/AddHeadersListenerTest.php @@ -13,8 +13,6 @@ namespace ApiPlatform\Tests\HttpCache\EventListener; -use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface; -use ApiPlatform\Core\Metadata\Resource\ResourceMetadata; use ApiPlatform\HttpCache\EventListener\AddHeadersListener; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\Dummy; use ApiPlatform\Tests\ProphecyTrait; @@ -108,10 +106,7 @@ public function testAddHeaders() $response ); - $factory = $this->prophesize(ResourceMetadataFactoryInterface::class); - $factory->create(Dummy::class)->willReturn(new ResourceMetadata())->shouldBeCalled(); - - $listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, $factory->reveal(), 15, 30); + $listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, 15, 30); $listener->onKernelResponse($event); $this->assertSame('"9893532233caff98cd083a116b013c0b"', $response->getEtag()); @@ -134,143 +129,11 @@ public function testDoNotSetHeaderWhenAlreadySet() $response ); - $factory = $this->prophesize(ResourceMetadataFactoryInterface::class); - $factory->create(Dummy::class)->willReturn(new ResourceMetadata())->shouldBeCalled(); - - $listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, $factory->reveal(), 15, 30); + $listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, 15, 30); $listener->onKernelResponse($event); $this->assertSame('"etag"', $response->getEtag()); $this->assertSame('max-age=300, public, s-maxage=400, stale-if-error=30, stale-while-revalidate=15', $response->headers->get('Cache-Control')); $this->assertSame(['Accept', 'Cookie', 'Accept-Encoding'], $response->getVary()); } - - public function testSetHeadersFromResourceMetadata() - { - $response = new Response('some content', 200, ['Vary' => ['Accept', 'Cookie']]); - $event = new ResponseEvent( - $this->prophesize(HttpKernelInterface::class)->reveal(), - new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']), - \defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST, - $response - ); - - $metadata = new ResourceMetadata(null, null, null, null, null, ['cache_headers' => ['max_age' => 123, 'shared_max_age' => 456, 'stale_while_revalidate' => 928, 'stale_if_error' => 70, 'vary' => ['Vary-1', 'Vary-2']]]); - $factory = $this->prophesize(ResourceMetadataFactoryInterface::class); - $factory->create(Dummy::class)->willReturn($metadata)->shouldBeCalled(); - - $listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], true, $factory->reveal(), 15, 30); - $listener->onKernelResponse($event); - - $this->assertSame('max-age=123, public, s-maxage=456, stale-if-error=70, stale-while-revalidate=928', $response->headers->get('Cache-Control')); - $this->assertSame(['Accept', 'Cookie', 'Vary-1', 'Vary-2'], $response->getVary()); - } - - public function testSetHeadersFromResourceMetadataMarkedAsPrivate() - { - $response = new Response('some content', 200); - $event = new ResponseEvent( - $this->prophesize(HttpKernelInterface::class)->reveal(), - new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']), - \defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST, - $response - ); - - $metadata = new ResourceMetadata(null, null, null, null, null, [ - 'cache_headers' => [ - 'max_age' => 123, - 'public' => false, - 'shared_max_age' => 456, - ], - ]); - $factory = $this->prophesize(ResourceMetadataFactoryInterface::class); - $factory->create(Dummy::class)->willReturn($metadata)->shouldBeCalled(); - - $listener = new AddHeadersListener(true, 100, 200, [], true, $factory->reveal()); - $listener->onKernelResponse($event); - - $this->assertSame('max-age=123, private', $response->headers->get('Cache-Control')); - - // resource's cache marked as private must not contain s-maxage - $this->assertStringNotContainsString('s-maxage', $response->headers->get('Cache-Control')); - } - - public function testSetHeadersFromResourceMetadataMarkedAsPublic() - { - $response = new Response('some content', 200); - $event = new ResponseEvent( - $this->prophesize(HttpKernelInterface::class)->reveal(), - new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']), - \defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST, - $response - ); - - $metadata = new ResourceMetadata(null, null, null, null, null, [ - 'cache_headers' => [ - 'max_age' => 123, - 'public' => true, - 'shared_max_age' => 456, - ], - ]); - $factory = $this->prophesize(ResourceMetadataFactoryInterface::class); - $factory->create(Dummy::class)->willReturn($metadata)->shouldBeCalled(); - - $listener = new AddHeadersListener(true, 100, 200, [], true, $factory->reveal()); - $listener->onKernelResponse($event); - - $this->assertSame('max-age=123, public, s-maxage=456', $response->headers->get('Cache-Control')); - } - - public function testSetHeadersFromResourceMetadataWithNoPrivacy() - { - $response = new Response('some content', 200); - $event = new ResponseEvent( - $this->prophesize(HttpKernelInterface::class)->reveal(), - new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']), - \defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST, - $response - ); - - $metadata = new ResourceMetadata(null, null, null, null, null, [ - 'cache_headers' => [ - 'max_age' => 123, - 'shared_max_age' => 456, - ], - ]); - $factory = $this->prophesize(ResourceMetadataFactoryInterface::class); - $factory->create(Dummy::class)->willReturn($metadata)->shouldBeCalled(); - - $listener = new AddHeadersListener(true, 100, 200, [], true, $factory->reveal()); - $listener->onKernelResponse($event); - - $this->assertSame('max-age=123, public, s-maxage=456', $response->headers->get('Cache-Control')); - } - - public function testSetHeadersFromResourceMetadataWithNoPrivacyDefaultsPrivate() - { - $response = new Response('some content', 200); - $event = new ResponseEvent( - $this->prophesize(HttpKernelInterface::class)->reveal(), - new Request([], [], ['_api_resource_class' => Dummy::class, '_api_item_operation_name' => 'get']), - \defined(HttpKernelInterface::class.'::MAIN_REQUEST') ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::MASTER_REQUEST, - $response - ); - - $metadata = new ResourceMetadata(null, null, null, null, null, [ - 'cache_headers' => [ - 'max_age' => 123, - 'shared_max_age' => 456, - ], - ]); - $factory = $this->prophesize(ResourceMetadataFactoryInterface::class); - $factory->create(Dummy::class)->willReturn($metadata)->shouldBeCalled(); - - $listener = new AddHeadersListener(true, 100, 200, ['Accept', 'Accept-Encoding'], false, $factory->reveal()); - $listener->onKernelResponse($event); - - $this->assertSame('max-age=123, private', $response->headers->get('Cache-Control')); - - // resource's cache marked as private must not contain s-maxage - $this->assertStringNotContainsString('s-maxage', $response->headers->get('Cache-Control')); - } }