117 lines
3.1 KiB
Python
117 lines
3.1 KiB
Python
#!/usr/bin/python3
|
|
|
|
import http.server
|
|
import os.path
|
|
import sys
|
|
import random
|
|
|
|
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()
|
|
queue = {}
|
|
|
|
def getAppname(self):
|
|
if self.path == "" or self.path == "/":
|
|
p = "__root__"
|
|
else:
|
|
p = self.path.split("/")[1]
|
|
return p
|
|
|
|
def do_GET(self):
|
|
#queue
|
|
while True:
|
|
ip = random.randint(100000000, 999999999)
|
|
if ip not in self.queue:
|
|
break
|
|
self.queue[ip] = len(self.queue)+1
|
|
print("start queue for {} is {}".format(ip, len(self.queue)))
|
|
while True:
|
|
if self.queue[ip] == 0:
|
|
del self.queue[ip]
|
|
break
|
|
if min(self.queue.values()) != 0:
|
|
self.queue[ip] -= 1
|
|
print("queue for {} is {}".format(ip, len(self.queue)))
|
|
|
|
#queue done
|
|
|
|
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):
|
|
#queue
|
|
while True:
|
|
ip = random.randint(100000000, 999999999)
|
|
if ip not in self.queue:
|
|
break
|
|
self.queue[ip] = len(self.queue)
|
|
print("start queue for {} is {}".format(ip, len(self.queue)))
|
|
while True:
|
|
if self.queue[ip] == 0:
|
|
del self.queue[ip]
|
|
break
|
|
if min(self.queue.values()) != 0:
|
|
self.queue[ip] -= 1
|
|
print("queue for {} is {}".format(ip, len(self.queue)))
|
|
|
|
#queue done
|
|
|
|
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()
|
|
|