diff --git a/redis/asyncio/client.py b/redis/asyncio/client.py index 3e2912bfca..c817e5a108 100644 --- a/redis/asyncio/client.py +++ b/redis/asyncio/client.py @@ -2,7 +2,6 @@ import copy import inspect import re -import ssl import warnings from typing import ( TYPE_CHECKING, @@ -71,6 +70,7 @@ from redis.typing import ChannelT, EncodableT, KeyT from redis.utils import ( HIREDIS_AVAILABLE, + SSL_AVAILABLE, _set_info_logger, deprecated_function, get_lib_version, @@ -78,6 +78,13 @@ str_if_bytes, ) +if SSL_AVAILABLE: + import ssl + from ssl import TLSVersion +else: + ssl = None + TLSVersion = None + PubSubHandler = Callable[[Dict[str, str]], Awaitable[None]] _KeyT = TypeVar("_KeyT", bound=KeyT) _ArgT = TypeVar("_ArgT", KeyT, EncodableT) @@ -227,7 +234,7 @@ def __init__( ssl_ca_certs: Optional[str] = None, ssl_ca_data: Optional[str] = None, ssl_check_hostname: bool = False, - ssl_min_version: Optional[ssl.TLSVersion] = None, + ssl_min_version: Optional[TLSVersion] = None, max_connections: Optional[int] = None, single_connection_client: bool = False, health_check_interval: int = 0, diff --git a/redis/asyncio/cluster.py b/redis/asyncio/cluster.py index 4fb2fc4647..6190cab726 100644 --- a/redis/asyncio/cluster.py +++ b/redis/asyncio/cluster.py @@ -2,7 +2,6 @@ import collections import random import socket -import ssl import warnings from typing import ( Any, @@ -70,6 +69,7 @@ ) from redis.typing import AnyKeyT, EncodableT, KeyT from redis.utils import ( + SSL_AVAILABLE, deprecated_function, dict_merge, get_lib_version, @@ -77,6 +77,13 @@ str_if_bytes, ) +if SSL_AVAILABLE: + import ssl + from ssl import TLSVersion +else: + ssl = None + TLSVersion = None + TargetNodesT = TypeVar( "TargetNodesT", str, "ClusterNode", List["ClusterNode"], Dict[Any, "ClusterNode"] ) @@ -272,7 +279,7 @@ def __init__( ssl_certfile: Optional[str] = None, ssl_check_hostname: bool = False, ssl_keyfile: Optional[str] = None, - ssl_min_version: Optional[ssl.TLSVersion] = None, + ssl_min_version: Optional[TLSVersion] = None, protocol: Optional[int] = 2, address_remap: Optional[Callable[[str, int], Tuple[str, int]]] = None, cache_enabled: bool = False, diff --git a/redis/asyncio/connection.py b/redis/asyncio/connection.py index 81df3b3543..93139a3125 100644 --- a/redis/asyncio/connection.py +++ b/redis/asyncio/connection.py @@ -3,7 +3,6 @@ import enum import inspect import socket -import ssl import sys import warnings import weakref @@ -27,6 +26,17 @@ ) from urllib.parse import ParseResult, parse_qs, unquote, urlparse +from ..utils import SSL_AVAILABLE + +if SSL_AVAILABLE: + import ssl + from ssl import SSLContext, TLSVersion + +else: + ssl = None + SSLContext = None + TLSVersion = None + # the functionality is available in 3.11.x but has a major issue before # 3.11.3. See https://github.com/redis/redis-py/issues/2633 if sys.version_info >= (3, 11, 3): @@ -823,9 +833,12 @@ def __init__( ssl_ca_certs: Optional[str] = None, ssl_ca_data: Optional[str] = None, ssl_check_hostname: bool = False, - ssl_min_version: Optional[ssl.TLSVersion] = None, + ssl_min_version: Optional[TLSVersion] = None, **kwargs, ): + if not SSL_AVAILABLE: + raise RedisError("Python wasn't built with SSL support") + self.ssl_context: RedisSSLContext = RedisSSLContext( keyfile=ssl_keyfile, certfile=ssl_certfile, @@ -891,8 +904,11 @@ def __init__( ca_certs: Optional[str] = None, ca_data: Optional[str] = None, check_hostname: bool = False, - min_version: Optional[ssl.TLSVersion] = None, + min_version: Optional[TLSVersion] = None, ): + if not SSL_AVAILABLE: + raise RedisError("Python wasn't built with SSL support") + self.keyfile = keyfile self.certfile = certfile if cert_reqs is None: @@ -912,9 +928,9 @@ def __init__( self.ca_data = ca_data self.check_hostname = check_hostname self.min_version = min_version - self.context: Optional[ssl.SSLContext] = None + self.context: Optional[SSLContext] = None - def get(self) -> ssl.SSLContext: + def get(self) -> SSLContext: if not self.context: context = ssl.create_default_context() context.check_hostname = self.check_hostname diff --git a/redis/connection.py b/redis/connection.py index 617d04af5c..a6077ac1c9 100644 --- a/redis/connection.py +++ b/redis/connection.py @@ -2,7 +2,6 @@ import os import select import socket -import ssl import sys import threading import weakref @@ -44,6 +43,12 @@ str_if_bytes, ) +if SSL_AVAILABLE: + import ssl + +else: + ssl = None + if HIREDIS_AVAILABLE: import hiredis