Skip to content

Commit 6103020

Browse files
committed
allow cert_reqs to be a string and convert it to the appropriate SSL constant.
1 parent 17ff377 commit 6103020

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

redis/connection.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,16 @@ def __init__(self, keyfile=None, certfile=None, cert_reqs=None,
570570
self.certfile = certfile
571571
if cert_reqs is None:
572572
cert_reqs = ssl.CERT_NONE
573+
elif isinstance(cert_reqs, basestring):
574+
CERT_REQS = {
575+
'none': ssl.CERT_NONE,
576+
'optional': ssl.CERT_OPTIONAL,
577+
'required': ssl.CERT_REQUIRED
578+
}
579+
if cert_reqs not in CERT_REQS:
580+
raise RedisError(
581+
"Invalid SSL Certificate Required Flag: %s" % cert_reqs)
582+
cert_reqs = CERT_REQS[cert_reqs]
573583
self.cert_reqs = cert_reqs
574584
self.ca_certs = ca_certs
575585

tests/test_connection_pool.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import re
77

88
from threading import Thread
9+
from redis.connection import ssl_available
910
from .conftest import skip_if_server_version_lt
1011

1112

@@ -289,6 +290,31 @@ def test_extra_querystring_options(self):
289290
}
290291

291292

293+
class TestSSLConnectionURLParsing(object):
294+
@pytest.mark.skipif(not ssl_available, reason="SSL not installed")
295+
def test_defaults(self):
296+
pool = redis.ConnectionPool.from_url('rediss://localhost')
297+
assert pool.connection_class == redis.SSLConnection
298+
assert pool.connection_kwargs == {
299+
'host': 'localhost',
300+
'port': 6379,
301+
'db': 0,
302+
'password': None,
303+
}
304+
305+
@pytest.mark.skipif(not ssl_available, reason="SSL not installed")
306+
def test_cert_reqs_options(self):
307+
import ssl
308+
pool = redis.ConnectionPool.from_url('rediss://?cert_reqs=none')
309+
assert pool.get_connection('_').cert_reqs == ssl.CERT_NONE
310+
311+
pool = redis.ConnectionPool.from_url('rediss://?cert_reqs=optional')
312+
assert pool.get_connection('_').cert_reqs == ssl.CERT_OPTIONAL
313+
314+
pool = redis.ConnectionPool.from_url('rediss://?cert_reqs=required')
315+
assert pool.get_connection('_').cert_reqs == ssl.CERT_REQUIRED
316+
317+
292318
class TestConnection(object):
293319
def test_on_connect_error(self):
294320
"""

0 commit comments

Comments
 (0)