]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-45328: Avoid failure in OSs without TCP_NODELAY support (GH-28646)
authorrtobar <rtobarc@gmail.com>
Wed, 6 Oct 2021 17:49:44 +0000 (01:49 +0800)
committerGitHub <noreply@github.com>
Wed, 6 Oct 2021 17:49:44 +0000 (19:49 +0200)
Operating systems without support for TCP_NODELAY will raise an OSError
when trying to set the socket option, but the show can still go on.

Lib/http/client.py
Misc/NEWS.d/next/Library/2021-09-30-08-22-44.bpo-45328.8Z-Q0B.rst [new file with mode: 0644]

index 08cf2ed9b3716b7942dec780c24f0388ea471da1..a6ab135b2c3879b588bc24f8fa4c267180d51348 100644 (file)
@@ -70,6 +70,7 @@ Req-sent-unread-response       _CS_REQ_SENT       <response_class>
 
 import email.parser
 import email.message
+import errno
 import http
 import io
 import re
@@ -939,7 +940,12 @@ class HTTPConnection:
         sys.audit("http.client.connect", self, self.host, self.port)
         self.sock = self._create_connection(
             (self.host,self.port), self.timeout, self.source_address)
-        self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
+        # Might fail in OSs that don't implement TCP_NODELAY
+        try:
+             self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
+        except OSError as e:
+            if e.errno != errno.ENOPROTOOPT:
+                raise
 
         if self._tunnel_host:
             self._tunnel()
diff --git a/Misc/NEWS.d/next/Library/2021-09-30-08-22-44.bpo-45328.8Z-Q0B.rst b/Misc/NEWS.d/next/Library/2021-09-30-08-22-44.bpo-45328.8Z-Q0B.rst
new file mode 100644 (file)
index 0000000..eeb4931
--- /dev/null
@@ -0,0 +1 @@
+Fixed :class:`http.client.HTTPConnection` to work properly in OSs that don't support the ``TCP_NODELAY`` socket option.