from http.server import HTTPServer, BaseHTTPRequestHandler import argparse import time import subprocess import sys import os import threading args = None outerthread = None barrier = threading.Barrier(2) class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): def do_GET(self): barrier.wait() self.send_response(200) self.end_headers() data = b'D' if args.speed_limit: slow_deadline = time.time()+args.limit_duration while time.time() < slow_deadline: self.wfile.write(data) if args.speed_limit: time.sleep(1.1) data = data * 100 self.wfile.write(data) self.close_connection = True def runServer(fileName): httpd = HTTPServer(('localhost', 0), SimpleHTTPRequestHandler) with open(fileName,"w") as f: f.write('http://localhost:{}/test'.format(httpd.socket.getsockname()[1])) httpd.handle_request() os.remove(fileName) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('--speed_limit', help='transfer rate limitation', action='store_true',default=False) parser.add_argument('--limit_duration', help='duration of the transfer rate limitation',default=1, type=float) parser.add_argument('--file', help='file to write the url to connect to') parser.add_argument('--subprocess', action='store_true') args = parser.parse_args() if not args.subprocess: subprocess.Popen([sys.executable]+sys.argv+['--subprocess'],stdin=subprocess.DEVNULL, stderr=subprocess.DEVNULL,stdout=subprocess.DEVNULL) else: serverThread = threading.Thread(target=runServer,args=(args.file,)) serverThread.daemon = True serverThread.start() barrier.wait(60) serverThread.join(20)