From 2326bbf0999e99b57dafcebd966dd9bd942c52a2 Mon Sep 17 00:00:00 2001 From: Sean Quah Date: Thu, 28 Apr 2022 15:59:08 +0100 Subject: Respect the `@cancellable` flag for `RestServlet`s and `BaseFederationServlet`s Both `RestServlet`s and `BaseFederationServlet`s register their handlers with `HttpServer.register_paths` / `JsonResource.register_paths`. Update `JsonResource` to respect the `@cancellable` flag on handlers registered in this way. Although `ReplicationEndpoint` also registers itself using `register_paths`, it does not pass the handler method that would have the `@cancellable` flag directly, and so needs separate handling. Signed-off-by: Sean Quah --- synapse/http/server.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/synapse/http/server.py b/synapse/http/server.py index 7c1c1f9d49..046524f665 100644 --- a/synapse/http/server.py +++ b/synapse/http/server.py @@ -301,6 +301,9 @@ class HttpServer(Protocol): If the regex contains groups these gets passed to the callback via an unpacked tuple. + The callback may be marked with the `@cancellable` decorator, which will + cause request processing to be cancelled when clients disconnect early. + Args: method: The HTTP method to listen to. path_patterns: The regex used to match requests. @@ -531,6 +534,8 @@ class JsonResource(DirectServeJsonResource): async def _async_render(self, request: SynapseRequest) -> Tuple[int, Any]: callback, servlet_classname, group_dict = self._get_handler_for_request(request) + request.is_render_cancellable = is_method_cancellable(callback) + # Make sure we have an appropriate name for this handler in prometheus # (rather than the default of JsonResource). request.request_metrics.name = servlet_classname -- cgit 1.5.1