|
10 | 10 | use Symfony\Component\HttpFoundation\Request; |
11 | 11 | use Symfony\Component\HttpFoundation\Response; |
12 | 12 | use Symfony\Component\Routing\Attribute\Route; |
| 13 | +use Symfony\Contracts\Cache\CacheInterface; |
| 14 | +use Symfony\Contracts\Cache\ItemInterface; |
13 | 15 | use Symfony\Contracts\HttpClient\HttpClientInterface; |
14 | 16 |
|
15 | 17 | #[Route(defaults: ['_routeScope' => ['api']])] |
16 | 18 | class MediaProxyController extends AbstractController |
17 | 19 | { |
18 | 20 | public function __construct( |
19 | 21 | private HttpClientInterface $client, |
| 22 | + private CacheInterface $cache, |
20 | 23 | ) { |
21 | 24 | } |
22 | 25 |
|
@@ -49,13 +52,26 @@ public function execute(Request $request): Response |
49 | 52 | return $this->malformedRequestError(); |
50 | 53 | } |
51 | 54 |
|
52 | | - $response = $this->client->request('GET', $url); |
| 55 | + $response = $this->cache->get($url, function (ItemInterface $item) use ($url): array { |
| 56 | + $response = $this->client->request('GET', $url); |
| 57 | + $statusCode = $response->getStatusCode(); |
53 | 58 |
|
54 | | - if (Response::HTTP_OK !== $response->getStatusCode()) { |
55 | | - return new Response(status: $response->getStatusCode()); |
| 59 | + if (Response::HTTP_OK !== $statusCode) { |
| 60 | + // do not cache error / not found responses |
| 61 | + $item->expiresAfter(0); |
| 62 | + } |
| 63 | + |
| 64 | + return [ |
| 65 | + 'statusCode' => $statusCode, |
| 66 | + 'content' => $response->getContent(false), |
| 67 | + ]; |
| 68 | + }); |
| 69 | + |
| 70 | + if (Response::HTTP_OK !== $response['statusCode']) { |
| 71 | + new Response(status: $response['statusCode']); |
56 | 72 | } |
57 | 73 |
|
58 | | - return new Response($response->getContent()); |
| 74 | + return new Response($response['content']); |
59 | 75 | } |
60 | 76 |
|
61 | 77 | protected function malformedRequestError(): Response |
|
0 commit comments