From 6e3d280a753b6a9f3ceb6ff5007886f9185c082c Mon Sep 17 00:00:00 2001 From: kqjy Date: Sun, 25 Jan 2026 21:29:58 +0800 Subject: [PATCH] Add SlowDown error code tracking for 429 rate limit responses --- app/errors.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/errors.py b/app/errors.py index 7e5d711..b2a4079 100644 --- a/app/errors.py +++ b/app/errors.py @@ -6,6 +6,7 @@ from typing import Optional, Dict, Any from xml.etree.ElementTree import Element, SubElement, tostring from flask import Response, jsonify, request, flash, redirect, url_for, g +from flask_limiter import RateLimitExceeded logger = logging.getLogger(__name__) @@ -172,10 +173,22 @@ def handle_app_error(error: AppError) -> Response: return error.to_xml_response() +def handle_rate_limit_exceeded(e: RateLimitExceeded) -> Response: + g.s3_error_code = "SlowDown" + error = Element("Error") + SubElement(error, "Code").text = "SlowDown" + SubElement(error, "Message").text = "Please reduce your request rate." + SubElement(error, "Resource").text = request.path + SubElement(error, "RequestId").text = getattr(g, "request_id", "") + xml_bytes = tostring(error, encoding="utf-8") + return Response(xml_bytes, status=429, mimetype="application/xml") + + def register_error_handlers(app): """Register error handlers with a Flask app.""" app.register_error_handler(AppError, handle_app_error) - + app.register_error_handler(RateLimitExceeded, handle_rate_limit_exceeded) + for error_class in [ BucketNotFoundError, BucketAlreadyExistsError, BucketNotEmptyError, ObjectNotFoundError, InvalidObjectKeyError,