import argparse import http.server import json import os import ssl class Handler(http.server.BaseHTTPRequestHandler): protocol_version = 'HTTP/1.1' def do_POST(self): length = int(self.headers.get('Content-Length', '0')) if length < 0 or length > 1024 * 1024: self.send_error(413) return self.rfile.read(length) self.send_response(204) self.send_header('Content-Length', '0') self.send_header('Retry-After', '1') self.end_headers() def log_message(self, _format, *_args): pass def main(): parser = argparse.ArgumentParser() parser.add_argument('--cert', required=True) parser.add_argument('--key', required=True) parser.add_argument('--port', required=True, type=int) parser.add_argument('--ready-file', required=True) args = parser.parse_args() server = http.server.ThreadingHTTPServer(('127.0.0.1', args.port), Handler) context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) context.load_cert_chain(args.cert, args.key) server.socket = context.wrap_socket(server.socket, server_side=True) with open(args.ready_file, 'x', encoding='ascii') as handle: json.dump({'port': server.server_port}, handle, separators=(',', ':')) handle.write('\n') os.chmod(args.ready_file, 0o600) server.serve_forever() if __name__ == '__main__': main()