From d12eac8669bc820c7fdd4efe47032112a6b41a1b Mon Sep 17 00:00:00 2001 From: Luca De Vitis Date: Tue, 23 Aug 2011 23:30:50 +0200 Subject: [PATCH] * hooks is a package now. * Added hooks.setup_hooks to setup multiple and default hooks * Added hooks.response hooks to unicode encoding, and uncompress response. * Modified hooks.dispatch_hooks api: don't need a key any more. --- requests/api.py | 16 ++++++------- requests/config.py | 4 +++- requests/{hooks.py => hooks/__init__.py} | 23 ++++++++++++++---- requests/models.py | 30 +++++++++++------------- 4 files changed, 43 insertions(+), 30 deletions(-) rename requests/{hooks.py => hooks/__init__.py} (61%) diff --git a/requests/api.py b/requests/api.py index 9acc1e5..9c78c17 100644 --- a/requests/api.py +++ b/requests/api.py @@ -14,7 +14,7 @@ This module impliments the Requests API. import config from .models import Request, Response, AuthObject from .status_codes import codes -from .hooks import dispatch_hooks +from hooks import setup_hooks, dispatch_hooks from .utils import cookiejar_from_dict from urlparse import urlparse @@ -43,10 +43,9 @@ def request(method, url, method = str(method).upper() - if cookies is None: - cookies = {} + cookies = cookiejar_from_dict(cookies or dict()) - cookies = cookiejar_from_dict(cookies) + hooks = setup_hooks(hooks or dict()) args = dict( method = method, @@ -61,23 +60,24 @@ def request(method, url, allow_redirects = allow_redirects, proxies = proxies or config.settings.proxies, ) + # Arguments manipulation hook. - args = dispatch_hooks('args', hooks, args) + args = dispatch_hooks(hooks.get('args', []), args) r = Request(**args) # Pre-request hook. - r = dispatch_hooks('pre_request', hooks, r) + r = dispatch_hooks(hooks.get('pre_request', []), r) # Send the HTTP Request. r.send() # Post-request hook. - r = dispatch_hooks('post_request', hooks, r) + r = dispatch_hooks(hooks.get('post_request', []), hooks, r) # Response manipulation hook. - r.response = dispatch_hooks('response', hooks, r.response) + r.response = dispatch_hooks(hooks.get('response', []), r.response) return r.response diff --git a/requests/config.py b/requests/config.py index 794109c..a92e1f5 100644 --- a/requests/config.py +++ b/requests/config.py @@ -62,7 +62,9 @@ settings.proxies = None settings.verbose = None settings.timeout = None settings.max_redirects = 30 -settings.decode_unicode = True +# settings.decode_unicode = True +settings.unicode_response = True +settings.decode_response = True #: Use socket.setdefaulttimeout() as fallback? settings.timeout_fallback = True diff --git a/requests/hooks.py b/requests/hooks/__init__.py similarity index 61% rename from requests/hooks.py rename to requests/hooks/__init__.py index 2fa97d0..8f7c6b1 100644 --- a/requests/hooks.py +++ b/requests/hooks/__init__.py @@ -24,8 +24,24 @@ Available hooks: import warnings from collections import Iterable +from .. import config +from response import unicode_response, decode_response -def dispatch_hooks(key, hooks, hook_data): +def setup_hooks(hooks): + """Setup hooks as a dictionary. Each value is a set of hooks.""" + + for key, values in hooks.items(): + hook_list = values if isinstance(values, Iterable) else [values] + hooks[key] = set(hook_list) + + # Also, based on settings, + if config.settings.unicode_response: + hooks.setdefault('response', set()).add(unicode_response) + if config.settings.decode_response: + hooks.setdefault('response', set()).add(decode_response) + return hooks + +def dispatch_hooks(hooks, hook_data): """Dispatches multiple hooks on a given piece of data. :param key: the hooks group to lookup @@ -36,13 +52,10 @@ def dispatch_hooks(key, hooks, hook_data): :param hook_data: the object on witch the hooks should be applied :type hook_data: object """ - hook_list = hooks.get(key, []) if hooks else [] - dispatching = hook_list if isinstance(hook_list, Iterable) else [hook_list] - for hook in dispatching: + for hook in hooks: try: # hook must be a callable hook_data = hook(hook_data) except Exception, why: warnings.warn(str(why)) return hook_data - diff --git a/requests/models.py b/requests/models.py index 5983c23..e199b3c 100644 --- a/requests/models.py +++ b/requests/models.py @@ -444,22 +444,20 @@ class Response(object): (if available). """ - if self._content is not None: - return self._content - - # Read the contents. - self._content = self.fo.read() - - # Decode GZip'd content. - if 'gzip' in self.headers.get('content-encoding', ''): - try: - self._content = decode_gzip(self._content) - except zlib.error: - pass - - # Decode unicode content. - if settings.decode_unicode: - self._content = get_unicode_from_response(self) + if self._content is None: + # Read the contents. + self._content = self.fo.read() + + # # Decode GZip'd content. + # if 'gzip' in self.headers.get('content-encoding', ''): + # try: + # self._content = decode_gzip(self._content) + # except zlib.error: + # pass + + # # Decode unicode content. + # if settings.decode_unicode: + # self._content = get_unicode_from_response(self) return self._content -- 2.34.1