diff options
Diffstat (limited to 'utils/utils.py')
-rw-r--r-- | utils/utils.py | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/utils/utils.py b/utils/utils.py index db4bab57..1fdea5d9 100644 --- a/utils/utils.py +++ b/utils/utils.py @@ -14,6 +14,10 @@ import re import lxml.etree as ET +import http.server +import multiprocessing +import os +import sys @contextmanager def init_colorama(): @@ -215,3 +219,41 @@ def sanitize(string): string = re.sub(r"\s+", "-", string) # percent encode the result return urllib.parse.quote(string) + + +class HTTPServerProcess(multiprocessing.Process): + """This class can be used to run an HTTP server.""" + + def __init__(self, rootdir): + """Initialize the HTTPServerProcess class. + + Parameters + ---------- + rootdir : str + The root directory to serve from. + + """ + + super().__init__() + self.rootdir = rootdir + + def run(self): + """Create an HTTP server and serve forever. + + Runs on localhost. The default port is 8000; if it is not + available, a random port is used instead. + """ + + os.chdir(self.rootdir) + # pylint: disable=invalid-name + HandlerClass = http.server.SimpleHTTPRequestHandler + try: + httpd = http.server.HTTPServer(("", 8001), HandlerClass) + except OSError: + httpd = http.server.HTTPServer(("", 0), HandlerClass) + _, portnumber = httpd.socket.getsockname() + sys.stderr.write("server serving on http://localhost:%d\n" % portnumber) + try: + httpd.serve_forever() + except KeyboardInterrupt: + httpd.shutdown() |