diff --git a/test/infamy/file_server.py b/test/infamy/file_server.py index 68de4d9c..266bca58 100644 --- a/test/infamy/file_server.py +++ b/test/infamy/file_server.py @@ -5,24 +5,42 @@ import concurrent.futures import functools import http.server import socket +from infamy.util import until - -class FileServer(http.server.HTTPServer): +class FileServer: """Open web server on (address, port) serving files from directory""" - class RequestHandler(http.server.SimpleHTTPRequestHandler): - def log_message(self, *args, **kwargs): - pass + def __init__(self, netns, address, port, directory): + self.address = address + self.port = port + self.directory = directory + self.netns = netns + self.process = None + self.check_addres = None - address_family = socket.AF_INET6 - def __init__(self, server_address, directory): - rh = functools.partial(FileServer.RequestHandler, directory=directory) - self.__tp = concurrent.futures.ThreadPoolExecutor(max_workers=1) - super().__init__(server_address, rh) + def start(self): + """start HTTP file server""" + cmd = f"httpd -p {self.address}:{self.port} -f -h {self.directory}" + self.process = self.netns.popen(cmd.split(" ")) + if self.address == "[::]": + check_address = "::1" + elif self.address == "0.0.0.0": + check_address = "127.0.0.1" + else: + check_address=self.address + cmd = f"nc -z {check_address} {self.port}".split() + until(lambda: self.netns.run(cmd).returncode == 0) + + + def stop(self): + """Stop HTTP file server""" + if self.process: + self.process.terminate() + self.process.wait() + self.process = None def __enter__(self): - self.__tp.submit(self.serve_forever) + self.start() def __exit__(self, _, __, ___): - self.shutdown() - self.__tp.shutdown() + self.stop()