From: Ian Cordasco Date: Mon, 7 Oct 2013 17:23:16 +0000 (-0500) Subject: Honor session hooks X-Git-Tag: v2.1.0~10^2~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5bf396d5d12bf9debc667a509c84f640560da517;p=services%2Fpython-requests.git Honor session hooks --- diff --git a/requests/sessions.py b/requests/sessions.py index aa956d3..8220036 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -65,6 +65,27 @@ def merge_setting(request_setting, session_setting, dict_class=OrderedDict): return merged_setting +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """ + Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + ret = {} + for (k, v) in request_hooks.items(): + if v is not None: + ret[k] = set(v).union(session_hooks.get(k, [])) + + return ret + + class SessionRedirectMixin(object): def resolve_redirects(self, resp, req, stream=False, timeout=None, verify=True, cert=None, proxies=None): @@ -261,7 +282,7 @@ class Session(SessionRedirectMixin): params=merge_setting(request.params, self.params), auth=merge_setting(auth, self.auth), cookies=merged_cookies, - hooks=merge_setting(request.hooks, self.hooks), + hooks=merge_hooks(request.hooks, self.hooks), ) return p