diff options
author | Walter Dörwald <walter@livinglogic.de> | 2005-07-20 22:52:09 (GMT) |
---|---|---|
committer | Walter Dörwald <walter@livinglogic.de> | 2005-07-20 22:52:09 (GMT) |
commit | ba72589680bfc59bc699ca0051be617bb82758b8 (patch) | |
tree | 127b39ba0688f16907b816739a59a280e3a74105 | |
parent | 31be0ffa0e018ffcd2ae34288ca1d7c030e36a06 (diff) | |
download | cpython-ba72589680bfc59bc699ca0051be617bb82758b8.zip cpython-ba72589680bfc59bc699ca0051be617bb82758b8.tar.gz cpython-ba72589680bfc59bc699ca0051be617bb82758b8.tar.bz2 |
Backport checkin:
Make attributes and local variables in the StreamReader str objects instead
of unicode objects, so that codecs that do a str->str decoding won't promote
the result to unicode. This fixes SF bug #1241507.
-rw-r--r-- | Lib/codecs.py | 12 | ||||
-rw-r--r-- | Lib/test/test_codecs.py | 19 |
2 files changed, 25 insertions, 6 deletions
diff --git a/Lib/codecs.py b/Lib/codecs.py index 3b7c8bf..33b7481 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -229,7 +229,9 @@ class StreamReader(Codec): self.stream = stream self.errors = errors self.bytebuffer = "" - self.charbuffer = u"" + # For str->str decoding this will stay a str + # For str->unicode decoding the first read will promote it to unicode + self.charbuffer = "" def decode(self, input, errors='strict'): raise NotImplementedError @@ -284,7 +286,7 @@ class StreamReader(Codec): if chars < 0: # Return everything we've got result = self.charbuffer - self.charbuffer = u"" + self.charbuffer = "" else: # Return the first chars characters result = self.charbuffer[:chars] @@ -301,7 +303,7 @@ class StreamReader(Codec): """ readsize = size or 72 - line = u"" + line = "" # If size is given, we call read() only once while True: data = self.read(readsize) @@ -309,7 +311,7 @@ class StreamReader(Codec): # If we're at a "\r" read one extra character (which might # be a "\n") to get a proper line ending. If the stream is # temporarily exhausted we return the wrong line ending. - if data.endswith(u"\r"): + if data.endswith("\r"): data += self.read(size=1, chars=1) line += data @@ -319,7 +321,7 @@ class StreamReader(Codec): line0withoutend = lines[0].splitlines(False)[0] if line0withend != line0withoutend: # We really have a line end # Put the rest back together and keep it until the next call - self.charbuffer = u"".join(lines[1:]) + self.charbuffer + self.charbuffer = "".join(lines[1:]) + self.charbuffer if keepends: line = line0withend else: diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 93c5ff1..78544b2 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -665,6 +665,22 @@ class StreamReaderTest(unittest.TestCase): f = self.reader(self.stream) self.assertEquals(f.readlines(), [u'\ud55c\n', u'\uae00']) +class Str2StrTest(unittest.TestCase): + + def test_read(self): + sin = "\x80".encode("base64_codec") + reader = codecs.getreader("base64_codec")(StringIO.StringIO(sin)) + sout = reader.read() + self.assertEqual(sout, "\x80") + self.assert_(isinstance(sout, str)) + + def test_readline(self): + sin = "\x80".encode("base64_codec") + reader = codecs.getreader("base64_codec")(StringIO.StringIO(sin)) + sout = reader.readline() + self.assertEqual(sout, "\x80") + self.assert_(isinstance(sout, str)) + def test_main(): test_support.run_unittest( UTF16Test, @@ -677,7 +693,8 @@ def test_main(): NameprepTest, CodecTest, CodecsModuleTest, - StreamReaderTest + StreamReaderTest, + Str2StrTest ) |