diff options
author | Will Hunt <will@half-shot.uk> | 2023-08-24 15:40:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-24 10:40:26 -0400 |
commit | 0538e3e2dba8ff5bbc13f11d796e696f6ba8a7c7 (patch) | |
tree | f40c44f233f4ec5ac5a17a91a63ced0458d69c84 /synapse/api | |
parent | Bump serde_json from 1.0.104 to 1.0.105 (#16140) (diff) | |
download | synapse-0538e3e2dba8ff5bbc13f11d796e696f6ba8a7c7.tar.xz |
Add `Retry-After` to M_LIMIT_EXCEEDED error responses (#16136)
Implements MSC4041 behind an experimental configuration flag.
Diffstat (limited to 'synapse/api')
-rw-r--r-- | synapse/api/errors.py | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/synapse/api/errors.py b/synapse/api/errors.py index 7ffd72c42c..578e798773 100644 --- a/synapse/api/errors.py +++ b/synapse/api/errors.py @@ -16,6 +16,7 @@ """Contains exceptions and error codes.""" import logging +import math import typing from enum import Enum from http import HTTPStatus @@ -503,6 +504,8 @@ class InvalidCaptchaError(SynapseError): class LimitExceededError(SynapseError): """A client has sent too many requests and is being throttled.""" + include_retry_after_header = False + def __init__( self, code: int = 429, @@ -510,7 +513,12 @@ class LimitExceededError(SynapseError): retry_after_ms: Optional[int] = None, errcode: str = Codes.LIMIT_EXCEEDED, ): - super().__init__(code, msg, errcode) + headers = ( + {"Retry-After": str(math.ceil(retry_after_ms / 1000))} + if self.include_retry_after_header and retry_after_ms is not None + else None + ) + super().__init__(code, msg, errcode, headers=headers) self.retry_after_ms = retry_after_ms def error_dict(self, config: Optional["HomeServerConfig"]) -> "JsonDict": |