summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Dörwald <walter@livinglogic.de>2005-07-20 22:52:09 (GMT)
committerWalter Dörwald <walter@livinglogic.de>2005-07-20 22:52:09 (GMT)
commitba72589680bfc59bc699ca0051be617bb82758b8 (patch)
tree127b39ba0688f16907b816739a59a280e3a74105
parent31be0ffa0e018ffcd2ae34288ca1d7c030e36a06 (diff)
downloadcpython-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.py12
-rw-r--r--Lib/test/test_codecs.py19
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
)