diff --git a/requests/models.py b/requests/models.py index 8319525e..abee9a62 100644 --- a/requests/models.py +++ b/requests/models.py @@ -526,6 +526,7 @@ class Request(object): conn = self._poolmanager.connection_from_url(url) else: conn = connectionpool.connection_from_url(url) + self.headers['Connection'] = 'close' except LocationParseError as e: raise InvalidURL(e) diff --git a/tests/test_requests.py b/tests/test_requests.py index db176f51..a7019395 100755 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -848,14 +848,28 @@ class RequestsTestSuite(TestSetup, TestBaseMixin, unittest.TestCase): r.text def test_max_redirects(self): + """Test the max_redirects config variable, normally and under safe_mode.""" def unsafe_callable(): - requests.get("http://httpbin.org/redirect/3", config=dict(max_redirects=2)) + requests.get(httpbin('redirect', '3'), config=dict(max_redirects=2)) self.assertRaises(requests.exceptions.TooManyRedirects, unsafe_callable) # add safe mode - response = requests.get("http://httpbin.org/redirect/3", config=dict(safe_mode=True, max_redirects=2)) + response = requests.get(httpbin('redirect', '3'), config=dict(safe_mode=True, max_redirects=2)) self.assertTrue(response.content is None) self.assertTrue(isinstance(response.error, requests.exceptions.TooManyRedirects)) + def test_connection_keepalive_and_close(self): + """Test that we send 'Connection: close' when keep_alive is disabled.""" + # keep-alive should be on by default + r1 = requests.get(httpbin('get')) + # XXX due to proxying issues, test the header sent back by httpbin, rather than + # the header reported in its message body. See kennethreitz/httpbin#46 + self.assertEqual(r1.headers['Connection'].lower(), 'keep-alive') + + # but when we disable it, we should send a 'Connection: close' + # and get the same back: + r2 = requests.get(httpbin('get'), config=dict(keep_alive=False)) + self.assertEqual(r2.headers['Connection'].lower(), 'close') + if __name__ == '__main__': unittest.main()