Fix the elapsed test and #1133

This commit is contained in:
Ian Cordasco
2013-01-29 23:50:37 -05:00
parent 207a2744aa
commit a95bfd3032
2 changed files with 53 additions and 15 deletions
+48 -14
View 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):
+5 -1
View 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()