diff --git a/sdk/core/azure-core/CHANGELOG.md b/sdk/core/azure-core/CHANGELOG.md index 4b1a6efc76f0..441fc3877c1b 100644 --- a/sdk/core/azure-core/CHANGELOG.md +++ b/sdk/core/azure-core/CHANGELOG.md @@ -1,6 +1,11 @@ # Release History -## 1.10.1 (Unreleased) +## 1.11.0 (Unreleased) + +### Features + +- Add `raise_for_status` method onto `HttpResponse`. Calling `response.raise_for_status()` on a response with an error code +will raise an `HttpResponseError`. Calling it on a good response will do nothing #16399 ## 1.10.0 (2021-01-11) diff --git a/sdk/core/azure-core/azure/core/_version.py b/sdk/core/azure-core/azure/core/_version.py index d0c3909f631d..835c69b14b08 100644 --- a/sdk/core/azure-core/azure/core/_version.py +++ b/sdk/core/azure-core/azure/core/_version.py @@ -9,4 +9,4 @@ # regenerated. # -------------------------------------------------------------------------- -VERSION = "1.10.1" +VERSION = "1.11.0" diff --git a/sdk/core/azure-core/azure/core/pipeline/transport/_base.py b/sdk/core/azure-core/azure/core/pipeline/transport/_base.py index 16c873344de3..c77212d33e69 100644 --- a/sdk/core/azure-core/azure/core/pipeline/transport/_base.py +++ b/sdk/core/azure-core/azure/core/pipeline/transport/_base.py @@ -65,6 +65,7 @@ from six.moves.http_client import HTTPConnection, HTTPResponse as _HTTPResponse +from azure.core.exceptions import HttpResponseError from azure.core.pipeline import ( ABC, AbstractContextManager, @@ -583,6 +584,14 @@ def _get_raw_parts(self, http_response_type=None): requests = self.request.multipart_mixed_info[0] # type: List[HttpRequest] return self._decode_parts(message, http_response_type, requests) + def raise_for_status(self): + # type () -> None + """Raises an HttpResponseError if the response has an error status code. + If response is good, does nothing. + """ + if self.status_code >= 400: + raise HttpResponseError(response=self) + class HttpResponse(_HttpResponseBase): # pylint: disable=abstract-method def stream_download(self, pipeline): diff --git a/sdk/core/azure-core/tests/async_tests/test_basic_transport_async.py b/sdk/core/azure-core/tests/async_tests/test_basic_transport_async.py index 98cd7cc1b84a..90dbfc0ec6e6 100644 --- a/sdk/core/azure-core/tests/async_tests/test_basic_transport_async.py +++ b/sdk/core/azure-core/tests/async_tests/test_basic_transport_async.py @@ -14,6 +14,7 @@ from azure.core.pipeline.transport import HttpRequest, AsyncHttpResponse, AsyncHttpTransport, AioHttpTransport from azure.core.pipeline.policies import HeadersPolicy from azure.core.pipeline import AsyncPipeline +from azure.core.exceptions import HttpResponseError import pytest @@ -706,6 +707,17 @@ async def test_multipart_receive_with_combination_changeset_first(): assert parts[1].status_code == 202 assert parts[2].status_code == 404 +def test_raise_for_status_bad_response(): + response = MockResponse(request=None, body=None, content_type=None) + response.status_code = 400 + with pytest.raises(HttpResponseError): + response.raise_for_status() + +def test_raise_for_status_good_response(): + response = MockResponse(request=None, body=None, content_type=None) + response.status_code = 200 + response.raise_for_status() + @pytest.mark.asyncio async def test_multipart_receive_with_combination_changeset_middle(): diff --git a/sdk/core/azure-core/tests/test_basic_transport.py b/sdk/core/azure-core/tests/test_basic_transport.py index 647828ee53d1..aa86d122564a 100644 --- a/sdk/core/azure-core/tests/test_basic_transport.py +++ b/sdk/core/azure-core/tests/test_basic_transport.py @@ -7,6 +7,7 @@ from collections import OrderedDict import time import sys +import json try: from unittest import mock @@ -17,6 +18,7 @@ from azure.core.pipeline.transport._base import HttpClientTransportResponse, HttpTransport, _deserialize_response, _urljoin from azure.core.pipeline.policies import HeadersPolicy from azure.core.pipeline import Pipeline +from azure.core.exceptions import HttpResponseError import logging import pytest @@ -30,7 +32,6 @@ def __init__(self, request, body, content_type): def body(self): return self._body - @pytest.mark.skipif(sys.version_info < (3, 6), reason="Multipart serialization not supported on 2.7 + dict order not deterministic on 3.5") def test_http_request_serialization(): # Method + Url @@ -671,6 +672,17 @@ def on_response(self, request, response): assert res1.status_code == 404 assert res1.headers['x-ms-fun'] == 'true' +def test_raise_for_status_bad_response(): + response = MockResponse(request=None, body=None, content_type=None) + response.status_code = 400 + with pytest.raises(HttpResponseError): + response.raise_for_status() + +def test_raise_for_status_good_response(): + response = MockResponse(request=None, body=None, content_type=None) + response.status_code = 200 + response.raise_for_status() + def test_multipart_receive_with_one_changeset():