| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | from __future__ import absolute_import |
| | from __future__ import print_function |
| | from __future__ import unicode_literals |
| | from io import BytesIO |
| | import codecs |
| | import zlib |
| |
|
| | from .utils import GeneratorReader |
| |
|
| |
|
| | class ZLibIncrementalDecoder(codecs.IncrementalDecoder): |
| | def __init__(self, errors='strict', wbits=15): |
| | assert errors == 'strict' |
| | self.errors = errors |
| | self.wbits = wbits |
| | self.reset() |
| |
|
| | def decode(self, input, final=False): |
| | c = self.decompressobj.decompress(input) |
| | if final: |
| | c += self.decompressobj.flush() |
| | return c |
| |
|
| | def reset(self): |
| | self.decompressobj = zlib.decompressobj(self.wbits) |
| |
|
| |
|
| | def decompress_gen(source, bufsize=4096): |
| | dec = ZLibIncrementalDecoder(wbits=-15) |
| | exausted = False |
| | while not exausted: |
| | input = source.read(bufsize) |
| | if len(input) < bufsize: |
| | exausted = True |
| | yield dec.decode(input, exausted) |
| |
|
| |
|
| | def decompress_experimental(source, bufsize=4096): |
| | ''' decompress inputstream |
| | |
| | stream: a file-like readable |
| | returns a file-like readable |
| | ''' |
| | return GeneratorReader(decompress_gen(source, bufsize)) |
| |
|
| |
|
| | def decompress(stream): |
| | ''' decompress inputstream |
| | |
| | stream: a file-like readable |
| | returns a file-like readable |
| | ''' |
| | |
| | |
| | compressed_maybe = stream.read() |
| | try: |
| | decompressed = zlib.decompress(compressed_maybe, -15) |
| | except zlib.error: |
| | return BytesIO(compressed_maybe) |
| | else: |
| | return BytesIO(decompressed) |
| |
|