diff options
author | alts <stephen@evilrobotstuff.com> | 2011-07-16 02:47:06 -0700 |
---|---|---|
committer | alts <stephen@evilrobotstuff.com> | 2011-07-16 02:47:06 -0700 |
commit | 6dc0f105ccabeb10f557dc8baa51d3ce08b3c8ee (patch) | |
tree | 977c6339d1562a333b1d2087853248ea5ed32771 /libmproxy/encoding.py | |
parent | 94ae720a220da4beaa2fc6111b4cafb60b41d33b (diff) | |
download | mitmproxy-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.py | 43 |
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 |