diff options
author | Mark Haines <mark.haines@matrix.org> | 2014-09-03 09:15:52 +0100 |
---|---|---|
committer | Mark Haines <mark.haines@matrix.org> | 2014-09-03 09:15:52 +0100 |
commit | 30ad0c567437d19ebb4b172c12a2e22f65d2dd9a (patch) | |
tree | 9961b92b2b0ea6084d0bdda11bf32cfde88fa833 /synapse/api/errors.py | |
parent | howto: Link jsfiddles correctly. Hide ugly TODOs. (diff) | |
parent | Fix tests to support ratelimiting (diff) | |
download | synapse-30ad0c567437d19ebb4b172c12a2e22f65d2dd9a.tar.xz |
Merge branch 'ratelimiting' into develop
Diffstat (limited to 'synapse/api/errors.py')
-rw-r--r-- | synapse/api/errors.py | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/synapse/api/errors.py b/synapse/api/errors.py index 21ededc5ae..23ce0af277 100644 --- a/synapse/api/errors.py +++ b/synapse/api/errors.py @@ -28,6 +28,7 @@ class Codes(object): UNKNOWN = "M_UNKNOWN" NOT_FOUND = "M_NOT_FOUND" UNKNOWN_TOKEN = "M_UNKNOWN_TOKEN" + LIMIT_EXCEEDED = "M_LIMIT_EXCEEDED" class CodeMessageException(Exception): @@ -39,10 +40,13 @@ class CodeMessageException(Exception): self.code = code self.msg = msg + def error_dict(self): + return cs_error(self.msg) + class SynapseError(CodeMessageException): """A base error which can be caught for all synapse events.""" - def __init__(self, code, msg, errcode=""): + def __init__(self, code, msg, errcode=Codes.UNKNOWN): """Constructs a synapse error. Args: @@ -53,6 +57,11 @@ class SynapseError(CodeMessageException): super(SynapseError, self).__init__(code, msg) self.errcode = errcode + def error_dict(self): + return cs_error( + self.msg, + self.errcode, + ) class RoomError(SynapseError): """An error raised when a room event fails.""" @@ -91,13 +100,25 @@ class StoreError(SynapseError): pass -def cs_exception(exception): - if isinstance(exception, SynapseError): +class LimitExceededError(SynapseError): + """A client has sent too many requests and is being throttled. + """ + def __init__(self, code=429, msg="Too Many Requests", retry_after_ms=None, + errcode=Codes.LIMIT_EXCEEDED): + super(LimitExceededError, self).__init__(code, msg, errcode) + self.retry_after_ms = retry_after_ms + + def error_dict(self): return cs_error( - exception.msg, - Codes.UNKNOWN if not exception.errcode else exception.errcode) - elif isinstance(exception, CodeMessageException): - return cs_error(exception.msg) + self.msg, + self.errcode, + retry_after_ms=self.retry_after_ms, + ) + + +def cs_exception(exception): + if isinstance(exception, CodeMessageException): + return exception.error_dict() else: logging.error("Unknown exception type: %s", type(exception)) |