diff --git a/synapse/http/client.py b/synapse/http/client.py
index ca33b45cb2..743a7ffcb1 100644
--- a/synapse/http/client.py
+++ b/synapse/http/client.py
@@ -731,15 +731,24 @@ class SimpleHttpClient:
# straight back in again
try:
- length = await make_deferred_yieldable(
- read_body_with_max_size(response, output_stream, max_size)
- )
+ d = read_body_with_max_size(response, output_stream, max_size)
+
+ # Ensure that the body is not read forever.
+ d = timeout_deferred(d, 30, self.hs.get_reactor())
+
+ length = await make_deferred_yieldable(d)
except BodyExceededMaxSize:
raise SynapseError(
HTTPStatus.BAD_GATEWAY,
"Requested file is too large > %r bytes" % (max_size,),
Codes.TOO_LARGE,
)
+ except defer.TimeoutError:
+ raise SynapseError(
+ HTTPStatus.BAD_GATEWAY,
+ "Requested file took too long to download",
+ Codes.TOO_LARGE,
+ )
except Exception as e:
raise SynapseError(
HTTPStatus.BAD_GATEWAY, ("Failed to download remote body: %s" % e)
diff --git a/synapse/http/site.py b/synapse/http/site.py
index c180a1d323..40f6c04894 100644
--- a/synapse/http/site.py
+++ b/synapse/http/site.py
@@ -407,7 +407,10 @@ class SynapseRequest(Request):
user_agent = get_request_user_agent(self, "-")
- code = str(self.code)
+ # int(self.code) looks redundant, because self.code is already an int.
+ # But self.code might be an HTTPStatus (which inherits from int)---which has
+ # a different string representation. So ensure we really have an integer.
+ code = str(int(self.code))
if not self.finished:
# we didn't send the full response before we gave up (presumably because
# the connection dropped)
|