]> granicus.if.org Git - python/commitdiff
bpo-32622: Enforce sendfile fallback policy for FALLBACK transports (#5364)
authorYury Selivanov <yury@magic.io>
Sat, 27 Jan 2018 20:52:52 +0000 (15:52 -0500)
committerGitHub <noreply@github.com>
Sat, 27 Jan 2018 20:52:52 +0000 (15:52 -0500)
Lib/asyncio/base_events.py
Lib/test/test_asyncio/test_events.py

index f532dc42132700339b767935542ea45693eb5af6..7442bf28b03525506d69541dc2452f718d0fa9db 100644 (file)
@@ -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)
 
index 0981bd6ac91bcd8f89ef28feabd6ed0833e07bc8..b66d91d415e8360704946fc1a9b16736d5c90ad4 100644 (file)
@@ -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':