| 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) |