diff options
-rw-r--r-- | waitress/adjustments.py | 8 | ||||
-rw-r--r-- | waitress/compat.py | 13 |
2 files changed, 16 insertions, 5 deletions
diff --git a/waitress/adjustments.py b/waitress/adjustments.py index 2ee4cd5..1a56621 100644 --- a/waitress/adjustments.py +++ b/waitress/adjustments.py @@ -20,6 +20,7 @@ from waitress.compat import ( PY2, WIN, string_types, + HAS_IPV6, ) truthy = frozenset(('t', 'true', 'y', 'yes', 'on', '1')) @@ -228,10 +229,15 @@ class Adjustments(object): enabled_families = socket.AF_UNSPEC + if not self.ipv4 and not HAS_IPV6: # pragma: no cover + raise ValueError( + 'IPv4 is disabled but IPv6 is not available. Cowardly refusing to start.' + ) + if self.ipv4 and not self.ipv6: enabled_families = socket.AF_INET - if not self.ipv4 and self.ipv6: + if not self.ipv4 and self.ipv6 and HAS_IPV6: enabled_families = socket.AF_INET6 wanted_sockets = [] diff --git a/waitress/compat.py b/waitress/compat.py index 7704764..700f7a1 100644 --- a/waitress/compat.py +++ b/waitress/compat.py @@ -1,6 +1,7 @@ import sys import types import platform +import warnings try: import urlparse @@ -120,16 +121,20 @@ except AttributeError: # pragma: no cover # Python on Windows may not define IPPROTO_IPV6 in socket. import socket +HAS_IPV6 = socket.has_ipv6 + if hasattr(socket, 'IPPROTO_IPV6') and hasattr(socket, 'IPV6_V6ONLY'): IPPROTO_IPV6 = socket.IPPROTO_IPV6 IPV6_V6ONLY = socket.IPV6_V6ONLY else: # pragma: no cover - import os - if os.name == 'nt': + if WIN: IPPROTO_IPV6 = 41 IPV6_V6ONLY = 27 else: - raise RuntimeError( + warnings.warn( 'OS does not support required IPv6 socket flags. This is requirement ' - 'for Waitress. Please open an issue at https://github.com/Pylons/waitress' + 'for Waitress. Please open an issue at https://github.com/Pylons/waitress. ' + 'IPv6 support has been disabled.', + RuntimeWarning ) + HAS_IPV6 = False |