diff --git a/sdk/core/azure-core/azure/core/pipeline/transport/requests_basic.py b/sdk/core/azure-core/azure/core/pipeline/transport/requests_basic.py index 95757edb63dd..d18d63a436f1 100644 --- a/sdk/core/azure-core/azure/core/pipeline/transport/requests_basic.py +++ b/sdk/core/azure-core/azure/core/pipeline/transport/requests_basic.py @@ -246,7 +246,7 @@ def send(self, request, **kwargs): # type: ignore allow_redirects=False, **kwargs) - except urllib3.exceptions.NewConnectionError as err: + except (urllib3.exceptions.NewConnectionError, urllib3.exceptions.ConnectTimeoutError) as err: error = ServiceRequestError(err, error=err) except requests.exceptions.ReadTimeout as err: error = ServiceResponseError(err, error=err) diff --git a/sdk/core/azure-core/tests/test_pipeline.py b/sdk/core/azure-core/tests/test_pipeline.py index e9df06b0d72a..0c8df68e03bd 100644 --- a/sdk/core/azure-core/tests/test_pipeline.py +++ b/sdk/core/azure-core/tests/test_pipeline.py @@ -58,7 +58,7 @@ RequestsTransport ) -from azure.core.configuration import Configuration +from azure.core.exceptions import AzureError def test_sans_io_exception(): @@ -107,6 +107,20 @@ def test_basic_requests(self): assert pipeline._transport.session is None assert response.http_response.status_code == 200 + def test_requests_socket_timeout(self): + conf = Configuration() + request = HttpRequest("GET", "https://bing.com") + policies = [ + UserAgentPolicy("myusergant"), + RedirectPolicy() + ] + # Sometimes this will raise a read timeout, sometimes a socket timeout depending on timing. + # Either way, the error should always be wrapped as an AzureError to ensure it's caught + # by the retry policy. + with pytest.raises(AzureError): + with Pipeline(RequestsTransport(), policies=policies) as pipeline: + response = pipeline.run(request, connection_timeout=0.000001) + def test_basic_requests_separate_session(self): session = requests.Session()