Skip to content

Commit 3288897

Browse files
misaertnicolas-grekas
authored andcommitted
[Cache] Fix Redis TLS scheme rediss for Redis connection
1 parent f3529fd commit 3288897

File tree

2 files changed

+45
-25
lines changed

2 files changed

+45
-25
lines changed

src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterTest.php

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,36 +36,46 @@ public function createCachePool(int $defaultLifetime = 0): CacheItemPoolInterfac
3636
return $adapter;
3737
}
3838

39-
/**
40-
* @dataProvider provideValidSchemes
41-
*/
42-
public function testCreateConnection(string $dsnScheme)
39+
public function testCreateConnection()
4340
{
44-
$redis = RedisAdapter::createConnection($dsnScheme.':?host[h1]&host[h2]&host[/foo:]');
41+
$redis = RedisAdapter::createConnection('redis:?host[h1]&host[h2]&host[/foo:]');
4542
$this->assertInstanceOf(\RedisArray::class, $redis);
4643
$this->assertSame(['h1:6379', 'h2:6379', '/foo'], $redis->_hosts());
4744
@$redis = null; // some versions of phpredis connect on destruct, let's silence the warning
4845

4946
$redisHost = getenv('REDIS_HOST');
5047

51-
$redis = RedisAdapter::createConnection($dsnScheme.'://'.$redisHost);
48+
$redis = RedisAdapter::createConnection('redis://'.$redisHost);
5249
$this->assertInstanceOf(\Redis::class, $redis);
5350
$this->assertTrue($redis->isConnected());
5451
$this->assertSame(0, $redis->getDbNum());
5552

56-
$redis = RedisAdapter::createConnection($dsnScheme.'://'.$redisHost.'/2');
53+
$redis = RedisAdapter::createConnection('redis://'.$redisHost.'/2');
5754
$this->assertSame(2, $redis->getDbNum());
5855

59-
$redis = RedisAdapter::createConnection($dsnScheme.'://'.$redisHost, ['timeout' => 3]);
56+
$redis = RedisAdapter::createConnection('redis://'.$redisHost, ['timeout' => 3]);
6057
$this->assertEquals(3, $redis->getTimeout());
6158

62-
$redis = RedisAdapter::createConnection($dsnScheme.'://'.$redisHost.'?timeout=4');
59+
$redis = RedisAdapter::createConnection('redis://'.$redisHost.'?timeout=4');
6360
$this->assertEquals(4, $redis->getTimeout());
6461

65-
$redis = RedisAdapter::createConnection($dsnScheme.'://'.$redisHost, ['read_timeout' => 5]);
62+
$redis = RedisAdapter::createConnection('redis://'.$redisHost, ['read_timeout' => 5]);
6663
$this->assertEquals(5, $redis->getReadTimeout());
6764
}
6865

66+
public function testCreateTlsConnection()
67+
{
68+
$redis = RedisAdapter::createConnection('rediss:?host[h1]&host[h2]&host[/foo:]');
69+
$this->assertInstanceOf(\RedisArray::class, $redis);
70+
$this->assertSame(['tls://h1:6379', 'tls://h2:6379', '/foo'], $redis->_hosts());
71+
@$redis = null; // some versions of phpredis connect on destruct, let's silence the warning
72+
73+
$redisHost = getenv('REDIS_HOST');
74+
75+
$redis = RedisAdapter::createConnection('rediss://'.$redisHost.'?lazy=1');
76+
$this->assertInstanceOf(RedisProxy::class, $redis);
77+
}
78+
6979
/**
7080
* @dataProvider provideFailedCreateConnection
7181
*/
@@ -95,14 +105,6 @@ public function testInvalidCreateConnection(string $dsn)
95105
RedisAdapter::createConnection($dsn);
96106
}
97107

98-
public function provideValidSchemes(): array
99-
{
100-
return [
101-
['redis'],
102-
['rediss'],
103-
];
104-
}
105-
106108
public function provideInvalidCreateConnection(): array
107109
{
108110
return [

src/Symfony/Component/Cache/Traits/RedisTrait.php

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ public static function createConnection($dsn, array $options = [])
118118

119119
$query = $hosts = [];
120120

121+
$tls = 'rediss' === $scheme;
122+
$tcpScheme = $tls ? 'tls' : 'tcp';
123+
121124
if (isset($params['query'])) {
122125
parse_str($params['query'], $query);
123126

@@ -130,9 +133,9 @@ public static function createConnection($dsn, array $options = [])
130133
parse_str($parameters, $parameters);
131134
}
132135
if (false === $i = strrpos($host, ':')) {
133-
$hosts[$host] = ['scheme' => 'tcp', 'host' => $host, 'port' => 6379] + $parameters;
136+
$hosts[$host] = ['scheme' => $tcpScheme, 'host' => $host, 'port' => 6379] + $parameters;
134137
} elseif ($port = (int) substr($host, 1 + $i)) {
135-
$hosts[$host] = ['scheme' => 'tcp', 'host' => substr($host, 0, $i), 'port' => $port] + $parameters;
138+
$hosts[$host] = ['scheme' => $tcpScheme, 'host' => substr($host, 0, $i), 'port' => $port] + $parameters;
136139
} else {
137140
$hosts[$host] = ['scheme' => 'unix', 'path' => substr($host, 0, $i)] + $parameters;
138141
}
@@ -148,7 +151,7 @@ public static function createConnection($dsn, array $options = [])
148151
}
149152

150153
if (isset($params['host'])) {
151-
array_unshift($hosts, ['scheme' => 'tcp', 'host' => $params['host'], 'port' => $params['port'] ?? 6379]);
154+
array_unshift($hosts, ['scheme' => $tcpScheme, 'host' => $params['host'], 'port' => $params['port'] ?? 6379]);
152155
} else {
153156
array_unshift($hosts, ['scheme' => 'unix', 'path' => $params['path']]);
154157
}
@@ -174,9 +177,16 @@ public static function createConnection($dsn, array $options = [])
174177
$connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect';
175178
$redis = new $class();
176179

177-
$initializer = static function ($redis) use ($connect, $params, $dsn, $auth, $hosts) {
180+
$initializer = static function ($redis) use ($connect, $params, $dsn, $auth, $hosts, $tls) {
181+
$host = $hosts[0]['host'] ?? $hosts[0]['path'];
182+
$port = $hosts[0]['port'] ?? null;
183+
184+
if (isset($hosts[0]['host']) && $tls) {
185+
$host = 'tls://'.$host;
186+
}
187+
178188
try {
179-
@$redis->{$connect}($hosts[0]['host'] ?? $hosts[0]['path'], $hosts[0]['port'] ?? null, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout']);
189+
@$redis->{$connect}($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout']);
180190

181191
set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
182192
$isConnected = $redis->isConnected();
@@ -210,7 +220,11 @@ public static function createConnection($dsn, array $options = [])
210220
}
211221
} elseif (is_a($class, \RedisArray::class, true)) {
212222
foreach ($hosts as $i => $host) {
213-
$hosts[$i] = 'tcp' === $host['scheme'] ? $host['host'].':'.$host['port'] : $host['path'];
223+
switch ($host['scheme']) {
224+
case 'tcp': $hosts[$i] = $host['host'].':'.$host['port']; break;
225+
case 'tls': $hosts[$i] = 'tls://'.$host['host'].':'.$host['port']; break;
226+
default: $hosts[$i] = $host['path'];
227+
}
214228
}
215229
$params['lazy_connect'] = $params['lazy'] ?? true;
216230
$params['connect_timeout'] = $params['timeout'];
@@ -227,7 +241,11 @@ public static function createConnection($dsn, array $options = [])
227241
} elseif (is_a($class, \RedisCluster::class, true)) {
228242
$initializer = static function () use ($class, $params, $dsn, $hosts) {
229243
foreach ($hosts as $i => $host) {
230-
$hosts[$i] = 'tcp' === $host['scheme'] ? $host['host'].':'.$host['port'] : $host['path'];
244+
switch ($host['scheme']) {
245+
case 'tcp': $hosts[$i] = $host['host'].':'.$host['port']; break;
246+
case 'tls': $hosts[$i] = 'tls://'.$host['host'].':'.$host['port']; break;
247+
default: $hosts[$i] = $host['path'];
248+
}
231249
}
232250

233251
try {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy