From 6dc0f105ccabeb10f557dc8baa51d3ce08b3c8ee Mon Sep 17 00:00:00 2001 From: alts Date: Sat, 16 Jul 2011 02:47:06 -0700 Subject: Adds support for content encoding, namely gip and deflate --- libmproxy/encoding.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 libmproxy/encoding.py (limited to 'libmproxy/encoding.py') 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 -- cgit v1.2.3