tests/dumbhttp.py
author Mads Kiilerich <madski@unity3d.com>
Sun, 26 Oct 2014 12:14:12 +0100
branchstable
changeset 23088 fe5f044b753d
parent 22959 10116463b0b1
child 23136 6eab50a34fed
permissions -rw-r--r--
changelog: use headrevsfiltered 2b5940f64750 introduced use of the new filtering headrevs C implementation. It caught TypeError to detect when to fall back to the implementation that was compatible with old extensions. That method was however not reliable. Instead, use the new headrevsfiltered function when passing a filter. It will reliably fail with AttributeError when an old extension that predates headrevsfiltered is used.

#!/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()