summary refs log tree commit diff
diff options
context:
space:
mode:
authorRichard van der Hoff <1389908+richvdh@users.noreply.github.com>2018-09-25 11:52:06 +0100
committerGitHub <noreply@github.com>2018-09-25 11:52:06 +0100
commit94f7befc31b65431270f1dd462113fdeb334545e (patch)
tree79e74f2420d611e64459a664bb063d9c89d37c44
parentMerge pull request #3947 from matrix-org/rav/attr_version (diff)
parentNewsfile (diff)
downloadsynapse-94f7befc31b65431270f1dd462113fdeb334545e.tar.xz
Merge pull request #3925 from matrix-org/erikj/fix_producers_unregistered
Fix spurious exceptions when client closes conncetion
-rw-r--r--changelog.d/3925.misc1
-rw-r--r--synapse/http/server.py49
2 files changed, 36 insertions, 14 deletions
diff --git a/changelog.d/3925.misc b/changelog.d/3925.misc
new file mode 100644

index 0000000000..3e41f78ff5 --- /dev/null +++ b/changelog.d/3925.misc
@@ -0,0 +1 @@ +Fix spurious exceptions when remote http client closes conncetion diff --git a/synapse/http/server.py b/synapse/http/server.py
index 2d5c23e673..b4b25cab19 100644 --- a/synapse/http/server.py +++ b/synapse/http/server.py
@@ -84,10 +84,21 @@ def wrap_json_request_handler(h): logger.info( "%s SynapseError: %s - %s", request, code, e.msg ) - respond_with_json( - request, code, e.error_dict(), send_cors=True, - pretty_print=_request_user_agent_is_curl(request), - ) + + # Only respond with an error response if we haven't already started + # writing, otherwise lets just kill the connection + if request.startedWriting: + if request.transport: + try: + request.transport.abortConnection() + except Exception: + # abortConnection throws if the connection is already closed + pass + else: + respond_with_json( + request, code, e.error_dict(), send_cors=True, + pretty_print=_request_user_agent_is_curl(request), + ) except Exception: # failure.Failure() fishes the original Failure out @@ -100,16 +111,26 @@ def wrap_json_request_handler(h): request, f.getTraceback().rstrip(), ) - respond_with_json( - request, - 500, - { - "error": "Internal server error", - "errcode": Codes.UNKNOWN, - }, - send_cors=True, - pretty_print=_request_user_agent_is_curl(request), - ) + # Only respond with an error response if we haven't already started + # writing, otherwise lets just kill the connection + if request.startedWriting: + if request.transport: + try: + request.transport.abortConnection() + except Exception: + # abortConnection throws if the connection is already closed + pass + else: + respond_with_json( + request, + 500, + { + "error": "Internal server error", + "errcode": Codes.UNKNOWN, + }, + send_cors=True, + pretty_print=_request_user_agent_is_curl(request), + ) return wrap_async_request_handler(wrapped_request_handler)