From 0421e01ae11eceeb20d0e9efe564a3bc4bbce4c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Jarri=C3=A9?= Date: Thu, 9 Jan 2020 14:59:16 +0100 Subject: [PATCH] [Messenger] Messenger redis local sock dsn --- .../Transport/RedisExt/ConnectionTest.php | 11 ++++ .../Transport/RedisExt/Connection.php | 52 ++++++++++++------- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/Symfony/Component/Messenger/Tests/Transport/RedisExt/ConnectionTest.php b/src/Symfony/Component/Messenger/Tests/Transport/RedisExt/ConnectionTest.php index 0be034dd3d..837abaec01 100644 --- a/src/Symfony/Component/Messenger/Tests/Transport/RedisExt/ConnectionTest.php +++ b/src/Symfony/Component/Messenger/Tests/Transport/RedisExt/ConnectionTest.php @@ -54,6 +54,17 @@ class ConnectionTest extends TestCase ); } + public function testFromDsnOnUnixSocket() + { + $this->assertEquals( + new Connection(['stream' => 'queue'], [ + 'host' => '/var/run/redis/redis.sock', + 'port' => 0, + ], [], $redis = $this->createMock(\Redis::class)), + Connection::fromDsn('redis:///var/run/redis/redis.sock', ['stream' => 'queue'], $redis) + ); + } + public function testFromDsnWithOptions() { $this->assertEquals( diff --git a/src/Symfony/Component/Messenger/Transport/RedisExt/Connection.php b/src/Symfony/Component/Messenger/Transport/RedisExt/Connection.php index e198022162..f4cc3a158e 100644 --- a/src/Symfony/Component/Messenger/Transport/RedisExt/Connection.php +++ b/src/Symfony/Component/Messenger/Transport/RedisExt/Connection.php @@ -73,22 +73,15 @@ class Connection public static function fromDsn(string $dsn, array $redisOptions = [], \Redis $redis = null): self { - if (false === $parsedUrl = parse_url($dsn)) { - throw new InvalidArgumentException(sprintf('The given Redis DSN "%s" is invalid.', $dsn)); + $url = $dsn; + + if (preg_match('#^redis:///([^:@])+$#', $dsn)) { + $url = str_replace('redis:', 'file:', $dsn); } - $pathParts = explode('/', $parsedUrl['path'] ?? ''); - - $stream = $pathParts[1] ?? $redisOptions['stream'] ?? null; - $group = $pathParts[2] ?? $redisOptions['group'] ?? null; - $consumer = $pathParts[3] ?? $redisOptions['consumer'] ?? null; - - $connectionCredentials = [ - 'host' => $parsedUrl['host'] ?? '127.0.0.1', - 'port' => $parsedUrl['port'] ?? 6379, - 'auth' => $parsedUrl['pass'] ?? $parsedUrl['user'] ?? null, - ]; - + if (false === $parsedUrl = parse_url($url)) { + throw new InvalidArgumentException(sprintf('The given Redis DSN "%s" is invalid.', $dsn)); + } if (isset($parsedUrl['query'])) { parse_str($parsedUrl['query'], $redisOptions); } @@ -111,14 +104,35 @@ class Connection unset($redisOptions['dbindex']); } - return new self([ - 'stream' => $stream, - 'group' => $group, - 'consumer' => $consumer, + $configuration = [ + 'stream' => $redisOptions['stream'] ?? null, + 'group' => $redisOptions['group'] ?? null, + 'consumer' => $redisOptions['consumer'] ?? null, 'auto_setup' => $autoSetup, 'stream_max_entries' => $maxEntries, 'dbindex' => $dbIndex, - ], $connectionCredentials, $redisOptions, $redis); + ]; + + if (isset($parsedUrl['host'])) { + $connectionCredentials = [ + 'host' => $parsedUrl['host'] ?? '127.0.0.1', + 'port' => $parsedUrl['port'] ?? 6379, + 'auth' => $parsedUrl['pass'] ?? $parsedUrl['user'] ?? null, + ]; + + $pathParts = explode('/', $parsedUrl['path'] ?? ''); + + $configuration['stream'] = $pathParts[1] ?? $configuration['stream']; + $configuration['group'] = $pathParts[2] ?? $configuration['group']; + $configuration['consumer'] = $pathParts[3] ?? $configuration['consumer']; + } else { + $connectionCredentials = [ + 'host' => $parsedUrl['path'], + 'port' => 0, + ]; + } + + return new self($configuration, $connectionCredentials, $redisOptions, $redis); } public function get(): ?array