From 5a9991c0f93b71b5eac8d6c47b1ba6d5bb2004c7 Mon Sep 17 00:00:00 2001 From: Sean Quah Date: Thu, 28 Apr 2022 14:48:23 +0100 Subject: [PATCH] Capture the `Deferred` for request cancellation in `_AsyncResource` All async request processing goes through `_AsyncResource`, so this is the only place where a `Deferred` needs to be captured for cancellation. Unfortunately, the same isn't true for determining whether a request can be cancelled. Each of `RestServlet`, `BaseFederationServlet`, `DirectServe{Html,Json}Resource` and `ReplicationEndpoint` have different wrappers around the method doing the request handling and they all need to be handled separately. Signed-off-by: Sean Quah --- synapse/http/server.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/synapse/http/server.py b/synapse/http/server.py index f19c0c4f2d..0ba427faf6 100644 --- a/synapse/http/server.py +++ b/synapse/http/server.py @@ -331,7 +331,9 @@ class _AsyncResource(resource.Resource, metaclass=abc.ABCMeta): def render(self, request: SynapseRequest) -> int: """This gets called by twisted every time someone sends us a request.""" - defer.ensureDeferred(self._async_render_wrapper(request)) + request.render_deferred = defer.ensureDeferred( + self._async_render_wrapper(request) + ) return NOT_DONE_YET @wrap_async_request_handler