From e3c013f21ea8ffb924608beb9a48bfd893e0cf0d Mon Sep 17 00:00:00 2001 From: Stefan Haun Date: Wed, 17 Sep 2025 09:52:21 +0200 Subject: [PATCH 1/3] Add a base CORS handler for HTTP endpoints Copied from https://github.com/penguineer/RedmineActionablesCollector/commit/9a0a29e107941b2ca66c094cb19da19e80a08ebf with the authors permission. --- src/app.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/app.py b/src/app.py index 2768c0b..b745a3c 100644 --- a/src/app.py +++ b/src/app.py @@ -1,5 +1,6 @@ #!/usr/bin/python3 from abc import ABC +from typing import Any import tornado.ioloop import tornado.web @@ -21,6 +22,21 @@ startup_timestamp = datetime.now() +class BaseCORSHandler(tornado.web.RequestHandler): + def set_default_headers(self): + self.set_header("Access-Control-Allow-Origin", "*") + self.set_header("Access-Control-Allow-Headers", "x-requested-with, content-type") + self.set_header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") + + def options(self, *args, **kwargs): + self.set_default_headers() + self.set_status(204) + self.finish() + + def write_error(self, status_code: int, **kwargs: Any) -> None: + self.set_default_headers() + super().write_error(status_code, **kwargs) + class HealthHandler(tornado.web.RequestHandler, ABC): # noinspection PyAttributeOutsideInit From ad7a2082f86796605026d6857d84f54186426fc2 Mon Sep 17 00:00:00 2001 From: Stefan Haun Date: Wed, 17 Sep 2025 09:52:46 +0200 Subject: [PATCH 2/3] Use CORS handler for SpaceAPI endpoints --- src/app.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app.py b/src/app.py index b745a3c..9db6096 100644 --- a/src/app.py +++ b/src/app.py @@ -90,7 +90,7 @@ def get(self): self.finish() -class SpaceAPIHandler(tornado.web.RequestHandler, ABC): +class SpaceAPIHandler(BaseCORSHandler, ABC): # noinspection PyAttributeOutsideInit def initialize(self, observer): self.observer = observer @@ -100,7 +100,7 @@ def get(self): self.write(json.dumps(self.observer.get_space_api_entry(), indent=4)) self.finish() -class SpaceStateTextHandler(tornado.web.RequestHandler, ABC): +class SpaceStateTextHandler(BaseCORSHandler, ABC): # noinspection PyAttributeOutsideInit def initialize(self, observer): self.observer = observer @@ -111,7 +111,7 @@ def get(self): self.finish() -class PictureHandler(tornado.web.RequestHandler, ABC): +class PictureHandler(BaseCORSHandler, ABC): # noinspection PyAttributeOutsideInit def initialize(self, picture_manager): self.picture_manager = picture_manager From f568c52e3054df651e4d2278e4176890b1645d01 Mon Sep 17 00:00:00 2001 From: Stefan Haun Date: Wed, 17 Sep 2025 10:03:41 +0200 Subject: [PATCH 3/3] Set the JSON charset according to spec See https://spaceapi.io/provide-an-endpoint/ for details --- src/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.py b/src/app.py index 9db6096..efe8451 100644 --- a/src/app.py +++ b/src/app.py @@ -96,7 +96,7 @@ def initialize(self, observer): self.observer = observer def get(self): - self.set_header("Content-Type", "application/json") + self.set_header("Content-Type", "application/json; charset=utf-8") self.write(json.dumps(self.observer.get_space_api_entry(), indent=4)) self.finish()