]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Factor out gzip decompressor from SimpleAsyncHTTPClient into util.GzipDecompressor 529/head
authorAlek Storm <alek.storm@gmail.com>
Thu, 7 Jun 2012 20:43:57 +0000 (16:43 -0400)
committerAlek Storm <alek.storm@gmail.com>
Thu, 7 Jun 2012 20:43:57 +0000 (16:43 -0400)
tornado/simple_httpclient.py
tornado/util.py

index 80b3fb052ce91fb4d508afbf76ca4230bba650f0..24ec5da2aae25c12720de8ad44e6cf0dd5d03d7b 100644 (file)
@@ -6,7 +6,7 @@ from tornado.httpclient import HTTPRequest, HTTPResponse, HTTPError, AsyncHTTPCl
 from tornado.httputil import HTTPHeaders
 from tornado.iostream import IOStream, SSLIOStream
 from tornado import stack_context
-from tornado.util import b
+from tornado.util import b, GzipDecompressor
 
 import base64
 import collections
@@ -20,7 +20,6 @@ import socket
 import sys
 import time
 import urlparse
-import zlib
 
 try:
     from io import BytesIO  # python 3
@@ -376,9 +375,7 @@ class _HTTPConnection(object):
 
         if (self.request.use_gzip and
             self.headers.get("Content-Encoding") == "gzip"):
-            # Magic parameter makes zlib module understand gzip header
-            # http://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib
-            self._decompressor = zlib.decompressobj(16 + zlib.MAX_WBITS)
+            self._decompressor = GzipDecompressor()
         if self.headers.get("Transfer-Encoding") == "chunked":
             self.chunks = []
             self.stream.read_until(b("\r\n"), self._on_chunk_length)
@@ -420,7 +417,7 @@ class _HTTPConnection(object):
             self.stream.close()
             return
         if self._decompressor:
-            data = self._decompressor.decompress(data)
+            data = self._decompressor(data)
         if self.request.streaming_callback:
             if self.chunks is None:
                 # if chunks is not None, we already called streaming_callback
@@ -453,7 +450,7 @@ class _HTTPConnection(object):
         assert data[-2:] == b("\r\n")
         chunk = data[:-2]
         if self._decompressor:
-            chunk = self._decompressor.decompress(chunk)
+            chunk = self._decompressor(chunk)
         if self.request.streaming_callback is not None:
             self.request.streaming_callback(chunk)
         else:
index e19ca900166ae7914ca1da8d7566552c4da73acc..83b19f78f02e3e8f7eb8d0650b0a4636c2ccb37b 100644 (file)
@@ -2,6 +2,8 @@
 
 from __future__ import absolute_import, division, with_statement
 
+import zlib
+
 
 class ObjectDict(dict):
     """Makes a dictionary behave like an object."""
@@ -15,6 +17,16 @@ class ObjectDict(dict):
         self[name] = value
 
 
+class GzipDecompressor(object):
+    def __init__(self):
+        # Magic parameter makes zlib module understand gzip header
+        # http://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib
+        self.decompressobj = zlib.decompressobj(16 + zlib.MAX_WBITS)
+
+    def __call__(self, value):
+        return self.decompressobj.decompress(value)
+
+
 def import_object(name):
     """Imports an object by name.