- <?php
- /*
-  * This file is part of the Symfony package.
-  *
-  * (c) Fabien Potencier <fabien@symfony.com>
-  *
-  * For the full copyright and license information, please view the LICENSE
-  * file that was distributed with this source code.
-  */
- namespace Symfony\Component\Mailer;
- use Psr\EventDispatcher\EventDispatcherInterface;
- use Psr\Log\LoggerInterface;
- use Symfony\Component\Mailer\Bridge\Amazon\Transport\SesTransportFactory;
- use Symfony\Component\Mailer\Bridge\Google\Transport\GmailTransportFactory;
- use Symfony\Component\Mailer\Bridge\Mailchimp\Transport\MandrillTransportFactory;
- use Symfony\Component\Mailer\Bridge\Mailgun\Transport\MailgunTransportFactory;
- use Symfony\Component\Mailer\Bridge\Mailjet\Transport\MailjetTransportFactory;
- use Symfony\Component\Mailer\Bridge\OhMySmtp\Transport\OhMySmtpTransportFactory;
- use Symfony\Component\Mailer\Bridge\Postmark\Transport\PostmarkTransportFactory;
- use Symfony\Component\Mailer\Bridge\Sendgrid\Transport\SendgridTransportFactory;
- use Symfony\Component\Mailer\Bridge\Sendinblue\Transport\SendinblueTransportFactory;
- use Symfony\Component\Mailer\Exception\InvalidArgumentException;
- use Symfony\Component\Mailer\Exception\UnsupportedSchemeException;
- use Symfony\Component\Mailer\Transport\Dsn;
- use Symfony\Component\Mailer\Transport\FailoverTransport;
- use Symfony\Component\Mailer\Transport\NativeTransportFactory;
- use Symfony\Component\Mailer\Transport\NullTransportFactory;
- use Symfony\Component\Mailer\Transport\RoundRobinTransport;
- use Symfony\Component\Mailer\Transport\SendmailTransportFactory;
- use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransportFactory;
- use Symfony\Component\Mailer\Transport\TransportFactoryInterface;
- use Symfony\Component\Mailer\Transport\TransportInterface;
- use Symfony\Component\Mailer\Transport\Transports;
- use Symfony\Contracts\HttpClient\HttpClientInterface;
- /**
-  * @author Fabien Potencier <fabien@symfony.com>
-  * @author Konstantin Myakshin <molodchick@gmail.com>
-  *
-  * @final since Symfony 5.4
-  */
- class Transport
- {
-     private const FACTORY_CLASSES = [
-         GmailTransportFactory::class,
-         MailgunTransportFactory::class,
-         MailjetTransportFactory::class,
-         MandrillTransportFactory::class,
-         OhMySmtpTransportFactory::class,
-         PostmarkTransportFactory::class,
-         SendgridTransportFactory::class,
-         SendinblueTransportFactory::class,
-         SesTransportFactory::class,
-     ];
-     private $factories;
-     /**
-      * @param EventDispatcherInterface|null $dispatcher
-      * @param HttpClientInterface|null      $client
-      * @param LoggerInterface|null          $logger
-      */
-     public static function fromDsn(string $dsn/* , EventDispatcherInterface $dispatcher = null, HttpClientInterface $client = null, LoggerInterface $logger = null */): TransportInterface
-     {
-         $dispatcher = 2 <= \func_num_args() ? func_get_arg(1) : null;
-         $client = 3 <= \func_num_args() ? func_get_arg(2) : null;
-         $logger = 4 <= \func_num_args() ? func_get_arg(3) : null;
-         $factory = new self(iterator_to_array(self::getDefaultFactories($dispatcher, $client, $logger)));
-         return $factory->fromString($dsn);
-     }
-     /**
-      * @param EventDispatcherInterface|null $dispatcher
-      * @param HttpClientInterface|null      $client
-      * @param LoggerInterface|null          $logger
-      */
-     public static function fromDsns(array $dsns/* , EventDispatcherInterface $dispatcher = null, HttpClientInterface $client = null, LoggerInterface $logger = null */): TransportInterface
-     {
-         $dispatcher = 2 <= \func_num_args() ? func_get_arg(1) : null;
-         $client = 3 <= \func_num_args() ? func_get_arg(2) : null;
-         $logger = 4 <= \func_num_args() ? func_get_arg(3) : null;
-         $factory = new self(iterator_to_array(self::getDefaultFactories($dispatcher, $client, $logger)));
-         return $factory->fromStrings($dsns);
-     }
-     /**
-      * @param TransportFactoryInterface[] $factories
-      */
-     public function __construct(iterable $factories)
-     {
-         $this->factories = $factories;
-     }
-     public function fromStrings(array $dsns): Transports
-     {
-         $transports = [];
-         foreach ($dsns as $name => $dsn) {
-             $transports[$name] = $this->fromString($dsn);
-         }
-         return new Transports($transports);
-     }
-     public function fromString(string $dsn): TransportInterface
-     {
-         [$transport, $offset] = $this->parseDsn($dsn);
-         if ($offset !== \strlen($dsn)) {
-             throw new InvalidArgumentException(sprintf('The DSN has some garbage at the end: "%s".', substr($dsn, $offset)));
-         }
-         return $transport;
-     }
-     private function parseDsn(string $dsn, int $offset = 0): array
-     {
-         static $keywords = [
-             'failover' => FailoverTransport::class,
-             'roundrobin' => RoundRobinTransport::class,
-         ];
-         while (true) {
-             foreach ($keywords as $name => $class) {
-                 $name .= '(';
-                 if ($name === substr($dsn, $offset, \strlen($name))) {
-                     $offset += \strlen($name) - 1;
-                     preg_match('{\(([^()]|(?R))*\)}A', $dsn, $matches, 0, $offset);
-                     if (!isset($matches[0])) {
-                         continue;
-                     }
-                     ++$offset;
-                     $args = [];
-                     while (true) {
-                         [$arg, $offset] = $this->parseDsn($dsn, $offset);
-                         $args[] = $arg;
-                         if (\strlen($dsn) === $offset) {
-                             break;
-                         }
-                         ++$offset;
-                         if (')' === $dsn[$offset - 1]) {
-                             break;
-                         }
-                     }
-                     return [new $class($args), $offset];
-                 }
-             }
-             if (preg_match('{(\w+)\(}A', $dsn, $matches, 0, $offset)) {
-                 throw new InvalidArgumentException(sprintf('The "%s" keyword is not valid (valid ones are "%s"), ', $matches[1], implode('", "', array_keys($keywords))));
-             }
-             if ($pos = strcspn($dsn, ' )', $offset)) {
-                 return [$this->fromDsnObject(Dsn::fromString(substr($dsn, $offset, $pos))), $offset + $pos];
-             }
-             return [$this->fromDsnObject(Dsn::fromString(substr($dsn, $offset))), \strlen($dsn)];
-         }
-     }
-     public function fromDsnObject(Dsn $dsn): TransportInterface
-     {
-         foreach ($this->factories as $factory) {
-             if ($factory->supports($dsn)) {
-                 return $factory->create($dsn);
-             }
-         }
-         throw new UnsupportedSchemeException($dsn);
-     }
-     /**
-      * @param EventDispatcherInterface|null $dispatcher
-      * @param HttpClientInterface|null      $client
-      * @param LoggerInterface|null          $logger
-      *
-      * @return \Traversable<int, TransportFactoryInterface>
-      */
-     public static function getDefaultFactories(/* EventDispatcherInterface $dispatcher = null, HttpClientInterface $client = null, LoggerInterface $logger = null */): iterable
-     {
-         $dispatcher = 1 <= \func_num_args() ? func_get_arg(0) : null;
-         $client = 2 <= \func_num_args() ? func_get_arg(1) : null;
-         $logger = 3 <= \func_num_args() ? func_get_arg(2) : null;
-         foreach (self::FACTORY_CLASSES as $factoryClass) {
-             if (class_exists($factoryClass)) {
-                 yield new $factoryClass($dispatcher, $client, $logger);
-             }
-         }
-         yield new NullTransportFactory($dispatcher, $client, $logger);
-         yield new SendmailTransportFactory($dispatcher, $client, $logger);
-         yield new EsmtpTransportFactory($dispatcher, $client, $logger);
-         yield new NativeTransportFactory($dispatcher, $client, $logger);
-     }
- }
-