diff options
author | Patrick Cloke <clokep@users.noreply.github.com> | 2021-01-15 11:00:13 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-15 11:00:13 -0500 |
commit | 74dd90604189a0310c7b2f7eed0e6b2ac26d04f1 (patch) | |
tree | e2e17534c1a80a23569391b968241f655a26fd56 /synapse/http/client.py | |
parent | Remote dependency on distutils (#9125) (diff) | |
download | synapse-74dd90604189a0310c7b2f7eed0e6b2ac26d04f1.tar.xz |
Avoid raising the body exceeded error multiple times. (#9108)
Previously this code generated unreferenced `Deferred` instances which caused "Unhandled Deferreds" errors to appear in error situations.
Diffstat (limited to 'synapse/http/client.py')
-rw-r--r-- | synapse/http/client.py | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/synapse/http/client.py b/synapse/http/client.py index dc4b81ca60..df498c8645 100644 --- a/synapse/http/client.py +++ b/synapse/http/client.py @@ -766,14 +766,24 @@ class _ReadBodyWithMaxSizeProtocol(protocol.Protocol): self.max_size = max_size def dataReceived(self, data: bytes) -> None: + # If the deferred was called, bail early. + if self.deferred.called: + return + self.stream.write(data) self.length += len(data) + # The first time the maximum size is exceeded, error and cancel the + # connection. dataReceived might be called again if data was received + # in the meantime. if self.max_size is not None and self.length >= self.max_size: self.deferred.errback(BodyExceededMaxSize()) - self.deferred = defer.Deferred() self.transport.loseConnection() def connectionLost(self, reason: Failure) -> None: + # If the maximum size was already exceeded, there's nothing to do. + if self.deferred.called: + return + if reason.check(ResponseDone): self.deferred.callback(self.length) elif reason.check(PotentialDataLoss): |