Skip to content

Commit 9251650

Browse files
dicejpetyaslavova
andauthored
skip ssl import if not available (#3078)
* skip `ssl` import if not available Signed-off-by: Joel Dice <[email protected]> * address review feedback and fix lint errors Signed-off-by: Joel Dice <[email protected]> * remove TYPE_CHECKING clause from ssl conditional Signed-off-by: Joel Dice <[email protected]> --------- Signed-off-by: Joel Dice <[email protected]> Co-authored-by: petyaslavova <[email protected]>
1 parent 922c689 commit 9251650

File tree

4 files changed

+45
-11
lines changed

4 files changed

+45
-11
lines changed

redis/asyncio/client.py

+7-2
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,19 @@
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+
from ssl import TLSVersion
84+
else:
85+
TLSVersion = None
86+
8287
PubSubHandler = Callable[[Dict[str, str]], Awaitable[None]]
8388
_KeyT = TypeVar("_KeyT", bound=KeyT)
8489
_ArgT = TypeVar("_ArgT", KeyT, EncodableT)
@@ -226,7 +231,7 @@ def __init__(
226231
ssl_ca_certs: Optional[str] = None,
227232
ssl_ca_data: Optional[str] = None,
228233
ssl_check_hostname: bool = False,
229-
ssl_min_version: Optional[ssl.TLSVersion] = None,
234+
ssl_min_version: Optional[TLSVersion] = None,
230235
ssl_ciphers: Optional[str] = None,
231236
max_connections: Optional[int] = None,
232237
single_connection_client: bool = False,

redis/asyncio/cluster.py

+13-3
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,18 @@
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+
from ssl import TLSVersion
76+
else:
77+
TLSVersion = None
6878

6979
TargetNodesT = TypeVar(
7080
"TargetNodesT", str, "ClusterNode", List["ClusterNode"], Dict[Any, "ClusterNode"]
@@ -247,7 +257,7 @@ def __init__(
247257
ssl_certfile: Optional[str] = None,
248258
ssl_check_hostname: bool = False,
249259
ssl_keyfile: Optional[str] = None,
250-
ssl_min_version: Optional[ssl.TLSVersion] = None,
260+
ssl_min_version: Optional[TLSVersion] = None,
251261
ssl_ciphers: Optional[str] = None,
252262
protocol: Optional[int] = 2,
253263
address_remap: Optional[Callable[[Tuple[str, int]], Tuple[str, int]]] = None,

redis/asyncio/connection.py

+20-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import enum
44
import inspect
55
import socket
6-
import ssl
76
import sys
87
import warnings
98
import weakref
@@ -27,6 +26,16 @@
2726
)
2827
from urllib.parse import ParseResult, parse_qs, unquote, urlparse
2928

29+
from ..utils import SSL_AVAILABLE
30+
31+
if SSL_AVAILABLE:
32+
import ssl
33+
from ssl import SSLContext, TLSVersion
34+
else:
35+
ssl = None
36+
TLSVersion = None
37+
SSLContext = None
38+
3039
from ..auth.token import TokenInterface
3140
from ..event import AsyncAfterConnectionReleasedEvent, EventDispatcher
3241
from ..utils import deprecated_args, format_error_message
@@ -763,10 +772,13 @@ def __init__(
763772
ssl_ca_certs: Optional[str] = None,
764773
ssl_ca_data: Optional[str] = None,
765774
ssl_check_hostname: bool = False,
766-
ssl_min_version: Optional[ssl.TLSVersion] = None,
775+
ssl_min_version: Optional[TLSVersion] = None,
767776
ssl_ciphers: Optional[str] = None,
768777
**kwargs,
769778
):
779+
if not SSL_AVAILABLE:
780+
raise RedisError("Python wasn't built with SSL support")
781+
770782
self.ssl_context: RedisSSLContext = RedisSSLContext(
771783
keyfile=ssl_keyfile,
772784
certfile=ssl_certfile,
@@ -834,9 +846,12 @@ def __init__(
834846
ca_certs: Optional[str] = None,
835847
ca_data: Optional[str] = None,
836848
check_hostname: bool = False,
837-
min_version: Optional[ssl.TLSVersion] = None,
849+
min_version: Optional[TLSVersion] = None,
838850
ciphers: Optional[str] = None,
839851
):
852+
if not SSL_AVAILABLE:
853+
raise RedisError("Python wasn't built with SSL support")
854+
840855
self.keyfile = keyfile
841856
self.certfile = certfile
842857
if cert_reqs is None:
@@ -857,9 +872,9 @@ def __init__(
857872
self.check_hostname = check_hostname
858873
self.min_version = min_version
859874
self.ciphers = ciphers
860-
self.context: Optional[ssl.SSLContext] = None
875+
self.context: Optional[SSLContext] = None
861876

862-
def get(self) -> ssl.SSLContext:
877+
def get(self) -> SSLContext:
863878
if not self.context:
864879
context = ssl.create_default_context()
865880
context.check_hostname = self.check_hostname

redis/connection.py

+5-1
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)