Skip to content

Commit

Permalink
Merge pull request #862 from Aiven-Open/jjaakola-aiven-handle-connect…
Browse files Browse the repository at this point in the history
…ion-error-in-request-handling

fix: handle ConnectionError in rapu._handle_messages
  • Loading branch information
aiven-anton authored May 7, 2024
2 parents a75cde8 + 79fb21a commit ee94d17
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 0 deletions.
5 changes: 5 additions & 0 deletions karapace/rapu.py
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,11 @@ async def _handle_request(
)
headers = {"Content-Type": "application/json"}
resp = aiohttp.web.Response(body=body, status=status.value, headers=headers)
except ConnectionError as connection_error:
# TCP level connection errors, e.g. TCP reset, client closes connection.
self.log.debug("Connection error.", exc_info=connection_error)
# No response can be returned and written to client, aiohttp expects some response here.
resp = aiohttp.web.Response(text="Connection error", status=HTTPStatus.INTERNAL_SERVER_ERROR.value)
except asyncio.CancelledError:
self.log.debug("Client closed connection")
raise
Expand Down
22 changes: 22 additions & 0 deletions tests/unit/test_rapu.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
Copyright (c) 2023 Aiven Ltd
See LICENSE for details
"""
from aiohttp.web import Request
from karapace.config import DEFAULTS
from karapace.karapace import KarapaceBase
from karapace.rapu import HTTPRequest, REST_ACCEPT_RE, REST_CONTENT_TYPE_RE
from unittest.mock import Mock


async def test_header_get():
Expand Down Expand Up @@ -154,3 +158,21 @@ def test_content_type_re():
"serialization_format": "json",
"general_format": None,
}


async def test_raise_connection_error_handling() -> None:
request_mock = Mock(spec=Request)
request_mock.read.side_effect = ConnectionError("Connection error test.")
callback_mock = Mock()

app = KarapaceBase(config=DEFAULTS)

response = await app._handle_request( # pylint: disable=protected-access
request=request_mock,
path_for_stats="/",
callback=callback_mock,
)

assert response.status == 500
request_mock.read.assert_has_calls([])
callback_mock.assert_not_called()

0 comments on commit ee94d17

Please sign in to comment.