Skip to content

Cannot force client to cache authenticated responses using Entity cache properties #6730

Open
@nathansalter

Description

@nathansalter

API Platform version(s) affected: 2.7, 3.0

Description
The documentation is not particularly clear about this, but you cannot set the max-age property on authenticated responses. This isn't an issue with API Platform as such, it's a feature that's supplied by Symfony. Basically Symfony will override all cache headers sent to it for requests with a session, and set max-age=0, private, must-revalidate for the cache headers.

See this code snippet: https://github.com/symfony/http-kernel/blob/7.1/EventListener/AbstractSessionListener.php#L200

There are many valid cases for when you'd want Client Cache to be possible in an authenticated session, especially when working with SPAs and other Clients. You've got the s-maxage setting which is not overwritten, but that's only for people using a Cache such as Varnish.

How to reproduce
Simply add the following operation to an entity with security enabled:

        new GetCollection(
            security: 'is_granted(\'ROLE_USER\')',
            cacheHeaders: ['max_age' => 3600, 'shared_max_age' => 3600, 'public' => true, 'expires' => null],
        )

When making requests, the cache header will be:

max-age=0, must-revalidate, private, s-maxage=3600

Possible Solution
In ApiPlatform\HttpCache\EventListener\AddHeadersListener, simply set the AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER header if the max_age property is set for the operation. It seems like it should be safe to assume that in these cases the developer understands the implications of having cache set on the client.

Additional Context
I've written a shim in our codebase to add this header for certain entities, but it would be simpler to have this reflected directly from API Platform

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions