Skip to content

Commit 94c2735

Browse files
authored
[core] add raise_for_status to HttpResponse (Azure#16399)
1 parent b6d65fa commit 94c2735

File tree

5 files changed

+41
-3
lines changed

5 files changed

+41
-3
lines changed

sdk/core/azure-core/CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# Release History
22

3-
## 1.10.1 (Unreleased)
3+
## 1.11.0 (Unreleased)
4+
5+
### Features
6+
7+
- Add `raise_for_status` method onto `HttpResponse`. Calling `response.raise_for_status()` on a response with an error code
8+
will raise an `HttpResponseError`. Calling it on a good response will do nothing #16399
49

510

611
## 1.10.0 (2021-01-11)

sdk/core/azure-core/azure/core/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
# regenerated.
1010
# --------------------------------------------------------------------------
1111

12-
VERSION = "1.10.1"
12+
VERSION = "1.11.0"

sdk/core/azure-core/azure/core/pipeline/transport/_base.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565

6666
from six.moves.http_client import HTTPConnection, HTTPResponse as _HTTPResponse
6767

68+
from azure.core.exceptions import HttpResponseError
6869
from azure.core.pipeline import (
6970
ABC,
7071
AbstractContextManager,
@@ -583,6 +584,14 @@ def _get_raw_parts(self, http_response_type=None):
583584
requests = self.request.multipart_mixed_info[0] # type: List[HttpRequest]
584585
return self._decode_parts(message, http_response_type, requests)
585586

587+
def raise_for_status(self):
588+
# type () -> None
589+
"""Raises an HttpResponseError if the response has an error status code.
590+
If response is good, does nothing.
591+
"""
592+
if self.status_code >= 400:
593+
raise HttpResponseError(response=self)
594+
586595

587596
class HttpResponse(_HttpResponseBase): # pylint: disable=abstract-method
588597
def stream_download(self, pipeline):

sdk/core/azure-core/tests/async_tests/test_basic_transport_async.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from azure.core.pipeline.transport import HttpRequest, AsyncHttpResponse, AsyncHttpTransport, AioHttpTransport
1515
from azure.core.pipeline.policies import HeadersPolicy
1616
from azure.core.pipeline import AsyncPipeline
17+
from azure.core.exceptions import HttpResponseError
1718

1819
import pytest
1920

@@ -706,6 +707,17 @@ async def test_multipart_receive_with_combination_changeset_first():
706707
assert parts[1].status_code == 202
707708
assert parts[2].status_code == 404
708709

710+
def test_raise_for_status_bad_response():
711+
response = MockResponse(request=None, body=None, content_type=None)
712+
response.status_code = 400
713+
with pytest.raises(HttpResponseError):
714+
response.raise_for_status()
715+
716+
def test_raise_for_status_good_response():
717+
response = MockResponse(request=None, body=None, content_type=None)
718+
response.status_code = 200
719+
response.raise_for_status()
720+
709721

710722
@pytest.mark.asyncio
711723
async def test_multipart_receive_with_combination_changeset_middle():

sdk/core/azure-core/tests/test_basic_transport.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from collections import OrderedDict
88
import time
99
import sys
10+
import json
1011

1112
try:
1213
from unittest import mock
@@ -17,6 +18,7 @@
1718
from azure.core.pipeline.transport._base import HttpClientTransportResponse, HttpTransport, _deserialize_response, _urljoin
1819
from azure.core.pipeline.policies import HeadersPolicy
1920
from azure.core.pipeline import Pipeline
21+
from azure.core.exceptions import HttpResponseError
2022
import logging
2123
import pytest
2224

@@ -30,7 +32,6 @@ def __init__(self, request, body, content_type):
3032
def body(self):
3133
return self._body
3234

33-
3435
@pytest.mark.skipif(sys.version_info < (3, 6), reason="Multipart serialization not supported on 2.7 + dict order not deterministic on 3.5")
3536
def test_http_request_serialization():
3637
# Method + Url
@@ -671,6 +672,17 @@ def on_response(self, request, response):
671672
assert res1.status_code == 404
672673
assert res1.headers['x-ms-fun'] == 'true'
673674

675+
def test_raise_for_status_bad_response():
676+
response = MockResponse(request=None, body=None, content_type=None)
677+
response.status_code = 400
678+
with pytest.raises(HttpResponseError):
679+
response.raise_for_status()
680+
681+
def test_raise_for_status_good_response():
682+
response = MockResponse(request=None, body=None, content_type=None)
683+
response.status_code = 200
684+
response.raise_for_status()
685+
674686

675687
def test_multipart_receive_with_one_changeset():
676688

0 commit comments

Comments
 (0)