Issue #3454507 by hablat, catch: Aggregated asset generation causes uncacheable assets

(cherry picked from commit 4f37d8d64c)
merge-requests/9515/head
nod_ 2024-09-07 00:03:45 +02:00
parent 5eb99caa5f
commit 572b08c076
No known key found for this signature in database
GPG Key ID: 76624892606FA197
2 changed files with 19 additions and 12 deletions

View File

@ -16,6 +16,7 @@ use Drupal\Core\Theme\ThemeInitializationInterface;
use Drupal\Core\Theme\ThemeManagerInterface;
use Drupal\system\FileDownloadController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
@ -183,6 +184,11 @@ abstract class AssetControllerBase extends FileDownloadController {
$generated_hash = $this->generateHash($group);
$data = $this->optimizer->optimizeGroup($group);
$response = new Response($data, 200, [
'Cache-control' => static::CACHE_CONTROL,
'Content-Type' => $this->contentType,
]);
// However, the hash from the library definitions in code may not match the
// hash from the URL. This can be for three reasons:
// 1. Someone has requested an outdated URL, i.e. from a cached page, which
@ -198,10 +204,15 @@ abstract class AssetControllerBase extends FileDownloadController {
if (hash_equals($generated_hash, $received_hash)) {
$this->dumper->dumpToUri($data, $this->assetType, $uri);
}
return new Response($data, 200, [
'Cache-control' => static::CACHE_CONTROL,
'Content-Type' => $this->contentType,
]);
else {
$expected_filename = $this->fileExtension . '_' . $generated_hash . '.' . $this->fileExtension;
$response = new RedirectResponse(
str_replace($file_name, $expected_filename, $request->getRequestUri()),
301,
['Cache-Control' => 'public, max-age=3600, must-revalidate'],
);
}
return $response;
}
/**

View File

@ -187,16 +187,12 @@ class AssetOptimizationTest extends BrowserTestBase {
$session->visit($this->setInvalidLibrary($url));
$this->assertSession()->statusCodeEquals(200);
// When an invalid asset hash name is given.
$session->visit($this->replaceGroupHash($url));
$this->assertSession()->statusCodeEquals(200);
$headers = $session->getResponseHeaders();
$this->assertEquals(['no-store, private'], $headers['Cache-Control']);
// And again to confirm it's not cached on disk.
$session->visit($this->replaceGroupHash($url));
$this->assertSession()->statusCodeEquals(200);
$headers = $session->getResponseHeaders();
$this->assertEquals(['no-store, private'], $headers['Cache-Control']);
$current_url = $session->getCurrentUrl();
// Redirect to the correct one.
$this->assertEquals($url, $current_url);
}
/**