diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php index 2c58ccc7035fed02a2ffc7d0ab47b85456c1c81d..6495229a8b51c84c0ffe93d5395385daf34ee50d 100644 --- a/core/lib/Drupal/Core/DrupalKernel.php +++ b/core/lib/Drupal/Core/DrupalKernel.php @@ -18,6 +18,7 @@ use Drupal\Core\DependencyInjection\ServiceProviderInterface; use Drupal\Core\DependencyInjection\YamlFileLoader; use Drupal\Core\Extension\ExtensionDiscovery; +use Drupal\Core\File\MimeType\MimeTypeGuesser; use Drupal\Core\Language\Language; use Drupal\Core\PageCache\RequestPolicyInterface; use Drupal\Core\PhpStorage\PhpStorageFactory; @@ -458,6 +459,9 @@ public function preHandle(Request $request) { $allowed_protocols = array('http', 'https'); } UrlHelper::setAllowedProtocols($allowed_protocols); + + // Override of Symfony's mime type guesser singleton. + MimeTypeGuesser::registerWithSymfonyGuesser($this->container); } /** diff --git a/core/lib/Drupal/Core/File/MimeType/MimeTypeGuesser.php b/core/lib/Drupal/Core/File/MimeType/MimeTypeGuesser.php index d7b276836eb04b8be32d2ba812dd13370a3310cf..20544638a090e335e9ebab9b0d0c6a48af5d79ea 100644 --- a/core/lib/Drupal/Core/File/MimeType/MimeTypeGuesser.php +++ b/core/lib/Drupal/Core/File/MimeType/MimeTypeGuesser.php @@ -7,6 +7,8 @@ namespace Drupal\Core\File\MimeType; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser as SymfonyMimeTypeGuesser; use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface; /** @@ -88,4 +90,18 @@ protected function sortGuessers() { return $sorted; } + /** + * A helper function to register with Symfony's singleton mime type guesser. + * + * Symfony's default mimetype guessers have dependencies on PHP's fileinfo + * extension or being able to run the system command file. Drupal's guesser + * does not have these dependencies. + * + * @see \Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser + */ + public static function registerWithSymfonyGuesser(ContainerInterface $container) { + $singleton = SymfonyMimeTypeGuesser::getInstance(); + $singleton->register($container->get('file.mime_type.guesser')); + } + } diff --git a/core/tests/Drupal/Tests/Core/File/MimeTypeGuesserTest.php b/core/tests/Drupal/Tests/Core/File/MimeTypeGuesserTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a1bf9c2327cbaab93fe2fc6fcc591d6db3db4c65 --- /dev/null +++ b/core/tests/Drupal/Tests/Core/File/MimeTypeGuesserTest.php @@ -0,0 +1,43 @@ +<?php + +/** + * @file + * Contains \Drupal\Tests\Core\File\MimeTypeGuesserTest. + */ + +namespace Drupal\Tests\Core\File; + +use Drupal\Core\DependencyInjection\ContainerBuilder; +use Drupal\Core\File\MimeType\MimeTypeGuesser; +use Drupal\Tests\UnitTestCase; +use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser as SymfonyMimeTypeGuesser; + +/** + * @coversDefaultClass \Drupal\Core\File\MimeType\MimeTypeGuesser + * @group DrupalKernel + */ +class MimeTypeGuesserTest extends UnitTestCase { + + /** + * @covers ::registerWithSymfonyGuesser + * + * @see Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser + */ + public function testSymfonyGuesserRegistration() { + // Make the guessers property accessible on Symfony's MimeTypeGuesser. + $symfony_guesser = SymfonyMimeTypeGuesser::getInstance(); + // Test that the Drupal mime type guess is not being used before the + // override method is called. It is possible that the test environment does + // not support the default guessers. + $guessers = $this->readAttribute($symfony_guesser, 'guessers'); + if (count($guessers)) { + $this->assertNotInstanceOf('Drupal\Core\File\MimeType\MimeTypeGuesser', $guessers[0]); + } + $container = new ContainerBuilder(); + $container->set('file.mime_type.guesser', new MimeTypeGuesser()); + MimeTypeGuesser::registerWithSymfonyGuesser($container); + $guessers = $this->readAttribute($symfony_guesser, 'guessers'); + $this->assertInstanceOf('Drupal\Core\File\MimeType\MimeTypeGuesser', $guessers[0]); + } + +}