summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Breeds <tony@bakeyournoodle.com>2017-04-13 22:17:27 +1000
committerAsif Saifuddin Auvi <auvipy@users.noreply.github.com>2017-04-13 18:17:27 +0600
commit9c6896d0bede61c4020992d8eca05e6d083b3d26 (patch)
treebce3401b52c7d5f38bf18526dbcea7910e22118a
parent26704358dbee2f92545409bc04f186001a445ba3 (diff)
downloadpy-amqp-9c6896d0bede61c4020992d8eca05e6d083b3d26.tar.gz
win32: TCP_MAXSEG isn't available for setsockopt (#136)
According to [1,2] Windows platforms support getsockopt(TCP_MAXSSEG) but not setsockopt(TCP_MAXSEG) on IPPROTO_TCP sockets. This results in: socket.error: [Errno 10042] An unknown, invalid, or unsupported option or level was specified in a getsockopt or setsockopt call when trying to connect to the server. This is a latent issue uncovered by the refactor in: Set default KEEPIDLE/KEEPCNT/KEEPINTVL and TCP_USER_TIMEOUT (b14962c2dc) [1] https://msdn.microsoft.com/en-us/library/windows/desktop/ms740476(v=vs.85).aspx [2] https://msdn.microsoft.com/en-us/library/windows/desktop/ms738544(v=vs.85).aspx
-rw-r--r--amqp/platform.py7
-rw-r--r--amqp/transport.py8
2 files changed, 13 insertions, 2 deletions
diff --git a/amqp/platform.py b/amqp/platform.py
index 2f77c04..4d02ba7 100644
--- a/amqp/platform.py
+++ b/amqp/platform.py
@@ -41,6 +41,12 @@ except ImportError: # pragma: no cover
TCP_USER_TIMEOUT = 18
HAS_TCP_USER_TIMEOUT = LINUX_VERSION and LINUX_VERSION >= (2, 6, 37)
+HAS_TCP_MAXSEG = True
+# According to MSDN Windows platforms support getsockopt(TCP_MAXSSEG) but not
+# setsockopt(TCP_MAXSEG) on IPPROTO_TCP sockets.
+if sys.platform.startswith('win'):
+ HAS_TCP_MAXSEG = False
+
if sys.version_info < (2, 7, 6):
import functools
@@ -66,6 +72,7 @@ __all__ = [
'SOL_TCP',
'TCP_USER_TIMEOUT',
'HAS_TCP_USER_TIMEOUT',
+ 'HAS_TCP_MAXSEG',
'pack',
'pack_into',
'unpack',
diff --git a/amqp/transport.py b/amqp/transport.py
index e4205ce..8c93310 100644
--- a/amqp/transport.py
+++ b/amqp/transport.py
@@ -26,7 +26,7 @@ from contextlib import contextmanager
from .exceptions import UnexpectedFrame
from .five import items
from .platform import (
- SOL_TCP, TCP_USER_TIMEOUT, HAS_TCP_USER_TIMEOUT,
+ SOL_TCP, TCP_USER_TIMEOUT, HAS_TCP_USER_TIMEOUT, HAS_TCP_MAXSEG,
pack, unpack,
)
from .utils import get_errno, set_cloexec
@@ -55,9 +55,13 @@ IPV6_LITERAL = re.compile(r'\[([\.0-9a-f:]+)\](?::(\d+))?')
KNOWN_TCP_OPTS = (
'TCP_CORK', 'TCP_DEFER_ACCEPT', 'TCP_KEEPCNT',
'TCP_KEEPIDLE', 'TCP_KEEPINTVL', 'TCP_LINGER2',
- 'TCP_MAXSEG', 'TCP_NODELAY', 'TCP_QUICKACK',
+ 'TCP_NODELAY', 'TCP_QUICKACK',
'TCP_SYNCNT', 'TCP_WINDOW_CLAMP',
)
+
+if HAS_TCP_MAXSEG:
+ KNOWN_TCP_OPTS += ('TCP_MAXSEG', )
+
TCP_OPTS = {
getattr(socket, opt) for opt in KNOWN_TCP_OPTS if hasattr(socket, opt)
}