video_stream/justserv/server.py

80 lines
2.0 KiB
Python

#!/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()