Skip to content

Commit 6e63b23

Browse files
committed
HTTPResponse.request should always be an HTTPRequest, never a _RequestProxy.
Closes tornadoweb#718.
1 parent fedb7f6 commit 6e63b23

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

tornado/httpclient.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,10 @@ class HTTPResponse(object):
373373
def __init__(self, request, code, headers=None, buffer=None,
374374
effective_url=None, error=None, request_time=None,
375375
time_info=None, reason=None):
376-
self.request = request
376+
if isinstance(request, _RequestProxy):
377+
self.request = request.request
378+
else:
379+
self.request = request
377380
self.code = code
378381
self.reason = reason or httputil.responses.get(code, "Unknown")
379382
if headers is not None:

tornado/test/httpclient_test.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,19 @@ def test_future_http_error(self):
334334
self.assertEqual(e.code, 404)
335335
self.assertEqual(e.response.code, 404)
336336

337+
@gen_test
338+
def test_reuse_request_from_response(self):
339+
# The response.request attribute should be an HTTPRequest, not
340+
# a _RequestProxy.
341+
# This test uses self.http_client.fetch because self.fetch calls
342+
# self.get_url on the input unconditionally.
343+
url = self.get_url('/hello')
344+
response = yield self.http_client.fetch(url)
345+
self.assertEqual(response.request.url, url)
346+
self.assertTrue(isinstance(response.request, HTTPRequest))
347+
response2 = yield self.http_client.fetch(response.request)
348+
self.assertEqual(response2.body, b'Hello world!')
349+
337350

338351
class RequestProxyTest(unittest.TestCase):
339352
def test_request_set(self):

0 commit comments

Comments
 (0)