Include parsed error info in TransportError in async connections (#226)
Passing the Content-Type to `_raise_errors` will cause the json body to be parsed and included in the `TransportError`. This matches the behaviour of the sync client. Fixes #225 Signed-off-by: Gordon Govan <gg@kialo.com>
This commit is contained in:
@@ -14,6 +14,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
||||
### Fixed
|
||||
- Fixed import cycle when importing async helpers ([#311](https://github.com/opensearch-project/opensearch-py/pull/311))
|
||||
- Fixed userguide for async client ([#340](https://github.com/opensearch-project/opensearch-py/pull/340))
|
||||
- Include parsed error info in TransportError in async connections (fixes #225) ([#226](https://github.com/opensearch-project/opensearch-py/pull/226)
|
||||
### Security
|
||||
- Fixed CVE-2022-23491 reported in opensearch-dsl-py ([#295](https://github.com/opensearch-project/opensearch-py/pull/295))
|
||||
- Update ci workflows ([#318](https://github.com/opensearch-project/opensearch-py/pull/318))
|
||||
|
||||
@@ -331,7 +331,11 @@ class AIOHttpConnection(AsyncConnection):
|
||||
status_code=response.status,
|
||||
response=raw_data,
|
||||
)
|
||||
self._raise_error(response.status, raw_data)
|
||||
self._raise_error(
|
||||
response.status,
|
||||
raw_data,
|
||||
response.headers.get("content-type"),
|
||||
)
|
||||
|
||||
self.log_request_success(
|
||||
method, str(url), url_path, orig_body, response.status, raw_data, duration
|
||||
|
||||
@@ -42,7 +42,7 @@ from pytest import raises
|
||||
from opensearchpy import AIOHttpConnection, AsyncOpenSearch, __versionstr__, serializer
|
||||
from opensearchpy.compat import reraise_exceptions
|
||||
from opensearchpy.connection import Connection, async_connections
|
||||
from opensearchpy.exceptions import ConnectionError
|
||||
from opensearchpy.exceptions import ConnectionError, TransportError
|
||||
|
||||
pytestmark = pytest.mark.asyncio
|
||||
|
||||
@@ -53,7 +53,13 @@ def gzip_decompress(data):
|
||||
|
||||
|
||||
class TestAIOHttpConnection:
|
||||
async def _get_mock_connection(self, connection_params={}, response_body=b"{}"):
|
||||
async def _get_mock_connection(
|
||||
self,
|
||||
connection_params={},
|
||||
response_code=200,
|
||||
response_body=b"{}",
|
||||
response_headers={},
|
||||
):
|
||||
con = AIOHttpConnection(**connection_params)
|
||||
await con._create_aiohttp_session()
|
||||
|
||||
@@ -69,8 +75,8 @@ class TestAIOHttpConnection:
|
||||
return response_body.decode("utf-8", "surrogatepass")
|
||||
|
||||
dummy_response = DummyResponse()
|
||||
dummy_response.headers = CIMultiDict()
|
||||
dummy_response.status = 200
|
||||
dummy_response.headers = CIMultiDict(**response_headers)
|
||||
dummy_response.status = response_code
|
||||
_dummy_request.call_args = (args, kwargs)
|
||||
return dummy_response
|
||||
|
||||
@@ -298,6 +304,20 @@ class TestAIOHttpConnection:
|
||||
await conn.perform_request("GET", "/")
|
||||
assert str(e.value) == "Wasn't modified!"
|
||||
|
||||
async def test_json_errors_are_parsed(self):
|
||||
con = await self._get_mock_connection(
|
||||
response_code=400,
|
||||
response_body=b'{"error": {"type": "snapshot_in_progress_exception"}}',
|
||||
response_headers={"Content-Type": "application/json;"},
|
||||
)
|
||||
try:
|
||||
with pytest.raises(TransportError) as e:
|
||||
await con.perform_request("POST", "/", body=b'{"some": "json"')
|
||||
|
||||
assert e.value.error == "snapshot_in_progress_exception"
|
||||
finally:
|
||||
await con.close()
|
||||
|
||||
|
||||
class TestConnectionHttpbin:
|
||||
"""Tests the HTTP connection implementations against a live server E2E"""
|
||||
|
||||
Reference in New Issue
Block a user