packages feed

hurl-workbench-cli-0.1.0.0: examples/executable-checks/app.py

#!/usr/bin/env python3
"""Disposable example application's supported CLI and HTTP facts interface."""
import json
import os
from pathlib import Path
import sys
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer


def facts(root):
    return json.loads((Path(root) / "facts.json").read_text())


def put(root, value):
    path = Path(root) / "facts.json"
    path.write_text(json.dumps(value))
    path.chmod(0o600)


def serve(root, port):
    class Handler(BaseHTTPRequestHandler):
        def log_message(self, *_):
            pass

        def do_GET(self):
            if self.path == "/health":
                self.send_response(200)
                self.end_headers()
                return
            if self.headers.get("Authorization") != "Bearer " + os.environ["PARITY_TOKEN"]:
                self.send_error(401)
                return
            if self.path != "/facts":
                self.send_error(404)
                return
            data = json.dumps(facts(root)).encode()
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.send_header("Content-Length", str(len(data)))
            self.end_headers()
            self.wfile.write(data)

        def do_POST(self):
            if self.path != "/facts" or self.headers.get("Authorization") != "Bearer " + os.environ["PARITY_TOKEN"]:
                self.send_error(403)
                return
            value = json.loads(self.rfile.read(int(self.headers["Content-Length"])))
            put(root, value)
            self.send_response(204)
            self.end_headers()

    ThreadingHTTPServer(("127.0.0.1", int(port)), Handler).serve_forever()


if __name__ == "__main__":
    if sys.argv[1] == "observe":
        print(json.dumps(facts(sys.argv[2])))
    elif sys.argv[1] == "serve":
        serve(*sys.argv[2:4])
    else:
        raise SystemExit("expected observe FIXTURE or serve FIXTURE PORT")