#!/usr/bin/python3 import http.server import os.path import justserv class StateStore: def __init__(self, dir = None): if dir is None: dir = "./__states__" if not os.path.isdir(dir): os.mkdir(dir) self.__dir = dir self.__cache = {} def getState(self, appname): sp = "{}/{}.state".format(self.__dir, appname) if not appname in self.__cache: if os.path.isfile(sp): with open(sp, "rb") as sf: st = sf.read().decode("utf-8") self.__cache[appname] = eval(st) else: self.__cache[appname] = {} return self.__cache[appname] def patchState(self, appname, newstate): state = self.getState(appname) justserv.patch.patch(state, newstate) self.setState(appname, state) def setState(self, appname, state): self.__cache[appname] = state sp = "{}/{}.state".format(self.__dir, appname) st = str(state) with open(sp, "wb") as sf: sf.write(st.encode("utf-8")) class JSRequestHandler(http.server.BaseHTTPRequestHandler): _store = StateStore() def getAppname(self): if self.path == "" or self.path == "/": p = "__root__" else: p = self.path.split("/")[1] return p def do_GET(self): p = self.getAppname() s = self._store.getState(p) sb = str(s).encode("utf-8") self.send_response(200) self.send_header("content-length", len(sb)) self.end_headers() self.wfile.write(sb) def do_PATCH(self): p = self.getAppname() bpatch = self.rfile.read(int(self.headers.get('content-length', 0))) ps = eval(bpatch.decode("utf-8")) self._store.patchState(p, ps) return self.do_GET() if __name__ == '__main__': httpd = http.server.HTTPServer( ('', 8080 ), JSRequestHandler) httpd.serve_forever()