mirror of
https://github.com/python/cpython.git
synced 2025-09-19 15:10:58 +00:00
bpo-33361: Fix bug with seeking in StreamRecoders (GH-8278)
This commit is contained in:
parent
aac4d0342c
commit
a6ec1ce1ac
3 changed files with 33 additions and 0 deletions
|
@ -847,6 +847,12 @@ class StreamRecoder:
|
||||||
self.reader.reset()
|
self.reader.reset()
|
||||||
self.writer.reset()
|
self.writer.reset()
|
||||||
|
|
||||||
|
def seek(self, offset, whence=0):
|
||||||
|
# Seeks must be propagated to both the readers and writers
|
||||||
|
# as they might need to reset their internal buffers.
|
||||||
|
self.reader.seek(offset, whence)
|
||||||
|
self.writer.seek(offset, whence)
|
||||||
|
|
||||||
def __getattr__(self, name,
|
def __getattr__(self, name,
|
||||||
getattr=getattr):
|
getattr=getattr):
|
||||||
|
|
||||||
|
|
|
@ -3166,6 +3166,31 @@ class StreamRecoderTest(unittest.TestCase):
|
||||||
sr.write(text.encode('latin1'))
|
sr.write(text.encode('latin1'))
|
||||||
self.assertEqual(bio.getvalue(), text.encode('utf-8'))
|
self.assertEqual(bio.getvalue(), text.encode('utf-8'))
|
||||||
|
|
||||||
|
def test_seeking_read(self):
|
||||||
|
bio = io.BytesIO('line1\nline2\nline3\n'.encode('utf-16-le'))
|
||||||
|
sr = codecs.EncodedFile(bio, 'utf-8', 'utf-16-le')
|
||||||
|
|
||||||
|
self.assertEqual(sr.readline(), b'line1\n')
|
||||||
|
sr.seek(0)
|
||||||
|
self.assertEqual(sr.readline(), b'line1\n')
|
||||||
|
self.assertEqual(sr.readline(), b'line2\n')
|
||||||
|
self.assertEqual(sr.readline(), b'line3\n')
|
||||||
|
self.assertEqual(sr.readline(), b'')
|
||||||
|
|
||||||
|
def test_seeking_write(self):
|
||||||
|
bio = io.BytesIO('123456789\n'.encode('utf-16-le'))
|
||||||
|
sr = codecs.EncodedFile(bio, 'utf-8', 'utf-16-le')
|
||||||
|
|
||||||
|
# Test that seek() only resets its internal buffer when offset
|
||||||
|
# and whence are zero.
|
||||||
|
sr.seek(2)
|
||||||
|
sr.write(b'\nabc\n')
|
||||||
|
self.assertEqual(sr.readline(), b'789\n')
|
||||||
|
sr.seek(0)
|
||||||
|
self.assertEqual(sr.readline(), b'1\n')
|
||||||
|
self.assertEqual(sr.readline(), b'abc\n')
|
||||||
|
self.assertEqual(sr.readline(), b'789\n')
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipIf(_testcapi is None, 'need _testcapi module')
|
@unittest.skipIf(_testcapi is None, 'need _testcapi module')
|
||||||
class LocaleCodecTest(unittest.TestCase):
|
class LocaleCodecTest(unittest.TestCase):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix a bug in :class:`codecs.StreamRecoder` where seeking might leave old data in a
|
||||||
|
buffer and break subsequent read calls. Patch by Ammar Askar.
|
Loading…
Add table
Add a link
Reference in a new issue