Honor session hooks
authorIan Cordasco <graffatcolmingov@gmail.com>
Mon, 7 Oct 2013 17:23:16 +0000 (12:23 -0500)
committerIan Cordasco <graffatcolmingov@gmail.com>
Mon, 7 Oct 2013 17:23:16 +0000 (12:23 -0500)
requests/sessions.py

index aa956d3f3ff0506430e4bf100028bb7cee3e7745..8220036326bd3c66c09ab3579c42b99dd566d5af 100644 (file)
@@ -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