From a95bfd30324b59f54de7b18ae6209aecfe5c87fc Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Tue, 29 Jan 2013 23:50:37 -0500 Subject: [PATCH] Fix the elapsed test and #1133 --- requests/sessions.py | 62 ++++++++++++++++++++++++++++++++++++++++------------ test_requests.py | 6 ++++- 2 files changed, 53 insertions(+), 15 deletions(-) diff --git a/requests/sessions.py b/requests/sessions.py index de3f5b7..c2eebac 100644 --- a/requests/sessions.py +++ b/requests/sessions.py @@ -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): diff --git a/test_requests.py b/test_requests.py index c4b94b2..72c6eb7 100644 --- a/test_requests.py +++ b/test_requests.py @@ -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() -- 2.7.4