2 files changed, 8 insertions, 5 deletions
diff --git a/synapse/http/server.py b/synapse/http/server.py
index 8c96f2196e..4b4debc5cd 100644
--- a/synapse/http/server.py
+++ b/synapse/http/server.py
@@ -344,7 +344,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
diff --git a/synapse/http/site.py b/synapse/http/site.py
index f7f1c57042..eeec74b78a 100644
--- a/synapse/http/site.py
+++ b/synapse/http/site.py
@@ -92,11 +92,12 @@ class SynapseRequest(Request):
# we can't yet create the logcontext, as we don't know the method.
self.logcontext: Optional[LoggingContext] = None
- # The `Deferred` to cancel if the client disconnects early. Expected to be set
- # by `Resource.render`.
+ # The `Deferred` to cancel if the client disconnects early and
+ # `is_render_cancellable` is set. Expected to be set by `Resource.render`.
self.render_deferred: Optional["Deferred[None]"] = None
- # A boolean indicating whether `_render_deferred` should be cancelled if the
- # client disconnects early. Expected to be set during `Resource.render`.
+ # A boolean indicating whether `render_deferred` should be cancelled if the
+ # client disconnects early. Expected to be set by the coroutine started by
+ # `Resource.render`, if rendering is asynchronous.
self.is_render_cancellable = False
global _next_request_seq
|