HTTPServer.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #!/usr/bin/env python3
  2. import http.server
  3. import socketserver
  4. import threading
  5. import html
  6. import yjdaemon.API as API
  7. """
  8. HTTP request handler.
  9. """
  10. class HTTPServerThread(threading.Thread):
  11. def __init__(self, PORT):
  12. threading.Thread.__init__(self)
  13. self.PORT = PORT
  14. def run(self):
  15. Handler = HTTPHandler
  16. socketserver.TCPServer.allow_reuse_address = True
  17. httpd = socketserver.TCPServer(("", self.PORT), Handler)
  18. httpd.serve_forever()
  19. """
  20. REST API
  21. """
  22. class HTTPHandler(http.server.SimpleHTTPRequestHandler):
  23. def send_message(self, status, content_type, data):
  24. self.send_response(status)
  25. self.send_header("Content-type:", content_type)
  26. self.end_headers()
  27. self.wfile.write(data)
  28. self.wfile.write("\n".encode("utf-8"))
  29. def do_GET(self):
  30. """ Serve a GET request. """
  31. path = html.unescape(self.path)
  32. path = str(path).lstrip("/").split("?")[0]
  33. retval = API.calls.APIcall(path)
  34. if retval is not None: # if call is valid API function
  35. try:
  36. args = str(html.unescape(self.path)).lstrip("/").split("?")[1]
  37. except IndexError as e:
  38. print(e)
  39. self.send_message(403, "application/json", API.calls.jsonify({"error": "Missing parameters."}))
  40. return
  41. self.send_message(200, "application/json", retval(args))
  42. else: # else parse as normal HTTP request
  43. f = self.send_head()
  44. if f:
  45. try:
  46. self.copyfile(f, self.wfile)
  47. finally:
  48. f.close()
  49. def do_POST(self):
  50. """ Serve a POST request. """
  51. path = html.unescape(self.path)
  52. path = str(path).lstrip("/").split("?")[0]
  53. retval = API.calls.APIcall(path)
  54. if retval is not None: # if call is valid API function
  55. try:
  56. args = str(html.unescape(self.path)).lstrip("/").split("?")[1] #if no args
  57. except IndexError as e:
  58. print(e)
  59. self.send_message(403, "application/json", API.calls.jsonify({"error": "Missing parameters."}))
  60. return
  61. if self.headers["Content-Type"] == 'application/json': # if data is json data
  62. length = int(self.headers["Content-Length"])
  63. rawdata = self.rfile.read(length)
  64. result = retval(args, API.calls.getfromrawjson(rawdata, "data"))
  65. self.send_message(200, "application/json", result)
  66. else: # if not json data
  67. self.send_message(422, "application/json", API.calls.jsonify({"error": "Not JSON data."}))
  68. else: # if not API function
  69. self.send_message(403, "application/json", API.calls.jsonify({"error": "Not an API function"}))