Verified Commit cccf3c6c authored by Lee Rowlands's avatar Lee Rowlands
Browse files

Issue #3371358 by catch, tikaszvince, smustgrave, larowlan: When...

Issue #3371358 by catch, tikaszvince, smustgrave, larowlan: When AssetControllerBase delivers existing file should add content-type
parent f276622c
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -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
+19 −6
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\FunctionalTests\Asset;

use Drupal\Component\Utility\UrlHelper;
@@ -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);
    }

@@ -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 {