--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/dumbhttp.py Thu Oct 16 13:48:51 2014 +0900
@@ -0,0 +1,54 @@
+#!/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()