From 8b3f20ca9157f77c6a20bf9b29bba86fec3b04df Mon Sep 17 00:00:00 2001 From: Cory Benfield Date: Sat, 29 Jul 2017 12:09:04 +0100 Subject: [PATCH 1/3] Add failing test for #4209 --- tests/test_requests.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/test_requests.py b/tests/test_requests.py index cfafc6e4..7ef6bfee 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -23,7 +23,7 @@ from requests.cookies import ( from requests.exceptions import ( ConnectionError, ConnectTimeout, InvalidSchema, InvalidURL, MissingSchema, ReadTimeout, Timeout, RetryError, TooManyRedirects, - ProxyError, InvalidHeader, UnrewindableBodyError) + ProxyError, InvalidHeader, UnrewindableBodyError, SSLError) from requests.models import PreparedRequest from requests.structures import CaseInsensitiveDict from requests.sessions import SessionRedirectMixin @@ -812,6 +812,15 @@ class TestRequests: item.category.__name__ for item in warning_records) assert warnings_category == warnings_expected + def test_certificate_failure(self, httpbin_secure): + """ + When underlying SSL problems occur, an SSLError is raised. + """ + with pytest.raises(SSLError): + # Our local httpbin does not have a trusted CA, so this call will + # fail if we use our default trust bundle. + requests.get(httpbin_secure('status', '200')) + def test_urlencoded_get_query_multivalued_param(self, httpbin): r = requests.get(httpbin('get'), params=dict(test=['foo', 'baz'])) From 4f49f6b3ed99cf73feaec762f96f44574ac54134 Mon Sep 17 00:00:00 2001 From: Cory Benfield Date: Sat, 29 Jul 2017 12:12:11 +0100 Subject: [PATCH 2/3] Correctly raise SSLError from urllib3. --- requests/adapters.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/requests/adapters.py b/requests/adapters.py index 205da0cd..00f8792b 100644 --- a/requests/adapters.py +++ b/requests/adapters.py @@ -501,6 +501,10 @@ class HTTPAdapter(BaseAdapter): if isinstance(e.reason, _ProxyError): raise ProxyError(e, request=request) + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + raise ConnectionError(e, request=request) except ClosedPoolError as e: @@ -511,6 +515,7 @@ class HTTPAdapter(BaseAdapter): except (_SSLError, _HTTPError) as e: if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 raise SSLError(e, request=request) elif isinstance(e, ReadTimeoutError): raise ReadTimeout(e, request=request) From 9e0fb37fff4ad0a9a51ed6b522d2eb47f678d9a3 Mon Sep 17 00:00:00 2001 From: Cory Benfield Date: Sat, 29 Jul 2017 12:13:55 +0100 Subject: [PATCH 3/3] Changelog for #4209 --- HISTORY.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 0fe72a22..d3ad234e 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -12,6 +12,9 @@ dev **Bugfixes** +- Fixed issue where Requests would raise ``ConnectionError`` instead of + ``SSLError`` when encoutering SSL problems when using urllib3 v1.22. + 2.18.2 (2017-07-25) +++++++++++++++++++