feat: add CLI arguments + env variables support
This commit is contained in:
parent
79cd7a32ed
commit
658addae56
75
editor/server.py
Normal file → Executable file
75
editor/server.py
Normal file → Executable file
@ -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()
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user