Skip to content

Commit 696cc9e

Browse files
authored
Stabilize support for Retry-After header (MSC4014) (#16947)
1 parent 4af3301 commit 696cc9e

File tree

5 files changed

+5
-21
lines changed

5 files changed

+5
-21
lines changed

changelog.d/16947.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Include `Retry-After` header by default per [MSC4041](https://github.com/matrix-org/matrix-spec-proposals/pull/4041). Contributed by @clokep.

synapse/api/errors.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -517,18 +517,17 @@ def error_dict(self, config: Optional["HomeServerConfig"]) -> "JsonDict":
517517
class LimitExceededError(SynapseError):
518518
"""A client has sent too many requests and is being throttled."""
519519

520-
include_retry_after_header = False
521-
522520
def __init__(
523521
self,
524522
limiter_name: str,
525523
code: int = 429,
526524
retry_after_ms: Optional[int] = None,
527525
errcode: str = Codes.LIMIT_EXCEEDED,
528526
):
527+
# Use HTTP header Retry-After to enable library-assisted retry handling.
529528
headers = (
530529
{"Retry-After": str(math.ceil(retry_after_ms / 1000))}
531-
if self.include_retry_after_header and retry_after_ms is not None
530+
if retry_after_ms is not None
532531
else None
533532
)
534533
super().__init__(code, "Too Many Requests", errcode, headers=headers)

synapse/config/experimental.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import attr
2626
import attr.validators
2727

28-
from synapse.api.errors import LimitExceededError
2928
from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersions
3029
from synapse.config import ConfigError
3130
from synapse.config._base import Config, RootConfig
@@ -415,14 +414,6 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None:
415414
"msc4010_push_rules_account_data", False
416415
)
417416

418-
# MSC4041: Use HTTP header Retry-After to enable library-assisted retry handling
419-
#
420-
# This is a bit hacky, but the most reasonable way to *alway* include the
421-
# headers.
422-
LimitExceededError.include_retry_after_header = experimental.get(
423-
"msc4041_enabled", False
424-
)
425-
426417
self.msc4028_push_encrypted_events = experimental.get(
427418
"msc4028_push_encrypted_events", False
428419
)

tests/api/test_errors.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,14 @@ def test_key_appears_in_context_but_not_error_dict(self) -> None:
3333
self.assertIn("needle", err.debug_context)
3434
self.assertNotIn("needle", serialised)
3535

36-
# Create a sub-class to avoid mutating the class-level property.
37-
class LimitExceededErrorHeaders(LimitExceededError):
38-
include_retry_after_header = True
39-
4036
def test_limit_exceeded_header(self) -> None:
41-
err = self.LimitExceededErrorHeaders(limiter_name="test", retry_after_ms=100)
37+
err = LimitExceededError(limiter_name="test", retry_after_ms=100)
4238
self.assertEqual(err.error_dict(None).get("retry_after_ms"), 100)
4339
assert err.headers is not None
4440
self.assertEqual(err.headers.get("Retry-After"), "1")
4541

4642
def test_limit_exceeded_rounding(self) -> None:
47-
err = self.LimitExceededErrorHeaders(limiter_name="test", retry_after_ms=3001)
43+
err = LimitExceededError(limiter_name="test", retry_after_ms=3001)
4844
self.assertEqual(err.error_dict(None).get("retry_after_ms"), 3001)
4945
assert err.headers is not None
5046
self.assertEqual(err.headers.get("Retry-After"), "4")

tests/rest/client/test_login.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,6 @@ def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
177177
# rc_login dict here, we need to set this manually as well
178178
"account": {"per_second": 10000, "burst_count": 10000},
179179
},
180-
"experimental_features": {"msc4041_enabled": True},
181180
}
182181
)
183182
def test_POST_ratelimiting_per_address(self) -> None:
@@ -229,7 +228,6 @@ def test_POST_ratelimiting_per_address(self) -> None:
229228
# rc_login dict here, we need to set this manually as well
230229
"address": {"per_second": 10000, "burst_count": 10000},
231230
},
232-
"experimental_features": {"msc4041_enabled": True},
233231
}
234232
)
235233
def test_POST_ratelimiting_per_account(self) -> None:
@@ -278,7 +276,6 @@ def test_POST_ratelimiting_per_account(self) -> None:
278276
"address": {"per_second": 10000, "burst_count": 10000},
279277
"failed_attempts": {"per_second": 0.17, "burst_count": 5},
280278
},
281-
"experimental_features": {"msc4041_enabled": True},
282279
}
283280
)
284281
def test_POST_ratelimiting_per_account_failed_attempts(self) -> None:

0 commit comments

Comments
 (0)