diff --git a/src/pinnwand/handler/api_curl.py b/src/pinnwand/handler/api_curl.py index b9ea677..6404a86 100644 --- a/src/pinnwand/handler/api_curl.py +++ b/src/pinnwand/handler/api_curl.py @@ -1,8 +1,9 @@ +from typing import Any from urllib.parse import urljoin import tornado.web -from pinnwand import configuration, database, defensive, logger, utility +from pinnwand import configuration, database, defensive, error, logger, utility log = logger.get_logger(__name__) @@ -14,11 +15,21 @@ def check_xsrf_cookie(self) -> None: def get(self) -> None: raise tornado.web.HTTPError(400) - def post(self) -> None: - if defensive.ratelimit(self.request, area="create"): + def write_error(self, status_code: int, **kwargs: Any) -> None: + type_, exc, traceback = kwargs["exc_info"] + + if type_ == error.ValidationError: + self.set_status(400) + self.write(str(exc)) + elif type_ == error.RatelimitError: self.set_status(429) self.write("Enhance your calm, you have exceeded the ratelimit.") - return + else: + super().write_error(status_code, **kwargs) + + def post(self) -> None: + if defensive.ratelimit(self.request, area="create"): + raise error.RatelimitError lexer = self.get_body_argument("lexer", "text") raw = self.get_body_argument("raw", "", strip=False) @@ -30,22 +41,16 @@ def post(self) -> None: log.info( "CurlCreate.post: a paste was submitted with an invalid lexer" ) - self.set_status(400) - self.write("Invalid `lexer` supplied.\n") - return + raise error.ValidationError("Invalid `lexer` supplied.\n") # Guard against empty strings if not raw or not raw.strip(): log.info("CurlCreate.post: a paste was submitted without raw") - self.set_status(400) - self.write("Invalid `raw` supplied.\n") - return + raise error.ValidationError("Invalid `raw` supplied.\n") if expiry not in configuration.expiries: log.info("CurlCreate.post: a paste was submitted without raw") - self.set_status(400) - self.write("Invalid `expiry` supplied.\n") - return + raise error.ValidationError("Invalid `expiry` supplied.\n") paste = database.Paste( utility.slug_create(), configuration.expiries[expiry], "curl"