summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYury Selivanov <yury@magic.io>2018-01-27 20:52:52 (GMT)
committerGitHub <noreply@github.com>2018-01-27 20:52:52 (GMT)
commitb1a6ac4c4026d648b3d948945b734a4d0f175a3c (patch)
tree6abf3b571d36187177b3dbae470f59a6f768a52a
parent7c684073f951dd891021676ecfd86ffc18b8895e (diff)
downloadcpython-b1a6ac4c4026d648b3d948945b734a4d0f175a3c.zip
cpython-b1a6ac4c4026d648b3d948945b734a4d0f175a3c.tar.gz
cpython-b1a6ac4c4026d648b3d948945b734a4d0f175a3c.tar.bz2
bpo-32622: Enforce sendfile fallback policy for FALLBACK transports (#5364)
-rw-r--r--Lib/asyncio/base_events.py7
-rw-r--r--Lib/test/test_asyncio/test_events.py9
2 files changed, 15 insertions, 1 deletions
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
index f532dc4..7442bf2 100644
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -1035,7 +1035,12 @@ class BaseEventLoop(events.AbstractEventLoop):
except events.SendfileNotAvailableError as exc:
if not fallback:
raise
- # the mode is FALLBACK or fallback is True
+
+ if not fallback:
+ raise RuntimeError(
+ f"fallback is disabled and native sendfile is not "
+ f"supported for transport {transport!r}")
+
return await self._sendfile_fallback(transport, file,
offset, count)
diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
index 0981bd6..b66d91d 100644
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -27,6 +27,7 @@ if sys.platform != 'win32':
import asyncio
from asyncio import base_events
+from asyncio import constants
from asyncio import coroutines
from asyncio import events
from asyncio import proactor_events
@@ -2381,6 +2382,14 @@ class SendfileMixin:
ret = self.run_loop(t)
self.assertEqual(ret, len(self.DATA))
+ def test_sendfile_no_fallback_for_fallback_transport(self):
+ transport = mock.Mock()
+ transport.is_closing.side_effect = lambda: False
+ transport._sendfile_compatible = constants._SendfileMode.FALLBACK
+ with self.assertRaisesRegex(RuntimeError, 'fallback is disabled'):
+ self.loop.run_until_complete(
+ self.loop.sendfile(transport, None, fallback=False))
+
if sys.platform == 'win32':