#!/usr/bin/env python3

import socket
import ssl
import threading

PORT = 8880

def handle_client(client_socket, client_address):
    logging.info(f'Serving client {client_address}')
    try:
        request = b''
        while len(request)<4 or request[-4:] != b'\r\n\r\n':
            add = client_socket.recv(1)
            if not add:
                client_socket.close()
                return
            request += add
        logging.debug(f'REQUEST {request}')
        for line in request.split(b'\r\n'):
            logging.debug(f'  {line}')
        response = b'\r\n'.join([ bytes(line, 'utf-8') for line in [
            'HTTP/1.0 200 OK',
            'Content-Type: text/plain; charset=utf-8',
            'Content-Length: 2',
            '',
            'OK',
            ]])
        logging.debug(f'RESPONSE {response}')
        for line in response.split(b'\r\n'):
            logging.debug(f'  {line}')
        client_socket.sendall(response)
    finally:
        client_socket.close()

if __name__ == '__main__':
    import argparse
    import logging
    parser = argparse.ArgumentParser(description='HTTP Server')
    parser.add_argument('--debug', action='store_true')
    parser.add_argument('--host', default='')
    parser.add_argument('--port', type=int, default=PORT)
    args = parser.parse_args()
    if args.debug:
        logging.basicConfig(level=logging.DEBUG)
    else:
        logging.basicConfig(level=logging.INFO)
    logging.info(f'Starting HTTP Server on {args.host}:{args.port}')
    with socket.create_server((args.host, args.port), reuse_port=True) as server_socket:
        server_socket.listen()
        context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
        context.load_cert_chain('certificate/certificate.crt', 'certificate/private.key')
        with context.wrap_socket(server_socket, server_side=True) as server_socket:
            while True:
                try:
                    client_socket, client_address = server_socket.accept()
                    threading.Thread(target=handle_client, args=(client_socket, client_address)).start()
                except ssl.SSLError:
                    pass
