diff options
| author | Yury Selivanov <yury@magic.io> | 2018-01-27 15:52:52 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-01-27 15:52:52 -0500 | 
| commit | b1a6ac4c4026d648b3d948945b734a4d0f175a3c (patch) | |
| tree | 6abf3b571d36187177b3dbae470f59a6f768a52a | |
| parent | 7c684073f951dd891021676ecfd86ffc18b8895e (diff) | |
| download | cpython-git-b1a6ac4c4026d648b3d948945b734a4d0f175a3c.tar.gz | |
bpo-32622: Enforce sendfile fallback policy for FALLBACK transports (#5364)
| -rw-r--r-- | Lib/asyncio/base_events.py | 7 | ||||
| -rw-r--r-- | Lib/test/test_asyncio/test_events.py | 9 | 
2 files changed, 15 insertions, 1 deletions
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index f532dc4213..7442bf28b0 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 0981bd6ac9..b66d91d415 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':  | 
