Add last few changes and add a quick test
authorIan Cordasco <graffatcolmingov@gmail.com>
Sat, 25 Oct 2014 03:23:15 +0000 (22:23 -0500)
committerIan Cordasco <graffatcolmingov@gmail.com>
Wed, 12 Nov 2014 19:56:28 +0000 (13:56 -0600)
requests/adapters.py
requests/exceptions.py
test_requests.py

index df3345fd68e6cecc63b39a7cfc6bc7fa9c50b6cc..723b8179a11a7ae0e2d53f523f88d387d2b83d24 100644 (file)
@@ -26,14 +26,15 @@ from .packages.urllib3.exceptions import ProxyError as _ProxyError
 from .packages.urllib3.exceptions import ProtocolError
 from .packages.urllib3.exceptions import ReadTimeoutError
 from .packages.urllib3.exceptions import SSLError as _SSLError
+from .packages.urllib3.exceptions import ResponseError
 from .cookies import extract_cookies_to_jar
 from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError,
-                         ProxyError)
+                         ProxyError, RetryError)
 from .auth import _basic_auth_str
 
 DEFAULT_POOLBLOCK = False
 DEFAULT_POOLSIZE = 10
-DEFAULT_RETRIES = object()
+DEFAULT_RETRIES = 0
 
 
 class BaseAdapter(object):
@@ -79,7 +80,7 @@ class HTTPAdapter(BaseAdapter):
     def __init__(self, pool_connections=DEFAULT_POOLSIZE,
                  pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES,
                  pool_block=DEFAULT_POOLBLOCK):
-        if max_retries is DEFAULT_RETRIES:
+        if max_retries == DEFAULT_RETRIES:
             self.max_retries = Retry(0, read=False)
         else:
             self.max_retries = Retry.from_int(max_retries)
@@ -415,6 +416,9 @@ class HTTPAdapter(BaseAdapter):
             if isinstance(e.reason, ConnectTimeoutError):
                 raise ConnectTimeout(e, request=request)
 
+            if isinstance(e.reason, ResponseError):
+                raise RetryError(e, request=request)
+
             raise ConnectionError(e, request=request)
 
         except _ProxyError as e:
index 34c7a0dbffc39a6684048e6ea7274b18ce993a6e..89135a802eb1a87e15aa5d3e8a94ed0fce50273b 100644 (file)
@@ -90,5 +90,10 @@ class ChunkedEncodingError(RequestException):
 class ContentDecodingError(RequestException, BaseHTTPError):
     """Failed to decode response content"""
 
+
 class StreamConsumedError(RequestException, TypeError):
     """The content for this response was already consumed"""
+
+
+class RetryError(RequestException):
+    """Custom retries logic failed"""
index 4a05cb2e7c10b14bad5b4aad177b25f6905c8163..4624f095ad6d024e5e64b2efb86c9725e12871fb 100755 (executable)
@@ -20,7 +20,7 @@ from requests.compat import (
 from requests.cookies import cookiejar_from_dict, morsel_to_cookie
 from requests.exceptions import (ConnectionError, ConnectTimeout,
                                  InvalidSchema, InvalidURL, MissingSchema,
-                                 ReadTimeout, Timeout)
+                                 ReadTimeout, Timeout, RetryError)
 from requests.models import PreparedRequest
 from requests.structures import CaseInsensitiveDict
 from requests.sessions import SessionRedirectMixin
@@ -1520,6 +1520,7 @@ def test_prepared_request_complete_copy():
     )
     assert_copy(p, p.copy())
 
+
 def test_prepare_unicode_url():
     p = PreparedRequest()
     p.prepare(
@@ -1529,5 +1530,16 @@ def test_prepare_unicode_url():
     )
     assert_copy(p, p.copy())
 
+
+def test_urllib3_retries():
+    from requests.packages.urllib3.util import Retry
+    s = requests.Session()
+    s.mount('https://', HTTPAdapter(max_retries=Retry(
+        total=2, status_forcelist=[500]
+    )))
+
+    with pytest.raises(RetryError):
+        s.get('https://httpbin.org/status/500')
+
 if __name__ == '__main__':
     unittest.main()