summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--waitress/adjustments.py8
-rw-r--r--waitress/compat.py13
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