dumbhttp.py
54 lines
| 2.1 KiB
| text/x-python
|
PythonLexer
/ tests / dumbhttp.py
|
r22959 | #!/usr/bin/env python | ||
""" | ||||
Small and dumb HTTP server for use in tests. | ||||
""" | ||||
from optparse import OptionParser | ||||
import BaseHTTPServer, SimpleHTTPServer, os, signal, subprocess, sys | ||||
def run(server_class=BaseHTTPServer.HTTPServer, | ||||
handler_class=SimpleHTTPServer.SimpleHTTPRequestHandler, | ||||
server_address=('localhost', 8000)): | ||||
httpd = server_class(server_address, handler_class) | ||||
httpd.serve_forever() | ||||
if __name__ == '__main__': | ||||
parser = OptionParser() | ||||
parser.add_option('-p', '--port', dest='port', type='int', default=8000, | ||||
help='TCP port to listen on', metavar='PORT') | ||||
parser.add_option('-H', '--host', dest='host', default='localhost', | ||||
help='hostname or IP to listen on', metavar='HOST') | ||||
parser.add_option('--pid', dest='pid', | ||||
help='file name where the PID of the server is stored') | ||||
parser.add_option('-f', '--foreground', dest='foreground', | ||||
action='store_true', | ||||
help='do not start the HTTP server in the background') | ||||
(options, args) = parser.parse_args() | ||||
signal.signal(signal.SIGTERM, lambda x, y: sys.exit(0)) | ||||
if options.foreground and options.pid: | ||||
parser.error("options --pid and --foreground are mutually exclusive") | ||||
if options.foreground: | ||||
run(server_address=(options.host, options.port)) | ||||
else: | ||||
# This doesn't attempt to cleanly detach the process, as it's not | ||||
# meant to be a long-lived, independent process. As a consequence, | ||||
# it's still part of the same process group, and keeps any file | ||||
# descriptors it might have inherited besided stdin/stdout/stderr. | ||||
# Trying to do things cleanly is more complicated, requires | ||||
# OS-dependent code, and is not worth the effort. | ||||
proc = subprocess.Popen([sys.executable, __file__, '-f', | ||||
'-H', options.host, '-p', str(options.port)], | ||||
stdin=open(os.devnull, 'r'), | ||||
stdout=open(os.devnull, 'w'), | ||||
stderr=subprocess.STDOUT) | ||||
if options.pid: | ||||
fp = file(options.pid, 'wb') | ||||
fp.write(str(proc.pid) + '\n') | ||||
fp.close() | ||||