aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy/encoding.py
diff options
context:
space:
mode:
authoralts <stephen@evilrobotstuff.com>2011-07-16 02:47:06 -0700
committeralts <stephen@evilrobotstuff.com>2011-07-16 02:47:06 -0700
commit6dc0f105ccabeb10f557dc8baa51d3ce08b3c8ee (patch)
tree977c6339d1562a333b1d2087853248ea5ed32771 /libmproxy/encoding.py
parent94ae720a220da4beaa2fc6111b4cafb60b41d33b (diff)
downloadmitmproxy-6dc0f105ccabeb10f557dc8baa51d3ce08b3c8ee.tar.gz
mitmproxy-6dc0f105ccabeb10f557dc8baa51d3ce08b3c8ee.tar.bz2
mitmproxy-6dc0f105ccabeb10f557dc8baa51d3ce08b3c8ee.zip
Adds support for content encoding, namely gip and deflate
Diffstat (limited to 'libmproxy/encoding.py')
-rw-r--r--libmproxy/encoding.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/libmproxy/encoding.py b/libmproxy/encoding.py
new file mode 100644
index 00000000..f280ed9f
--- /dev/null
+++ b/libmproxy/encoding.py
@@ -0,0 +1,43 @@
+"""
+ Utility functions for decoding response bodies.
+"""
+import cStringIO
+import gzip, zlib
+
+__ALL__ = ["ENCODINGS"]
+
+ENCODINGS = set(["identity", "gzip", "deflate"])
+
+def decode(encoding, content):
+ encoding_map = {
+ "identity": decode_identity,
+ "gzip": decode_gzip,
+ "deflate": decode_deflate,
+ }
+
+ return encoding_map.get(encoding, decode_identity)(content)
+
+def decode_identity(content):
+ """
+ Returns content unchanged. Identity is the default value of
+ Accept-Encoding headers.
+ """
+ return content
+
+def decode_gzip(content):
+ gfile = gzip.GzipFile(fileobj=cStringIO.StringIO(content))
+ return gfile.read()
+
+def decode_deflate(content):
+ """
+ Returns decompress data for DEFLATE. Some servers may respond with
+ compressed data without a zlib header or checksum. An undocumented
+ feature of zlib permits the lenient decompression of data missing both
+ values.
+
+ http://bugs.python.org/issue5784
+ """
+ try:
+ return zlib.decompress(content)
+ except zlib.error:
+ return zlib.decompress(content, -15) \ No newline at end of file