7575 UnrecognizedRequestError ,
7676)
7777from synapse .config .homeserver import HomeServerConfig
78- from synapse .logging .context import defer_to_thread , preserve_fn , run_in_background
78+ from synapse .logging .context import defer_to_thread , preserve_fn
7979from synapse .logging .opentracing import active_span , start_active_span , trace_servlet
8080from synapse .util import Clock , json_encoder
8181from synapse .util .caches import intern_dict
111111HTTP_STATUS_REQUEST_CANCELLED = 499
112112
113113
114- def return_json_error (
114+ async def return_json_error (
115115 f : failure .Failure , request : "SynapseRequest" , config : Optional [HomeServerConfig ]
116116) -> None :
117117 """Sends a JSON error response to clients."""
@@ -163,7 +163,7 @@ def return_json_error(
163163 # abortConnection throws if the connection is already closed
164164 pass
165165 else :
166- respond_with_json (
166+ await respond_with_json (
167167 request ,
168168 error_code ,
169169 error_dict ,
@@ -342,13 +342,13 @@ async def _async_render_wrapper(self, request: "SynapseRequest") -> None:
342342
343343 if callback_return is not None :
344344 code , response = callback_return
345- self ._send_response (request , code , response )
345+ await self ._send_response (request , code , response )
346346 except Exception :
347347 # failure.Failure() fishes the original Failure out
348348 # of our stack, and thus gives us a sensible stack
349349 # trace.
350350 f = failure .Failure ()
351- self ._send_error_response (f , request )
351+ await self ._send_error_response (f , request )
352352
353353 async def _async_render (
354354 self , request : "SynapseRequest"
@@ -380,7 +380,7 @@ async def _async_render(
380380 raise UnrecognizedRequestError (code = 405 )
381381
382382 @abc .abstractmethod
383- def _send_response (
383+ async def _send_response (
384384 self ,
385385 request : "SynapseRequest" ,
386386 code : int ,
@@ -389,7 +389,7 @@ def _send_response(
389389 raise NotImplementedError ()
390390
391391 @abc .abstractmethod
392- def _send_error_response (
392+ async def _send_error_response (
393393 self ,
394394 f : failure .Failure ,
395395 request : "SynapseRequest" ,
@@ -415,29 +415,29 @@ def __init__(
415415 super ().__init__ (clock , extract_context )
416416 self .canonical_json = canonical_json
417417
418- def _send_response (
418+ async def _send_response (
419419 self ,
420420 request : "SynapseRequest" ,
421421 code : int ,
422422 response_object : Any ,
423423 ) -> None :
424424 """Implements _AsyncResource._send_response"""
425425 # TODO: Only enable CORS for the requests that need it.
426- respond_with_json (
426+ await respond_with_json (
427427 request ,
428428 code ,
429429 response_object ,
430430 send_cors = True ,
431431 canonical_json = self .canonical_json ,
432432 )
433433
434- def _send_error_response (
434+ async def _send_error_response (
435435 self ,
436436 f : failure .Failure ,
437437 request : "SynapseRequest" ,
438438 ) -> None :
439439 """Implements _AsyncResource._send_error_response"""
440- return_json_error (f , request , None )
440+ await return_json_error (f , request , None )
441441
442442
443443@attr .s (slots = True , frozen = True , auto_attribs = True )
@@ -565,13 +565,13 @@ async def _async_render(self, request: "SynapseRequest") -> Tuple[int, Any]:
565565
566566 return callback_return
567567
568- def _send_error_response (
568+ async def _send_error_response (
569569 self ,
570570 f : failure .Failure ,
571571 request : "SynapseRequest" ,
572572 ) -> None :
573573 """Implements _AsyncResource._send_error_response"""
574- return_json_error (f , request , self .hs .config )
574+ await return_json_error (f , request , self .hs .config )
575575
576576
577577class DirectServeHtmlResource (_AsyncResource ):
@@ -593,7 +593,7 @@ def __init__(
593593
594594 super ().__init__ (clock , extract_context )
595595
596- def _send_response (
596+ async def _send_response (
597597 self ,
598598 request : "SynapseRequest" ,
599599 code : int ,
@@ -606,7 +606,7 @@ def _send_response(
606606
607607 respond_with_html_bytes (request , code , html_bytes )
608608
609- def _send_error_response (
609+ async def _send_error_response (
610610 self ,
611611 f : failure .Failure ,
612612 request : "SynapseRequest" ,
@@ -780,7 +780,7 @@ def _encode_json_bytes(json_object: object) -> bytes:
780780 return json_encoder .encode (json_object ).encode ("utf-8" )
781781
782782
783- def respond_with_json (
783+ async def respond_with_json (
784784 request : "SynapseRequest" ,
785785 code : int ,
786786 json_object : Any ,
@@ -824,9 +824,7 @@ def respond_with_json(
824824 if send_cors :
825825 set_cors_headers (request )
826826
827- run_in_background (
828- _async_write_json_to_request_in_thread , request , encoder , json_object
829- )
827+ await _async_write_json_to_request_in_thread (request , encoder , json_object )
830828 return NOT_DONE_YET
831829
832830
@@ -882,6 +880,8 @@ async def _async_write_json_to_request_in_thread(
882880 Note: We don't use JsonEncoder.iterencode here as that falls back to the
883881 Python implementation (rather than the C backend), which is *much* more
884882 expensive.
883+
884+ The actual writing of bytes is not finished when this returns.
885885 """
886886
887887 def encode (opentracing_span : "Optional[opentracing.Span]" ) -> bytes :
0 commit comments