summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2006-10-29 14:39:13 +0000
committerGeorg Brandl <georg@python.org>2006-10-29 14:39:13 +0000
commitc68d2cc3f2950d8132ea83bcf2c9fc1359e99a4d (patch)
tree6a6a8745273c794f08343f21bfbe18cb7452541c
parentb8205a11882161968fe9b67871d4000c4b3efb08 (diff)
downloadcpython-git-c68d2cc3f2950d8132ea83bcf2c9fc1359e99a4d.tar.gz
Bug #1586613: fix zlib and bz2 codecs' incremental en/decoders.
(backport from rev. 52529)
-rw-r--r--Lib/encodings/bz2_codec.py29
-rw-r--r--Lib/encodings/zlib_codec.py30
-rw-r--r--Lib/test/test_codecs.py2
-rw-r--r--Misc/NEWS2
4 files changed, 55 insertions, 8 deletions
diff --git a/Lib/encodings/bz2_codec.py b/Lib/encodings/bz2_codec.py
index 81e84b6fb8..054b36b401 100644
--- a/Lib/encodings/bz2_codec.py
+++ b/Lib/encodings/bz2_codec.py
@@ -52,14 +52,35 @@ class Codec(codecs.Codec):
return bz2_decode(input, errors)
class IncrementalEncoder(codecs.IncrementalEncoder):
+ def __init__(self, errors='strict'):
+ assert errors == 'strict'
+ self.errors = errors
+ self.compressobj = bz2.BZ2Compressor()
+
def encode(self, input, final=False):
- assert self.errors == 'strict'
- return bz2.compress(input)
+ if final:
+ c = self.compressobj.compress(input)
+ return c + self.compressobj.flush()
+ else:
+ return self.compressobj.compress(input)
+
+ def reset(self):
+ self.compressobj = bz2.BZ2Compressor()
class IncrementalDecoder(codecs.IncrementalDecoder):
+ def __init__(self, errors='strict'):
+ assert errors == 'strict'
+ self.errors = errors
+ self.decompressobj = bz2.BZ2Decompressor()
+
def decode(self, input, final=False):
- assert self.errors == 'strict'
- return bz2.decompress(input)
+ try:
+ return self.decompressobj.decompress(input)
+ except EOFError:
+ return ''
+
+ def reset(self):
+ self.decompressobj = bz2.BZ2Decompressor()
class StreamWriter(Codec,codecs.StreamWriter):
pass
diff --git a/Lib/encodings/zlib_codec.py b/Lib/encodings/zlib_codec.py
index 2694f15511..3419f9f48f 100644
--- a/Lib/encodings/zlib_codec.py
+++ b/Lib/encodings/zlib_codec.py
@@ -51,14 +51,36 @@ class Codec(codecs.Codec):
return zlib_decode(input, errors)
class IncrementalEncoder(codecs.IncrementalEncoder):
+ def __init__(self, errors='strict'):
+ assert errors == 'strict'
+ self.errors = errors
+ self.compressobj = zlib.compressobj()
+
def encode(self, input, final=False):
- assert self.errors == 'strict'
- return zlib.compress(input)
+ if final:
+ c = self.compressobj.compress(input)
+ return c + self.compressobj.flush()
+ else:
+ return self.compressobj.compress(input)
+
+ def reset(self):
+ self.compressobj = zlib.compressobj()
class IncrementalDecoder(codecs.IncrementalDecoder):
+ def __init__(self, errors='strict'):
+ assert errors == 'strict'
+ self.errors = errors
+ self.decompressobj = zlib.decompressobj()
+
def decode(self, input, final=False):
- assert self.errors == 'strict'
- return zlib.decompress(input)
+ if final:
+ c = self.decompressobj.decompress(input)
+ return c + self.decompressobj.flush()
+ else:
+ return self.decompressobj.decompress(input)
+
+ def reset(self):
+ self.decompressobj = zlib.decompressobj()
class StreamWriter(Codec,codecs.StreamWriter):
pass
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
index 60b8a7222c..e64e78102c 100644
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -1063,6 +1063,7 @@ broken_unicode_with_streams = [
"punycode",
"unicode_internal"
]
+broken_incremental_coders = broken_unicode_with_streams[:]
try:
import bz2
@@ -1112,6 +1113,7 @@ class BasicUnicodeTest(unittest.TestCase):
decodedresult += reader.read()
self.assertEqual(decodedresult, s, "%r != %r (encoding=%r)" % (decodedresult, s, encoding))
+ if encoding not in broken_incremental_coders:
# check incremental decoder/encoder (fetched via the Python
# and C API) and iterencode()/iterdecode()
try:
diff --git a/Misc/NEWS b/Misc/NEWS
index fc613c677a..7bbd688418 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -90,6 +90,8 @@ Extension Modules
Library
-------
+- Bug #1586613: fix zlib and bz2 codecs' incremental en/decoders.
+
- Patch #1583880: fix tarfile's problems with long names and posix/
GNU modes.