diff options
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 |