From 2a2247ce5e1984eb2f2c41b269b38dbb795a60cf Mon Sep 17 00:00:00 2001
From: Yury Selivanov <yury@magic.io>
Date: Sat, 27 Jan 2018 17:22:01 -0500
Subject: bpo-32622: Normalize ENOTCONN to ConnectionError on macOS (GH-5369)

On mac, sendfile throws ENOTCONN on a repeated sendfile call if
the connection is closed. Normalize it to behave like other systems.
---
 Lib/asyncio/unix_events.py | 11 +++++++++++
 1 file changed, 11 insertions(+)

(limited to 'Lib/asyncio/unix_events.py')

diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py
index a4d892acad0..6cac137cacb 100644
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -362,6 +362,17 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
                             fd, sock, fileno,
                             offset, count, blocksize, total_sent)
         except OSError as exc:
+            if (registered_fd is not None and
+                    exc.errno == errno.ENOTCONN and
+                    type(exc) is not ConnectionError):
+                # If we have an ENOTCONN and this isn't a first call to
+                # sendfile(), i.e. the connection was closed in the middle
+                # of the operation, normalize the error to ConnectionError
+                # to make it consistent across all Posix systems.
+                new_exc = ConnectionError(
+                    "socket is not connected", errno.ENOTCONN)
+                new_exc.__cause__ = exc
+                exc = new_exc
             if total_sent == 0:
                 # We can get here for different reasons, the main
                 # one being 'file' is not a regular mmap(2)-like
-- 
cgit v1.2.3