Make safe_mode play nice with timeout (fixes #312)
authorOri Livneh <ori.livneh@gmail.com>
Thu, 22 Dec 2011 21:52:29 +0000 (16:52 -0500)
committerOri Livneh <ori.livneh@gmail.com>
Thu, 22 Dec 2011 21:52:29 +0000 (16:52 -0500)
requests/models.py
test_requests.py

index 4bef293d3e0f8c4b8a4f1a2b60c1721a89a5709d..f9a9626b37567afc32467c09f70c2cd2ad7319a9 100644 (file)
@@ -438,6 +438,10 @@ class Request(object):
                     # Attach Cookie header to request.
                     self.headers['Cookie'] = cookie_header
 
+            # If the request fails but exceptions are suppressed,
+            # we'll build a blank response.
+            r = None
+
             try:
                 # Send the request.
                 r = conn.urlopen(
@@ -458,8 +462,6 @@ class Request(object):
             except MaxRetryError, e:
                 if not self.config.get('safe_mode', False):
                     raise ConnectionError(e)
-                else:
-                    r = None
 
             except (_SSLError, _HTTPError), e:
                 if not self.config.get('safe_mode', False):
@@ -597,7 +599,7 @@ class Response(object):
         def generate():
             chunk = []
 
-            while 1:
+            while True:
                 c = self.raw.read(1)
                 if not c:
                     break
index ebcb596d5ac2273597695ca2467a27a6e625e913..e547aa64df5f8a6dc3ca433964610839fb72d839 100755 (executable)
@@ -619,6 +619,17 @@ class RequestsTestSuite(unittest.TestCase):
         lines = '\n'.join(r.iter_lines())
         self.assertEqual(lines, quote)
 
+    def test_timeout(self):
+
+        # When not in safe mode, should raise Timeout exception
+        with self.assertRaises(requests.exceptions.Timeout):
+            r = requests.get(httpbin('stream', '1000'), timeout=0.0001)
+
+        # In safe mode, should return a blank response
+        r = requests.get(httpbin('stream', '1000'), timeout=0.0001,
+                config=dict(safe_mode=True))
+        self.assertIsNone(r.content)
+
 
 if __name__ == '__main__':
     unittest.main()