Skip to content

Commit 8af3204

Browse files
committed
Wait for response
Spawning from #18804 (comment)
1 parent 40edb10 commit 8af3204

File tree

10 files changed

+35
-35
lines changed

10 files changed

+35
-35
lines changed

synapse/http/proxy.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ async def _async_render(self, request: "SynapseRequest") -> Tuple[int, Any]:
173173

174174
return response.code, response
175175

176-
def _send_response(
176+
async def _send_response(
177177
self,
178178
request: "SynapseRequest",
179179
code: int,
@@ -205,7 +205,7 @@ def _send_response(
205205

206206
response.deliverBody(_ProxyResponseBody(request))
207207

208-
def _send_error_response(
208+
async def _send_error_response(
209209
self,
210210
f: failure.Failure,
211211
request: "SynapseRequest",

synapse/http/server.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
UnrecognizedRequestError,
7676
)
7777
from 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
7979
from synapse.logging.opentracing import active_span, start_active_span, trace_servlet
8080
from synapse.util import Clock, json_encoder
8181
from synapse.util.caches import intern_dict
@@ -111,7 +111,7 @@
111111
HTTP_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

577577
class 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:

synapse/media/_base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@
122122
_IMMUTABLE_ETAG = "1"
123123

124124

125-
def respond_404(request: SynapseRequest) -> None:
125+
async def respond_404(request: SynapseRequest) -> None:
126126
assert request.path is not None
127-
respond_with_json(
127+
await respond_with_json(
128128
request,
129129
404,
130130
cs_error("Not found '%s'" % (request.path.decode(),), code=Codes.NOT_FOUND),
@@ -154,7 +154,7 @@ async def respond_with_file(
154154

155155
finish_request(request)
156156
else:
157-
respond_404(request)
157+
await respond_404(request)
158158

159159

160160
def add_file_headers(

synapse/media/media_repository.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,8 @@ async def create_or_update_content(
396396

397397
return MXCUri(self.server_name, media_id)
398398

399-
def respond_not_yet_uploaded(self, request: SynapseRequest) -> None:
400-
respond_with_json(
399+
async def respond_not_yet_uploaded(self, request: SynapseRequest) -> None:
400+
await respond_with_json(
401401
request,
402402
504,
403403
cs_error("Media has not been uploaded yet", code=Codes.NOT_YET_UPLOADED),
@@ -455,7 +455,7 @@ async def get_local_media_info(
455455
await self.clock.sleep(0.5)
456456

457457
logger.info("Media %s has not yet been uploaded", media_id)
458-
self.respond_not_yet_uploaded(request)
458+
await self.respond_not_yet_uploaded(request)
459459
return None
460460

461461
async def get_local_media(

synapse/media/thumbnailer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ async def _select_and_respond_with_thumbnail(
699699
logger.info("Failed to find any generated thumbnails")
700700

701701
assert request.path is not None
702-
respond_with_json(
702+
await respond_with_json(
703703
request,
704704
400,
705705
cs_error(

synapse/rest/client/media.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ async def on_GET(self, request: SynapseRequest) -> None:
112112
)
113113
)
114114
response = user_specific_config if user_specific_config else self.limits_dict
115-
respond_with_json(request, 200, response, send_cors=True)
115+
await respond_with_json(request, 200, response, send_cors=True)
116116

117117

118118
class ThumbnailResource(RestServlet):

synapse/rest/media/config_resource.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,4 @@ async def on_GET(self, request: SynapseRequest) -> None:
5050
)
5151
)
5252
response = user_specific_config if user_specific_config else self.limits_dict
53-
respond_with_json(request, 200, response, send_cors=True)
53+
await respond_with_json(request, 200, response, send_cors=True)

synapse/rest/media/create_resource.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ async def on_POST(self, request: SynapseRequest) -> None:
7979
content_uri,
8080
unused_expires_at,
8181
)
82-
respond_with_json(
82+
await respond_with_json(
8383
request,
8484
200,
8585
{

synapse/rest/media/upload_resource.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ async def on_POST(self, request: SynapseRequest) -> None:
130130

131131
logger.info("Uploaded content with URI '%s'", content_uri)
132132

133-
respond_with_json(
133+
await respond_with_json(
134134
request, 200, {"content_uri": str(content_uri)}, send_cors=True
135135
)
136136

@@ -184,4 +184,4 @@ async def on_PUT(
184184
raise SynapseError(400, "Bad content")
185185

186186
logger.info("Uploaded content for media ID %r", media_id)
187-
respond_with_json(request, 200, {}, send_cors=True)
187+
await respond_with_json(request, 200, {}, send_cors=True)

tests/http/test_additional_resource.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def __init__(self, config: JsonDict, module_api: Any) -> None:
3636

3737
async def handle_request(self, request: Request) -> None:
3838
assert isinstance(request, SynapseRequest)
39-
respond_with_json(request, 200, {"some_key": "some_value_async"})
39+
await respond_with_json(request, 200, {"some_key": "some_value_async"})
4040

4141

4242
class _SyncTestCustomEndpoint:
@@ -45,7 +45,7 @@ def __init__(self, config: JsonDict, module_api: Any) -> None:
4545

4646
async def handle_request(self, request: Request) -> None:
4747
assert isinstance(request, SynapseRequest)
48-
respond_with_json(request, 200, {"some_key": "some_value_sync"})
48+
await respond_with_json(request, 200, {"some_key": "some_value_sync"})
4949

5050

5151
class AdditionalResourceTests(HomeserverTestCase):

0 commit comments

Comments
 (0)