[3.13] gh-115514: Fix incomplete writes after close while using ssl in asyncio(GH-128037) (#129581)

gh-115514: Fix incomplete writes after close while using ssl in asyncio(GH-128037)

(cherry picked from commit 4e38eeafe2)

Co-authored-by: Vojtěch Boček <vbocek@gmail.com>
Co-authored-by: Kumar Aditya <kumaraditya@python.org>
This commit is contained in:
Miss Islington (bot) 2025-02-02 17:12:12 +01:00 committed by GitHub
parent 90e526ae67
commit e9febe51af
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 213 additions and 5 deletions

View file

@ -1026,6 +1026,48 @@ class SelectorSocketTransportTests(test_utils.TestCase):
transport.close()
remove_writer.assert_called_with(self.sock_fd)
def test_write_buffer_after_close(self):
# gh-115514: If the transport is closed while:
# * Transport write buffer is not empty
# * Transport is paused
# * Protocol has data in its buffer, like SSLProtocol in self._outgoing
# The data is still written out.
# Also tested with real SSL transport in
# test.test_asyncio.test_ssl.TestSSL.test_remote_shutdown_receives_trailing_data
data = memoryview(b'data')
self.sock.send.return_value = 2
self.sock.send.fileno.return_value = 7
def _resume_writing():
transport.write(b"data")
self.protocol.resume_writing.side_effect = None
self.protocol.resume_writing.side_effect = _resume_writing
transport = self.socket_transport()
transport._high_water = 1
transport.write(data)
self.assertTrue(transport._protocol_paused)
self.assertTrue(self.sock.send.called)
self.loop.assert_writer(7, transport._write_ready)
transport.close()
# not called, we still have data in write buffer
self.assertFalse(self.protocol.connection_lost.called)
self.loop.writers[7]._run()
# during this ^ run, the _resume_writing mock above was called and added more data
self.assertEqual(transport.get_write_buffer_size(), 2)
self.loop.writers[7]._run()
self.assertEqual(transport.get_write_buffer_size(), 0)
self.assertTrue(self.protocol.connection_lost.called)
class SelectorSocketTransportBufferedProtocolTests(test_utils.TestCase):