Commit 62ab39b5 authored by Conrad Lara's avatar Conrad Lara
Browse files

Issue #3259065 by cmlara, andresisvworld, jimconte, darvanen: Circular...

Issue #3259065 by cmlara, andresisvworld, jimconte, darvanen: Circular reference detected for service "s3fsfileservice" with mime_type guesser
parent e26019d6
Loading
Loading
Loading
Loading
+12 −1
Changes for s3fs.services.yml: 12 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -19,4 +19,15 @@ services:
    class: Drupal\s3fs\S3fsFileService
    decorates: file_system
    decoration_priority: 5
    arguments: ['@s3fsfileservice.inner', '@stream_wrapper_manager', '@logger.channel.file', '@s3fs', '@config.factory', '@module_handler', '@file.mime_type.guesser']
    arguments: ['@s3fsfileservice.inner', '@stream_wrapper_manager', '@logger.channel.file', '@s3fs', '@config.factory', '@module_handler', '@s3fs.mime_type.guesser']

  s3fs.mime_type.guesser:
    class: Drupal\Core\File\MimeType\MimeTypeGuesser
    arguments: [ '@stream_wrapper_manager' ]
    lazy: true
  s3fs.mime_type.guesser.extension:
    class: Drupal\Core\File\MimeType\ExtensionMimeTypeGuesser
    arguments: [ '@module_handler' ]
    tags:
      - { name: s3fs_mime_type_guesser }
    lazy: true
 No newline at end of file
+1 −1
Changes for src/Batch/S3fsFileMigrationBatch.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -136,7 +136,7 @@ class S3fsFileMigrationBatch implements S3fsFileMigrationBatchInterface {
    $s3fs = \Drupal::service('s3fs');
    $s3 = $s3fs->getAmazonS3Client($config);
    $streamWrapper = \Drupal::service('stream_wrapper.s3fs');
    $mimeGuesser = \Drupal::service('file.mime_type.guesser');
    $mimeGuesser = \Drupal::service('s3fs.mime_type.guesser');

    if (!isset($context['results']['scheme'])) {
      $context['results']['scheme'] = $scheme;
+70 −0
Changes for src/Compiler/S3fsMimeTypePass.php: 70 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Drupal\s3fs\Compiler;

use Composer\Semver\Semver;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Reference;

/**
 * Adds @s3fs_mime_type_guesser tagged services.
 *
 * Handles forward/backwards compatability of MimeTypeGuesser.
 *
 * To be removed when D10 is our minimally supported version.
 *
 * @internal
 *
 * @see https://www.drupal.org/node/3133341
 */
class S3fsMimeTypePass implements CompilerPassInterface {

  /**
   * {@inheritdoc}
   */
  public function process(ContainerBuilder $container) {
    $consumer = $container->getDefinition('s3fs.mime_type.guesser');

    $tag = 's3fs_mime_type_guesser';
    $interface = '\Symfony\Component\Mime\MimeTypeGuesserInterface';
    $deprecated_interface = '\Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface';
    $uses_new_interfaces = Semver::satisfies(\Drupal::VERSION, '>=9.1');
    $uses_deprecated_interface = Semver::satisfies(\Drupal::VERSION, '<=9.1');

    // Find all tagged handlers.
    $handlers = [];
    foreach ($container->findTaggedServiceIds($tag) as $id => $attributes) {
      // Validate the interface.
      $handler = $container->getDefinition($id);
      if (!is_subclass_of($handler->getClass(), $interface)) {
        // Special handling for $deprecated_interface.
        if (!is_subclass_of($handler->getClass(), $deprecated_interface) || !$uses_deprecated_interface) {
          throw new LogicException("Service '$id' does not implement $interface.");
        }
      }
      $handlers[$id] = $attributes[0]['priority'] ?? 0;
      $interfaces[$id] = $handler->getClass();
    }
    if (empty($handlers)) {
      throw new LogicException(sprintf("At least one service tagged with '%s' is required.", $tag));
    }

    // Sort all handlers by priority.
    arsort($handlers, SORT_NUMERIC);

    // Add a method call for each handler to the consumer service
    // definition.
    foreach ($handlers as $id => $priority) {
      $arguments = [new Reference($id), $priority];
      if ($uses_new_interfaces && is_subclass_of($interfaces[$id], $interface)) {
        $consumer->addMethodCall('addMimeTypeGuesser', $arguments);
      }
      elseif ($uses_deprecated_interface) {
        $consumer->addMethodCall('addGuesser', $arguments);
      }
    }
  }

}
+4 −0
Changes for src/S3fsServiceProvider.php: 4 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ namespace Drupal\s3fs;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\DependencyInjection\ServiceProviderBase;
use Drupal\Core\Site\Settings;
use Drupal\s3fs\Compiler\S3fsMimeTypePass;
use Symfony\Component\DependencyInjection\Reference;

/**
@@ -56,6 +57,9 @@ class S3fsServiceProvider extends ServiceProviderBase {
   *   The ContainerBuilder whose service definitions can be checked.
   */
  public function register(ContainerBuilder $container) {

    $container->addCompilerPass(new S3fsMimeTypePass());

    if ($container->hasDefinition('advagg.optimizer.css') && Settings::get('s3fs.use_s3_for_public')) {
      $container
        ->register('s3fs.advagg.css_subscriber', 'Drupal\s3fs\EventSubscriber\S3fsAdvAggSubscriber')
+1 −1
Changes for src/StreamWrapper/S3fsStream.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -728,7 +728,7 @@ class S3fsStream extends StreamWrapper implements StreamWrapperInterface {
    $options = $this->getOptions();
    $params = $this->getCommandParams($this->getUri());

    $mimeGuesser = \Drupal::service('file.mime_type.guesser');
    $mimeGuesser = \Drupal::service('s3fs.mime_type.guesser');
    if (method_exists($mimeGuesser, 'guessMimeType')) {
      $contentType = $mimeGuesser->guessMimeType($params['Key']);
    }
Loading