summary refs log tree commit diff
path: root/synapse/http/server.py
diff options
context:
space:
mode:
authorSean Quah <8349537+squahtx@users.noreply.github.com>2022-05-11 12:25:13 +0100
committerGitHub <noreply@github.com>2022-05-11 12:25:13 +0100
commit9d8e380d2e8267129de921b9b926257c36417cd2 (patch)
tree97bb00ba5fb4ba829992529ebbfaffb1cf173a33 /synapse/http/server.py
parentRespect the `@cancellable` flag for `DirectServe{Html,Json}Resource`s (#12698) (diff)
downloadsynapse-9d8e380d2e8267129de921b9b926257c36417cd2.tar.xz
Respect the `@cancellable` flag for `RestServlet`s and `BaseFederationServlet`s (#12699)
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 <seanq@element.io>
Diffstat (limited to 'synapse/http/server.py')
-rw-r--r--synapse/http/server.py5
1 files changed, 5 insertions, 0 deletions
diff --git a/synapse/http/server.py b/synapse/http/server.py

index f6d4d8db86..756c6e1aee 100644 --- a/synapse/http/server.py +++ b/synapse/http/server.py
@@ -314,6 +314,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. @@ -544,6 +547,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