Skip to content

Commit 5b88ea7

Browse files
authored
feat(config): Make etag in cdn configurable (#102)
1 parent 4378a8c commit 5b88ea7

File tree

5 files changed

+46
-4
lines changed

5 files changed

+46
-4
lines changed

src/Controller/CdnController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public function __construct(
3737
private ?int $maxAge,
3838
private ?int $smaxAge,
3939
private ?bool $public,
40+
private ?bool $etag = null,
4041
) {
4142
}
4243

@@ -79,7 +80,7 @@ public function __invoke(Request $request, string $id, string $filename, string
7980
$response->headers->set('Content-Type', $metadata->contentType);
8081
}
8182

82-
if (null !== $metadata->etag) {
83+
if (true === $this->etag && null !== $metadata->etag) {
8384
$response->setEtag($metadata->etag);
8485
}
8586

src/DependencyInjection/Configuration.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ public function getConfigTreeBuilder(): TreeBuilder
140140
->booleanNode('public')
141141
->defaultNull()
142142
->end()
143+
->booleanNode('etag')
144+
->defaultNull()
145+
->end()
143146
->integerNode('max_age')
144147
->defaultNull()
145148
->end()

src/DependencyInjection/StoryblokExtension.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ private static function configureCdn(ContainerBuilder $container, array $config)
176176
$cdnController->setArgument('$public', $config['cdn']['cache']['public']);
177177
$cdnController->setArgument('$maxAge', $config['cdn']['cache']['max_age']);
178178
$cdnController->setArgument('$smaxAge', $config['cdn']['cache']['smax_age']);
179+
$cdnController->setArgument('$etag', $config['cdn']['cache']['etag']);
179180

180181
if ('filesystem' === $config['cdn']['storage']['type']) {
181182
// Configure filesystem storage with the provided path

tests/Unit/Controller/CdnControllerTest.php

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public function setsContentTypeHeader(): void
221221
}
222222

223223
#[Test]
224-
public function setsEtagHeader(): void
224+
public function setsEtagHeaderWhenConfigured(): void
225225
{
226226
$tempFile = $this->createTempFile('content');
227227
$file = new File($tempFile);
@@ -240,13 +240,40 @@ public function setsEtagHeader(): void
240240

241241
$downloader = self::createMock(FileDownloaderInterface::class);
242242

243-
$controller = new CdnController($storage, $downloader, null, null, null);
243+
$controller = new CdnController($storage, $downloader, null, null, null, true);
244244

245245
$response = $controller->__invoke(new Request(), 'ef7436441c4defbf', 'image', 'jpg');
246246

247247
self::assertSame('"etag-value-123"', $response->getEtag());
248248
}
249249

250+
#[Test]
251+
public function doesNotSetEtagHeaderWhenNotConfigured(): void
252+
{
253+
$tempFile = $this->createTempFile('content');
254+
$file = new File($tempFile);
255+
256+
$metadata = new CdnFileMetadata(
257+
originalUrl: 'https://a.storyblok.com/f/12345/image.jpg',
258+
contentType: 'image/jpeg',
259+
etag: '"etag-value-123"',
260+
expiresAt: new DateTimeImmutable('+1 day'),
261+
);
262+
263+
$storage = self::createMock(CdnStorageInterface::class);
264+
$storage->method('getMetadata')->willReturn($metadata);
265+
$storage->method('hasFile')->willReturn(true);
266+
$storage->method('getFile')->willReturn($file);
267+
268+
$downloader = self::createMock(FileDownloaderInterface::class);
269+
270+
$controller = new CdnController($storage, $downloader, null, null, null, null);
271+
272+
$response = $controller->__invoke(new Request(), 'ef7436441c4defbf', 'image', 'jpg');
273+
274+
self::assertNull($response->getEtag());
275+
}
276+
250277
#[Test]
251278
public function setsMaxAgeWhenConfigured(): void
252279
{
@@ -400,7 +427,7 @@ public function returns304WhenEtagMatches(): void
400427

401428
$downloader = self::createMock(FileDownloaderInterface::class);
402429

403-
$controller = new CdnController($storage, $downloader, null, null, null);
430+
$controller = new CdnController($storage, $downloader, null, null, null, true);
404431

405432
$request = new Request();
406433
$request->headers->set('If-None-Match', '"etag-value-123"');

tests/Unit/DependencyInjection/ConfigurationTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ public function values(): void
9999
],
100100
'cache' => [
101101
'public' => $cdnPublic,
102+
'etag' => null,
102103
'max_age' => $cdnMaxAge,
103104
'smax_age' => $cdnSmaxAge,
104105
],
@@ -142,6 +143,7 @@ public function defaults(): void
142143
],
143144
'cache' => [
144145
'public' => null,
146+
'etag' => null,
145147
'max_age' => null,
146148
'smax_age' => null,
147149
],
@@ -186,6 +188,7 @@ public function cdnCanBeExplicitlyDisabled(): void
186188
],
187189
'cache' => [
188190
'public' => null,
191+
'etag' => null,
189192
'max_age' => null,
190193
'smax_age' => null,
191194
],
@@ -230,6 +233,7 @@ public function cdnCacheCanBeCustomized(): void
230233
],
231234
'cache' => [
232235
'public' => null,
236+
'etag' => null,
233237
'max_age' => 3600,
234238
'smax_age' => null,
235239
],
@@ -274,6 +278,7 @@ public function cdnStorageTypeCanBeCustom(): void
274278
],
275279
'cache' => [
276280
'public' => null,
281+
'etag' => null,
277282
'max_age' => null,
278283
'smax_age' => null,
279284
],
@@ -335,6 +340,7 @@ public function cdnNullMeansEnabledWithDefaults(): void
335340
],
336341
'cache' => [
337342
'public' => null,
343+
'etag' => null,
338344
'max_age' => null,
339345
'smax_age' => null,
340346
],
@@ -379,6 +385,7 @@ public function cdnTrueMeansEnabledWithDefaults(): void
379385
],
380386
'cache' => [
381387
'public' => null,
388+
'etag' => null,
382389
'max_age' => null,
383390
'smax_age' => null,
384391
],
@@ -423,6 +430,7 @@ public function cdnFalseMeansDisabled(): void
423430
],
424431
'cache' => [
425432
'public' => null,
433+
'etag' => null,
426434
'max_age' => null,
427435
'smax_age' => null,
428436
],
@@ -493,6 +501,7 @@ public function controllerCacheSmaxAgeWithPrivateTriggersDeprecation(): void
493501
],
494502
'cache' => [
495503
'public' => null,
504+
'etag' => null,
496505
'max_age' => null,
497506
'smax_age' => null,
498507
],
@@ -539,6 +548,7 @@ public function cdnCacheSmaxAgeWithPrivateTriggersDeprecation(): void
539548
],
540549
'cache' => [
541550
'public' => false,
551+
'etag' => null,
542552
'max_age' => null,
543553
'smax_age' => 3600,
544554
],

0 commit comments

Comments
 (0)