aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2011-07-17 10:25:25 +1200
committerAldo Cortesi <aldo@nullcube.com>2011-07-17 10:25:25 +1200
commitce410467866444502368fbc4adb2fb96363a4631 (patch)
tree1039c1bbfe1c11067a6b52103e8b72a8eebeba66
parent7ec03e45a58d5864d0216f25e59d29d0f90766b5 (diff)
downloadmitmproxy-ce410467866444502368fbc4adb2fb96363a4631.tar.gz
mitmproxy-ce410467866444502368fbc4adb2fb96363a4631.tar.bz2
mitmproxy-ce410467866444502368fbc4adb2fb96363a4631.zip
Refine encoding support
- Push decoding down into the LRU cache - Cope gracefully with corrupted data and incorrect encoding headers
-rw-r--r--libmproxy/console.py8
-rw-r--r--libmproxy/encoding.py13
-rw-r--r--test/test_encoding.py2
3 files changed, 17 insertions, 6 deletions
diff --git a/libmproxy/console.py b/libmproxy/console.py
index c1e14b33..02f824ac 100644
--- a/libmproxy/console.py
+++ b/libmproxy/console.py
@@ -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(
diff --git a/libmproxy/encoding.py b/libmproxy/encoding.py
index f280ed9f..b56c03a6 100644
--- a/libmproxy/encoding.py
+++ b/libmproxy/encoding.py
@@ -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) \ No newline at end of file
+ return None
diff --git a/test/test_encoding.py b/test/test_encoding.py
index ba0755d6..00632c0e 100644
--- a/test/test_encoding.py
+++ b/test/test_encoding.py
@@ -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(),