Python server added
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
|
||||
import http.server
|
||||
import socketserver
|
||||
import threading
|
||||
import html
|
||||
|
||||
import yjdaemon.API as API
|
||||
|
||||
"""
|
||||
HTTP request handler.
|
||||
"""
|
||||
|
||||
|
||||
class HTTPServerThread(threading.Thread):
|
||||
def __init__(self, PORT):
|
||||
threading.Thread.__init__(self)
|
||||
self.PORT = PORT
|
||||
|
||||
def run(self):
|
||||
Handler = HTTPHandler
|
||||
socketserver.TCPServer.allow_reuse_address = True
|
||||
httpd = socketserver.TCPServer(("", self.PORT), Handler)
|
||||
httpd.serve_forever()
|
||||
|
||||
|
||||
"""
|
||||
REST API
|
||||
"""
|
||||
|
||||
|
||||
class HTTPHandler(http.server.SimpleHTTPRequestHandler):
|
||||
def send_message(self, status, content_type, data):
|
||||
self.send_response(status)
|
||||
self.send_header("Content-type:", content_type)
|
||||
self.end_headers()
|
||||
self.wfile.write(data)
|
||||
self.wfile.write("\n".encode("utf-8"))
|
||||
|
||||
def do_GET(self):
|
||||
""" Serve a GET request. """
|
||||
path = html.unescape(self.path)
|
||||
path = str(path).lstrip("/").split("?")[0]
|
||||
retval = API.calls.APIcall(path)
|
||||
if retval is not None: # if call is valid API function
|
||||
try:
|
||||
args = str(html.unescape(self.path)).lstrip("/").split("?")[1]
|
||||
except IndexError as e:
|
||||
print(e)
|
||||
self.send_message(403, "application/json", API.calls.jsonify({"error": "Missing parameters."}))
|
||||
return
|
||||
self.send_message(200, "application/json", retval(args))
|
||||
else: # else parse as normal HTTP request
|
||||
f = self.send_head()
|
||||
if f:
|
||||
try:
|
||||
self.copyfile(f, self.wfile)
|
||||
finally:
|
||||
f.close()
|
||||
|
||||
def do_POST(self):
|
||||
""" Serve a POST request. """
|
||||
path = html.unescape(self.path)
|
||||
path = str(path).lstrip("/").split("?")[0]
|
||||
retval = API.calls.APIcall(path)
|
||||
if retval is not None: # if call is valid API function
|
||||
try:
|
||||
args = str(html.unescape(self.path)).lstrip("/").split("?")[1] #if no args
|
||||
except IndexError as e:
|
||||
print(e)
|
||||
self.send_message(403, "application/json", API.calls.jsonify({"error": "Missing parameters."}))
|
||||
return
|
||||
if self.headers["Content-Type"] == 'application/json': # if data is json data
|
||||
length = int(self.headers["Content-Length"])
|
||||
rawdata = self.rfile.read(length)
|
||||
result = retval(args, API.calls.getfromrawjson(rawdata, "data"))
|
||||
self.send_message(200, "application/json", result)
|
||||
else: # if not json data
|
||||
self.send_message(422, "application/json", API.calls.jsonify({"error": "Not JSON data."}))
|
||||
else: # if not API function
|
||||
self.send_message(403, "application/json", API.calls.jsonify({"error": "Not an API function"}))
|
||||
Reference in New Issue
Block a user