summary refs log tree commit diff
path: root/synapse/http/matrixfederationclient.py
diff options
context:
space:
mode:
authorSean Quah <8349537+squahtx@users.noreply.github.com>2022-05-27 11:03:05 +0100
committerGitHub <noreply@github.com>2022-05-27 11:03:05 +0100
commitbb7a6377652755584c327d28b131c467d999280d (patch)
treeb7ef4629948d813cba7f0127ad1fd46c838c81d1 /synapse/http/matrixfederationclient.py
parentAdd an option allowing users to use their password to reauthenticate even tho... (diff)
downloadsynapse-bb7a6377652755584c327d28b131c467d999280d.tar.xz
Close `ijson` coroutines ourselves instead of letting the GC close them (#12875)
Hopefully this means that exceptions raised due to truncated JSON
get a sensible logging context and stack.

Signed-off-by: Sean Quah <seanq@matrix.org>
Diffstat (limited to '')
-rw-r--r--synapse/http/matrixfederationclient.py11
1 files changed, 11 insertions, 0 deletions
diff --git a/synapse/http/matrixfederationclient.py b/synapse/http/matrixfederationclient.py

index 0b9475debd..901c47f756 100644 --- a/synapse/http/matrixfederationclient.py +++ b/synapse/http/matrixfederationclient.py
@@ -225,6 +225,7 @@ async def _handle_response( if max_response_size is None: max_response_size = MAX_RESPONSE_SIZE + finished = False try: check_content_type_is(response.headers, parser.CONTENT_TYPE) @@ -233,6 +234,7 @@ async def _handle_response( length = await make_deferred_yieldable(d) + finished = True value = parser.finish() except BodyExceededMaxSize as e: # The response was too big. @@ -283,6 +285,15 @@ async def _handle_response( e, ) raise + finally: + if not finished: + # There was an exception and we didn't `finish()` the parse. + # Let the parser know that it can free up any resources. + try: + parser.finish() + except Exception: + # Ignore any additional exceptions. + pass time_taken_secs = reactor.seconds() - start_ms / 1000