Fix the elapsed test and #1133
authorIan Cordasco <graffatcolmingov@gmail.com>
Wed, 30 Jan 2013 04:50:37 +0000 (23:50 -0500)
committerIan Cordasco <graffatcolmingov@gmail.com>
Wed, 30 Jan 2013 04:50:37 +0000 (23:50 -0500)
requests/sessions.py
test_requests.py

index de3f5b7..c2eebac 100644 (file)
@@ -75,7 +75,8 @@ def merge_kwargs(local_kwarg, default_kwarg):
 
 class SessionRedirectMixin(object):
 
-    def resolve_redirects(self, resp, req, stream=False, timeout=None, verify=True, cert=None, proxies=None):
+    def resolve_redirects(self, resp, req, stream=False, timeout=None,
+                          verify=True, cert=None, proxies=None):
         """Receives a Response. Returns a generator of Responses."""
 
         i = 0
@@ -276,24 +277,21 @@ class Session(SessionRedirectMixin):
         prep = req.prepare()
 
         # Send the request.
-        resp = self.send(prep, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies)
+        send_kwargs = {
+            'stream': stream,
+            'timeout': timeout,
+            'verify': verify,
+            'cert': cert,
+            'proxies': proxies,
+            'allow_redirects': allow_redirects,
+            'req': req,
+        }
+        resp = self.send(prep, **send_kwargs)
 
         # Persist cookies.
         for cookie in resp.cookies:
             self.cookies.set_cookie(cookie)
 
-        # Redirect resolving generator.
-        gen = self.resolve_redirects(resp, req, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies)
-
-        # Resolve redirects if allowed.
-        history = [r for r in gen] if allow_redirects else []
-
-        # Shuffle things around if there's history.
-        if history:
-            history.insert(0, resp)
-            resp = history.pop()
-            resp.history = tuple(history)
-
         return resp
 
     def get(self, url, **kwargs):
@@ -367,13 +365,49 @@ class Session(SessionRedirectMixin):
 
     def send(self, request, **kwargs):
         """Send a given PreparedRequest."""
+        # Set up variables needed for resolve_redirects and dispatching of
+        # hooks
+        allow_redirects = True
+        if 'allow_redirects' in kwargs:
+            allow_redirects = kwargs.pop('allow_redirects')
+        req = None
+        if 'req' in kwargs:
+            req = kwargs.pop('req')
+        stream = kwargs.get('stream', False)
+        timeout = kwargs.get('timeout')
+        verify = kwargs.get('verify')
+        cert = kwargs.get('cert')
+        proxies = kwargs.get('proxies')
         hooks = request.hooks
+
+        # Get the appropriate adapter to use
         adapter = self.get_adapter(url=request.url)
+
+        # Start time (approximately) of the request
         start = datetime.utcnow()
+        # Send the request
         r = adapter.send(request, **kwargs)
+        # Total elapsed time of the request (approximately)
         r.elapsed = datetime.utcnow() - start
+
+        # Redirect resolving generator.
+        gen = self.resolve_redirects(r, req, stream=stream, timeout=timeout,
+                                     verify=verify, cert=cert, proxies=proxies)
+
+        # Resolve redirects if allowed.
+        history = [resp for resp in gen] if allow_redirects else []
+
+        # Shuffle things around if there's history.
+        if history:
+            # Insert the first (original) request at the start
+            history.insert(0, r)
+            # Get the last request made
+            r = history.pop()
+            r.history = tuple(history)
+
         # Response manipulation hooks
         r = dispatch_hook('response', hooks, r)
+
         return r
 
     def get_adapter(self, url):
index c4b94b2..72c6eb7 100644 (file)
@@ -3,6 +3,7 @@
 
 """Tests for Requests."""
 
+from __future__ import division
 import json
 import os
 import unittest
@@ -323,7 +324,10 @@ class RequestsTestCase(unittest.TestCase):
 
     def test_time_elapsed_blank(self):
         r = requests.get(httpbin('get'))
-        self.assertTrue(r.elapsed.total_seconds() > 0.0)
+        td = r.elapsed
+        total_seconds = ((td.microseconds + (td.seconds + td.days * 24 * 3600)
+                         * 10**6) / 10**6)
+        self.assertTrue(total_seconds > 0.0)
 
     def test_response_is_iterable(self):
         r = requests.Response()