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