#!/usr/bin/env python3 """ Very simple HTTP server in python for logging requests Usage:: ./server.py [] """ from http.server import BaseHTTPRequestHandler, HTTPServer import json import logging import os import datetime class S(BaseHTTPRequestHandler): def do_OPTIONS(self): self.send_response(200, "ok") # TODO remove in production self.send_header('Access-Control-Allow-Origin', '*') # TODO remove in production self.send_header('Access-Control-Allow-Methods', 'GET, OPTIONS') # TODO remove in production self.send_header("Access-Control-Allow-Headers", "X-Requested-With") # TODO remove in production self.send_header("Access-Control-Allow-Headers", "Content-Type") self.end_headers() def do_GET(self): self.send_response(200) self.send_header('Content-Type', 'application/json') self.end_headers() with open('schedule.json', 'r') as file: schedule_string = json.load(file) self.wfile.write(json.dumps(schedule_string).encode('utf-8')) def do_POST(self): self.send_response(200, "ok") # TODO remove in production self.send_header('Access-Control-Allow-Origin', '*') # TODO remove in production self.send_header('Access-Control-Allow-Methods', 'GET, OPTIONS') # TODO remove in production self.send_header("Access-Control-Allow-Headers", "X-Requested-With") # TODO remove in production self.send_header("Access-Control-Allow-Headers", "Content-Type") self.end_headers() content_length = int(self.headers['Content-Length']) request_raw = self.rfile.read(content_length) request_content = json.loads(request_raw) schedule = request_content['schedule'] pw = request_content['pw'] caption = request_content['caption'] heading = request_content['heading'] if pw != '123': self.send_response(401) self.send_header('Content-Type', 'text/html') self.end_headers() self.wfile.write("Unauthorized".encode('utf-8')) schedule_and_caption = {} schedule_and_caption['schedule'] = schedule schedule_and_caption['caption'] = caption schedule_and_caption['heading'] = heading now = datetime.datetime.now() try: os.rename('schedule.json', 'schedule_{}.json'.format(now.strftime("%Y%m%d"))) except Exception: logging.info('Backup exists, did not backup..') pass with open('schedule.json', 'w') as file: json.dump(schedule_and_caption, file) self.send_response(200) self.send_header('Content-Type', 'text/html') self.end_headers() self.wfile.write("New schedule set".encode('utf-8')) def run(server_class=HTTPServer, handler_class=S, port=8080): logging.basicConfig(level=logging.INFO) server_address = ('', port) httpd = server_class(server_address, handler_class) logging.info('Starting httpd...\n') try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() logging.info('Stopping httpd...\n') if __name__ == '__main__': from sys import argv if len(argv) == 2: run(port=int(argv[1])) else: run()