Skip to content

Commit 1b61efd

Browse files
committed
skip ssl import if not available
Signed-off-by: Joel Dice <[email protected]>
1 parent fa3a0ca commit 1b61efd

File tree

4 files changed

+50
-11
lines changed

4 files changed

+50
-11
lines changed

redis/asyncio/client.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import copy
33
import inspect
44
import re
5-
import ssl
65
import warnings
76
from typing import (
87
TYPE_CHECKING,
@@ -72,13 +71,21 @@
7271
from redis.typing import ChannelT, EncodableT, KeyT
7372
from redis.utils import (
7473
HIREDIS_AVAILABLE,
74+
SSL_AVAILABLE,
7575
_set_info_logger,
7676
deprecated_function,
7777
get_lib_version,
7878
safe_str,
7979
str_if_bytes,
8080
)
8181

82+
if TYPE_CHECKING and SSL_AVAILABLE:
83+
import ssl
84+
from ssl import TLSVersion
85+
else:
86+
ssl = None
87+
TLSVersion = None
88+
8289
PubSubHandler = Callable[[Dict[str, str]], Awaitable[None]]
8390
_KeyT = TypeVar("_KeyT", bound=KeyT)
8491
_ArgT = TypeVar("_ArgT", KeyT, EncodableT)
@@ -226,7 +233,7 @@ def __init__(
226233
ssl_ca_certs: Optional[str] = None,
227234
ssl_ca_data: Optional[str] = None,
228235
ssl_check_hostname: bool = False,
229-
ssl_min_version: Optional[ssl.TLSVersion] = None,
236+
ssl_min_version: Optional[TLSVersion] = None,
230237
ssl_ciphers: Optional[str] = None,
231238
max_connections: Optional[int] = None,
232239
single_connection_client: bool = False,

redis/asyncio/cluster.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import collections
33
import random
44
import socket
5-
import ssl
65
import warnings
76
from typing import (
87
Any,
@@ -64,7 +63,20 @@
6463
TryAgainError,
6564
)
6665
from redis.typing import AnyKeyT, EncodableT, KeyT
67-
from redis.utils import deprecated_function, get_lib_version, safe_str, str_if_bytes
66+
from redis.utils import (
67+
SSL_AVAILABLE,
68+
deprecated_function,
69+
get_lib_version,
70+
safe_str,
71+
str_if_bytes
72+
)
73+
74+
if SSL_AVAILABLE:
75+
import ssl
76+
from ssl import TLSVersion
77+
else:
78+
ssl = None
79+
TLSVersion = None
6880

6981
TargetNodesT = TypeVar(
7082
"TargetNodesT", str, "ClusterNode", List["ClusterNode"], Dict[Any, "ClusterNode"]
@@ -247,7 +259,7 @@ def __init__(
247259
ssl_certfile: Optional[str] = None,
248260
ssl_check_hostname: bool = False,
249261
ssl_keyfile: Optional[str] = None,
250-
ssl_min_version: Optional[ssl.TLSVersion] = None,
262+
ssl_min_version: Optional[TLSVersion] = None,
251263
ssl_ciphers: Optional[str] = None,
252264
protocol: Optional[int] = 2,
253265
address_remap: Optional[Callable[[Tuple[str, int]], Tuple[str, int]]] = None,

redis/asyncio/connection.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
import enum
44
import inspect
55
import socket
6-
import ssl
76
import sys
87
import warnings
98
import weakref
109
from abc import abstractmethod
1110
from itertools import chain
1211
from types import MappingProxyType
1312
from typing import (
13+
TYPE_CHECKING,
1414
Any,
1515
Callable,
1616
Iterable,
@@ -27,6 +27,16 @@
2727
)
2828
from urllib.parse import ParseResult, parse_qs, unquote, urlparse
2929

30+
from ..utils import SSL_AVAILABLE
31+
32+
if TYPE_CHECKING and SSL_AVAILABLE:
33+
import ssl
34+
from ssl import TLSVersion, SSLContext
35+
else:
36+
ssl = None
37+
TLSVersion = None
38+
SSLContext = None
39+
3040
from ..auth.token import TokenInterface
3141
from ..event import AsyncAfterConnectionReleasedEvent, EventDispatcher
3242
from ..utils import deprecated_args, format_error_message
@@ -763,10 +773,13 @@ def __init__(
763773
ssl_ca_certs: Optional[str] = None,
764774
ssl_ca_data: Optional[str] = None,
765775
ssl_check_hostname: bool = False,
766-
ssl_min_version: Optional[ssl.TLSVersion] = None,
776+
ssl_min_version: Optional[TLSVersion] = None,
767777
ssl_ciphers: Optional[str] = None,
768778
**kwargs,
769779
):
780+
if not SSL_AVAILABLE:
781+
raise RedisError("Python wasn't built with SSL support")
782+
770783
self.ssl_context: RedisSSLContext = RedisSSLContext(
771784
keyfile=ssl_keyfile,
772785
certfile=ssl_certfile,
@@ -834,9 +847,12 @@ def __init__(
834847
ca_certs: Optional[str] = None,
835848
ca_data: Optional[str] = None,
836849
check_hostname: bool = False,
837-
min_version: Optional[ssl.TLSVersion] = None,
850+
min_version: Optional[TLSVersion] = None,
838851
ciphers: Optional[str] = None,
839852
):
853+
if not SSL_AVAILABLE:
854+
raise RedisError("Python wasn't built with SSL support")
855+
840856
self.keyfile = keyfile
841857
self.certfile = certfile
842858
if cert_reqs is None:
@@ -857,9 +873,9 @@ def __init__(
857873
self.check_hostname = check_hostname
858874
self.min_version = min_version
859875
self.ciphers = ciphers
860-
self.context: Optional[ssl.SSLContext] = None
876+
self.context: Optional[SSLContext] = None
861877

862-
def get(self) -> ssl.SSLContext:
878+
def get(self) -> SSLContext:
863879
if not self.context:
864880
context = ssl.create_default_context()
865881
context.check_hostname = self.check_hostname

redis/connection.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import copy
22
import os
33
import socket
4-
import ssl
54
import sys
65
import threading
76
import time
@@ -49,6 +48,11 @@
4948
str_if_bytes,
5049
)
5150

51+
if SSL_AVAILABLE:
52+
import ssl
53+
else:
54+
ssl = None
55+
5256
if HIREDIS_AVAILABLE:
5357
import hiredis
5458

0 commit comments

Comments
 (0)