From ff824ad3c07285f4349533a5847ee5e0b3ba9ca8 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sat, 3 May 2025 15:24:15 +0200 Subject: [PATCH] feat: add CLI arguments + env variables support --- editor/server.py | 75 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 9 deletions(-) mode change 100644 => 100755 editor/server.py diff --git a/editor/server.py b/editor/server.py old mode 100644 new mode 100755 index d58da48..0b93716 --- a/editor/server.py +++ b/editor/server.py @@ -1,15 +1,38 @@ -from http import HTTPStatus -from http.server import SimpleHTTPRequestHandler +#!/usr/bin/env python3 + +import argparse import json import os import socketserver +from http import HTTPStatus +from http.server import SimpleHTTPRequestHandler from typing import Optional -from urllib.parse import urlparse, parse_qs, unquote +from urllib.parse import parse_qs, unquote, urlparse + + +# https://stackoverflow.com/a/10551190/11109181 +class EnvDefault(argparse.Action): + def __init__(self, envvar, required=True, default=None, help=None, **kwargs): + if envvar: + if envvar in os.environ: + default = os.environ[envvar] + if required and default is not None: + required = False + + if default is not None and help is not None: + help += f" (default: {default})" + + if envvar and help is not None: + help += f"\nCan also be specified through the {envvar} environment variable" + super(EnvDefault, self).__init__(default=default, required=required, help=help, + **kwargs) + + def __call__(self, parser, namespace, values, option_string=None): + setattr(namespace, self.dest, values) -PORT = 8000 -MAX_SIZE = 10e6 class MyHandler(SimpleHTTPRequestHandler): + MAX_PAYLOAD_SIZE = 1e6 DATA_DIR = "metadata" CACHE = {} @@ -25,9 +48,9 @@ class MyHandler(SimpleHTTPRequestHandler): def read_body_data(self): try: size: int = int(self.headers["Content-Length"]) - if size > MAX_SIZE: + if size > self.MAX_PAYLOAD_SIZE: self.send_error(HTTPStatus.CONTENT_TOO_LARGE) - self.log_error(f"Payload is too big ({MAX_SIZE=}B)") + self.log_error(f"Payload is too big ({self.MAX_PAYLOAD_SIZE=}B)") return False raw_data = self.rfile.read(size) self.data = json.loads(raw_data) @@ -149,8 +172,42 @@ class MyHandler(SimpleHTTPRequestHandler): def main(): - with socketserver.TCPServer(("", PORT), MyHandler) as httpd: - print(f"Serving on port {PORT}") + parser = argparse.ArgumentParser( + description="Starts the Melies server", + formatter_class=argparse.RawTextHelpFormatter + ) + parser.add_argument( + "-p", "--port", + action=EnvDefault, + envvar="MELIES_PORT", + default=8000, + type=int, + help="Port on which the server listens" + ) + parser.add_argument( + "--max-payload-size", + action=EnvDefault, + envvar="MELIES_MAX_PAYLOAD_SIZE", + default=1e6, + type=int, + help="Maximum POST payload size in bytes that the server accepts" + ) + parser.add_argument( + "--metadata-dir", + action=EnvDefault, + envvar="MELIES_METADATA_DIR", + default="metadata", + help="Path to the directory containing metadata files" + ) + args = parser.parse_args() + + + port = args.port + MyHandler.MAX_PAYLOAD_SIZE = args.max_payload_size + MyHandler.DATA_DIR = args.metadata_dir + + with socketserver.TCPServer(("", port), MyHandler) as httpd: + print(f"Serving on port {port}") httpd.serve_forever()