from server.connections import Request, Response import mimetypes import handler import uuid import configparser import os import glob import hashlib import time import re HTTP200 = "200 OK" HTTP202 = "202 Accepted" HTTP400 = "400 Bad Request" HTTP404 = "404 File Not Found" HTTP405 = "405 Method Not Allowed" HTTP500 = "500 Internal Server Error" HTML = "text/html" JSON = "application/json" XML = "text/xml" TEXT = "text/plain" PNG = "image/png" MKV = "video/mkv" JPG = "image/jpeg" def static(req): try: content = open("server/static/" + req.endpoint, "rb").read() code = HTTP200 ctype = mimetypes.guess_type(req.endpoint)[0] except: code = HTTP404 content = "

404 File Not Found

" content += """The file you requested was not found on the server. Check the URL maybe?""" ctype = HTML content = content.encode() return Response(code, ctype, content) def addjob(req): jobid = str(uuid.uuid4()) config = configparser.ConfigParser(strict=False, interpolation=None) try: title = re.sub(r"[^a-zA-Z0-9_\-]", "_", req.args["title"][0]) or "output" except Exception as e: title = "output" try: rx = int(req.args["rx"][0]) or 0 except: rx = 0 try: ry = int(req.args["ry"][0]) or 0 except: ry = 0 try: rz = int(req.args["rz"][0]) or 0 except: rz = 0 try: width = int(req.args["width"][0]) or 3840 except: width = 3840 try: height = int(req.args["height"][0]) or 1920 except: height = 1920 config["Job"] = { "url": req.args["url"][0], "title": title, "rx": rx, "ry": ry, "rz": rz, "width": width, "height": height } with open("/tmp/panosteal/" + jobid, "w") as outfile: config.write(outfile) content = jobid.encode() ctype = TEXT status = HTTP200 return Response(status, ctype, content) def getjob(req): jobid = req.path[-1].rstrip("-thumb").rstrip("-info") content_disposition = None found = (glob.glob("/tmp/panosteal/%s---*.png" % jobid) + glob.glob("/tmp/panosteal/%s---*.mkv" % jobid)) if not req.path[-1].endswith("thumb") else glob.glob("/tmp/panosteal/%s---*.jpg" % jobid) if found: md5 = "Not happening." while True: content = open(found[0], "rb").read() if not req.path[-1].endswith("info") else b"" newmd5 = hashlib.md5(content).hexdigest() if newmd5 == md5: break md5 = newmd5 time.sleep(0.5) code = HTTP200 ctype = PNG if found[0].endswith(".png") else JPG if found[0].endswith(".jpg") else MKV content_disposition = found[0].split("---")[-1] if not req.path[-1].endswith("info") else None elif glob.glob("/tmp/panosteal/%s*err" % jobid): content = "

500 Internal Server Error

".encode() code = HTTP500 ctype = HTML elif not os.path.isfile("/tmp/panosteal/%s" % jobid): content = "

404 File Not Found

".encode() code = HTTP404 ctype = HTML else: content = "".encode() code = HTTP202 ctype = TEXT res = Response(code, ctype, content) if content_disposition: res.addHeader("Content-Disposition", 'attachment; filename="%s"' % content_disposition) return res def application(env, re): req = Request(env) if req.endpoint.lower() == "addjob": handler = addjob elif req.endpoint.lower() == "getjob": handler = getjob else: handler = static res = handler(req) re(res.status, res.headers) yield res.content