mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-23 00:01:36 +00:00
Refine encoding support
- Push decoding down into the LRU cache - Cope gracefully with corrupted data and incorrect encoding headers
This commit is contained in:
parent
7ec03e45a5
commit
ce41046786
@ -306,7 +306,8 @@ class ConnectionView(WWrap):
|
||||
else:
|
||||
e = "identity"
|
||||
return self.master._cached_conn_text(
|
||||
encoding.decode(e, conn.content),
|
||||
e,
|
||||
conn.content,
|
||||
tuple([tuple(i) for i in conn.headers.lst]),
|
||||
viewmode
|
||||
)
|
||||
@ -965,7 +966,10 @@ class ConsoleMaster(flow.FlowMaster):
|
||||
return self._view_conn_raw(content, txt)
|
||||
|
||||
@utils.LRUCache(20)
|
||||
def _cached_conn_text(self, content, hdrItems, viewmode):
|
||||
def _cached_conn_text(self, e, rawcontent, hdrItems, viewmode):
|
||||
content = encoding.decode(e, rawcontent)
|
||||
if content is None:
|
||||
content = rawcontent
|
||||
hdr = []
|
||||
hdr.extend(
|
||||
format_keyvals(
|
||||
|
@ -14,7 +14,6 @@ def decode(encoding, content):
|
||||
"gzip": decode_gzip,
|
||||
"deflate": decode_deflate,
|
||||
}
|
||||
|
||||
return encoding_map.get(encoding, decode_identity)(content)
|
||||
|
||||
def decode_identity(content):
|
||||
@ -26,7 +25,10 @@ def decode_identity(content):
|
||||
|
||||
def decode_gzip(content):
|
||||
gfile = gzip.GzipFile(fileobj=cStringIO.StringIO(content))
|
||||
return gfile.read()
|
||||
try:
|
||||
return gfile.read()
|
||||
except IOError:
|
||||
return None
|
||||
|
||||
def decode_deflate(content):
|
||||
"""
|
||||
@ -38,6 +40,9 @@ def decode_deflate(content):
|
||||
http://bugs.python.org/issue5784
|
||||
"""
|
||||
try:
|
||||
return zlib.decompress(content)
|
||||
try:
|
||||
return zlib.decompress(content)
|
||||
except zlib.error:
|
||||
return zlib.decompress(content, -15)
|
||||
except zlib.error:
|
||||
return zlib.decompress(content, -15)
|
||||
return None
|
||||
|
@ -18,11 +18,13 @@ class udecode_gzip(libpry.AutoTree):
|
||||
gf.write('string')
|
||||
gf.close()
|
||||
assert 'string' == encoding.decode('gzip', s.getvalue())
|
||||
assert None == encoding.decode("gzip", "bogus")
|
||||
|
||||
class udecode_deflate(libpry.AutoTree):
|
||||
def test_simple(self):
|
||||
assert 'string' == encoding.decode('deflate', zlib.compress('string'))
|
||||
assert 'string' == encoding.decode('deflate', zlib.compress('string')[2:-4])
|
||||
assert None == encoding.decode("deflate", "bogus")
|
||||
|
||||
tests = [
|
||||
udecode_identity(),
|
||||
|
Loading…
Reference in New Issue
Block a user