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:
parent
3b68ef6540
commit
457a1a564c
@ -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',
|
||||||
|
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user