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
|
#!/usr/bin/env python3
|
||||||
from http.server import SimpleHTTPRequestHandler
|
|
||||||
|
import argparse
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import socketserver
|
import socketserver
|
||||||
|
from http import HTTPStatus
|
||||||
|
from http.server import SimpleHTTPRequestHandler
|
||||||
from typing import Optional
|
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):
|
class MyHandler(SimpleHTTPRequestHandler):
|
||||||
|
MAX_PAYLOAD_SIZE = 1e6
|
||||||
DATA_DIR = "metadata"
|
DATA_DIR = "metadata"
|
||||||
CACHE = {}
|
CACHE = {}
|
||||||
|
|
||||||
@ -25,9 +48,9 @@ class MyHandler(SimpleHTTPRequestHandler):
|
|||||||
def read_body_data(self):
|
def read_body_data(self):
|
||||||
try:
|
try:
|
||||||
size: int = int(self.headers["Content-Length"])
|
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.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
|
return False
|
||||||
raw_data = self.rfile.read(size)
|
raw_data = self.rfile.read(size)
|
||||||
self.data = json.loads(raw_data)
|
self.data = json.loads(raw_data)
|
||||||
@ -149,8 +172,42 @@ class MyHandler(SimpleHTTPRequestHandler):
|
|||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
with socketserver.TCPServer(("", PORT), MyHandler) as httpd:
|
parser = argparse.ArgumentParser(
|
||||||
print(f"Serving on port {PORT}")
|
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()
|
httpd.serve_forever()
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user