Loading core/modules/system/src/Controller/AssetControllerBase.php +6 −1 Original line number Diff line number Diff line Loading @@ -117,7 +117,12 @@ public function deliver(Request $request, string $file_name) { // Check to see whether a file matching the $uri already exists, this can // happen if it was created while this request was in progress. if (file_exists($uri)) { return new BinaryFileResponse($uri, 200, ['Cache-control' => static::CACHE_CONTROL]); return new BinaryFileResponse($uri, 200, [ 'Cache-control' => static::CACHE_CONTROL, // @todo: remove the explicit setting of Content-Type once this is // fixed in https://www.drupal.org/project/drupal/issues/3172550. 'Content-Type' => $this->contentType, ]); } // First validate that the request is valid enough to produce an asset group Loading core/tests/Drupal/FunctionalTests/Asset/AssetOptimizationTest.php +19 −6 Original line number Diff line number Diff line <?php declare(strict_types=1); namespace Drupal\FunctionalTests\Asset; use Drupal\Component\Utility\UrlHelper; Loading Loading @@ -99,8 +101,15 @@ protected function doTestAggregation(array $settings): void { $script_urls[] = $element->getAttribute('src'); } foreach ($style_urls as $url) { $this->assertAggregate($url); $this->assertAggregate($url, FALSE); $this->assertAggregate($url, TRUE, 'text/css'); // Once the file has been requested once, it's on disk. It is possible for // a second request to hit the controller, and then find that another // request has created the file already. Actually simulating this race // condition is not really possible since it relies on timing. However, by // changing the case of the part of the URL that is handled by Drupal // routing, we can force the request to be served by Drupal. $this->assertAggregate(str_replace($this->fileAssetsPath, strtoupper($this->fileAssetsPath), $url), TRUE, 'text/css'); $this->assertAggregate($url, FALSE, 'text/css'); $this->assertInvalidAggregates($url); } Loading @@ -118,19 +127,23 @@ protected function doTestAggregation(array $settings): void { * The source URL. * @param bool $from_php * (optional) Is the result from PHP or disk? Defaults to TRUE (PHP). * @param string|null $content_type * The expected content type, or NULL to skip checking. */ protected function assertAggregate(string $url, bool $from_php = TRUE): void { protected function assertAggregate(string $url, bool $from_php = TRUE, string $content_type = NULL): void { $url = $this->getAbsoluteUrl($url); // Not every script or style on a page is aggregated. if (!str_contains($url, $this->fileAssetsPath)) { if (!stripos($url, $this->fileAssetsPath) !== FALSE) { return; } $session = $this->getSession(); $session->visit($url); $this->assertSession()->statusCodeEquals(200); $headers = $session->getResponseHeaders(); if (isset($content_type)) { $this->assertStringContainsString($content_type, $headers['Content-Type'][0]); } if ($from_php) { $this->assertEquals(['no-store, private'], $headers['Cache-Control']); $this->assertStringContainsString('no-store', $headers['Cache-Control'][0]); $this->assertArrayHasKey('X-Generator', $headers); } else { Loading Loading
core/modules/system/src/Controller/AssetControllerBase.php +6 −1 Original line number Diff line number Diff line Loading @@ -117,7 +117,12 @@ public function deliver(Request $request, string $file_name) { // Check to see whether a file matching the $uri already exists, this can // happen if it was created while this request was in progress. if (file_exists($uri)) { return new BinaryFileResponse($uri, 200, ['Cache-control' => static::CACHE_CONTROL]); return new BinaryFileResponse($uri, 200, [ 'Cache-control' => static::CACHE_CONTROL, // @todo: remove the explicit setting of Content-Type once this is // fixed in https://www.drupal.org/project/drupal/issues/3172550. 'Content-Type' => $this->contentType, ]); } // First validate that the request is valid enough to produce an asset group Loading
core/tests/Drupal/FunctionalTests/Asset/AssetOptimizationTest.php +19 −6 Original line number Diff line number Diff line <?php declare(strict_types=1); namespace Drupal\FunctionalTests\Asset; use Drupal\Component\Utility\UrlHelper; Loading Loading @@ -99,8 +101,15 @@ protected function doTestAggregation(array $settings): void { $script_urls[] = $element->getAttribute('src'); } foreach ($style_urls as $url) { $this->assertAggregate($url); $this->assertAggregate($url, FALSE); $this->assertAggregate($url, TRUE, 'text/css'); // Once the file has been requested once, it's on disk. It is possible for // a second request to hit the controller, and then find that another // request has created the file already. Actually simulating this race // condition is not really possible since it relies on timing. However, by // changing the case of the part of the URL that is handled by Drupal // routing, we can force the request to be served by Drupal. $this->assertAggregate(str_replace($this->fileAssetsPath, strtoupper($this->fileAssetsPath), $url), TRUE, 'text/css'); $this->assertAggregate($url, FALSE, 'text/css'); $this->assertInvalidAggregates($url); } Loading @@ -118,19 +127,23 @@ protected function doTestAggregation(array $settings): void { * The source URL. * @param bool $from_php * (optional) Is the result from PHP or disk? Defaults to TRUE (PHP). * @param string|null $content_type * The expected content type, or NULL to skip checking. */ protected function assertAggregate(string $url, bool $from_php = TRUE): void { protected function assertAggregate(string $url, bool $from_php = TRUE, string $content_type = NULL): void { $url = $this->getAbsoluteUrl($url); // Not every script or style on a page is aggregated. if (!str_contains($url, $this->fileAssetsPath)) { if (!stripos($url, $this->fileAssetsPath) !== FALSE) { return; } $session = $this->getSession(); $session->visit($url); $this->assertSession()->statusCodeEquals(200); $headers = $session->getResponseHeaders(); if (isset($content_type)) { $this->assertStringContainsString($content_type, $headers['Content-Type'][0]); } if ($from_php) { $this->assertEquals(['no-store, private'], $headers['Cache-Control']); $this->assertStringContainsString('no-store', $headers['Cache-Control'][0]); $this->assertArrayHasKey('X-Generator', $headers); } else { Loading