1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-15 00:03:28 +01:00

bufferedreader: support brotli decompression

rewrite: handle Content-Encoding: br using brotli decompressor
setup: add brotlipy as dependency
This commit is contained in:
Ilya Kreymer 2016-06-15 01:37:29 -04:00
parent 3b68ef6540
commit 457a1a564c
3 changed files with 23 additions and 4 deletions

View File

@ -77,6 +77,7 @@ class RewriteContent(object):
def _check_encoding(self, rewritten_headers, stream, enc): def _check_encoding(self, rewritten_headers, stream, enc):
matched = False
if (rewritten_headers. if (rewritten_headers.
contains_removed_header('content-encoding', enc)): contains_removed_header('content-encoding', enc)):
@ -87,8 +88,9 @@ class RewriteContent(object):
stream = DecompressingBufferedReader(stream, decomp_type=enc) stream = DecompressingBufferedReader(stream, decomp_type=enc)
rewritten_headers.status_headers.remove_header('content-length') rewritten_headers.status_headers.remove_header('content-length')
matched = True
return stream return matched, stream
@ -139,8 +141,12 @@ class RewriteContent(object):
encoding = None encoding = None
first_buff = b'' first_buff = b''
stream = self._check_encoding(rewritten_headers, stream, 'gzip') for decomp_type in BufferedReader.get_supported_decompressors():
stream = self._check_encoding(rewritten_headers, stream, 'deflate') matched, stream = self._check_encoding(rewritten_headers,
stream,
decomp_type)
if matched:
break
if mod == 'js_': if mod == 'js_':
text_type, stream = self._resolve_text_type('js', text_type, stream = self._resolve_text_type('js',

View File

@ -1,5 +1,6 @@
from io import BytesIO from io import BytesIO
import zlib import zlib
import brotli
#================================================================= #=================================================================
@ -17,6 +18,11 @@ def deflate_decompressor():
def deflate_decompressor_alt(): def deflate_decompressor_alt():
return zlib.decompressobj(-zlib.MAX_WBITS) return zlib.decompressobj(-zlib.MAX_WBITS)
def brotli_decompressor():
decomp = brotli.Decompressor()
decomp.unused_data = None
return decomp
#================================================================= #=================================================================
class BufferedReader(object): class BufferedReader(object):
@ -40,7 +46,9 @@ class BufferedReader(object):
DECOMPRESSORS = {'gzip': gzip_decompressor, DECOMPRESSORS = {'gzip': gzip_decompressor,
'deflate': deflate_decompressor, 'deflate': deflate_decompressor,
'deflate_alt': deflate_decompressor_alt} 'deflate_alt': deflate_decompressor_alt,
'br': brotli_decompressor
}
def __init__(self, stream, block_size=1024, def __init__(self, stream, block_size=1024,
decomp_type=None, decomp_type=None,
@ -181,6 +189,10 @@ class BufferedReader(object):
self.stream.close() self.stream.close()
self.stream = None self.stream = None
@classmethod
def get_supported_decompressors(cls):
return cls.DECOMPRESSORS.keys()
#================================================================= #=================================================================
class DecompressingBufferedReader(BufferedReader): class DecompressingBufferedReader(BufferedReader):

View File

@ -79,6 +79,7 @@ setup(
'redis', 'redis',
'jinja2', 'jinja2',
'surt>=0.3.0', 'surt>=0.3.0',
'brotlipy',
'pyyaml', 'pyyaml',
'watchdog', 'watchdog',
'webencodings', 'webencodings',