bpo-32622: Enforce sendfile fallback policy for FALLBACK transports (… · python/cpython@b1a6ac4 (original) (raw)
2 files changed
lines changed
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1035,7 +1035,12 @@ async def sendfile(self, transport, file, offset=0, count=None, | ||
1035 | 1035 | except events.SendfileNotAvailableError as exc: |
1036 | 1036 | if not fallback: |
1037 | 1037 | raise |
1038 | -# the mode is FALLBACK or fallback is True | |
1038 | + | |
1039 | +if not fallback: | |
1040 | +raise RuntimeError( | |
1041 | +f"fallback is disabled and native sendfile is not " | |
1042 | +f"supported for transport {transport!r}") | |
1043 | + | |
1039 | 1044 | return await self._sendfile_fallback(transport, file, |
1040 | 1045 | offset, count) |
1041 | 1046 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -27,6 +27,7 @@ | ||
27 | 27 | |
28 | 28 | import asyncio |
29 | 29 | from asyncio import base_events |
30 | +from asyncio import constants | |
30 | 31 | from asyncio import coroutines |
31 | 32 | from asyncio import events |
32 | 33 | from asyncio import proactor_events |
@@ -2381,6 +2382,14 @@ async def coro(): | ||
2381 | 2382 | ret = self.run_loop(t) |
2382 | 2383 | self.assertEqual(ret, len(self.DATA)) |
2383 | 2384 | |
2385 | +def test_sendfile_no_fallback_for_fallback_transport(self): | |
2386 | +transport = mock.Mock() | |
2387 | +transport.is_closing.side_effect = lambda: False | |
2388 | +transport._sendfile_compatible = constants._SendfileMode.FALLBACK | |
2389 | +with self.assertRaisesRegex(RuntimeError, 'fallback is disabled'): | |
2390 | +self.loop.run_until_complete( | |
2391 | +self.loop.sendfile(transport, None, fallback=False)) | |
2392 | + | |
2384 | 2393 | |
2385 | 2394 | if sys.platform == 'win32': |
2386 | 2395 |