tests/dumbhttp.py
author Martin von Zweigbergk <martinvonz@gmail.com>
Tue, 14 Oct 2014 17:09:16 -0700
changeset 22964 2793ecb1522d
parent 22959 10116463b0b1
child 23136 6eab50a34fed
permissions -rw-r--r--
manifest: repurpose flagsdiff() into (node-and-flag)diff() The manifestdict class already has a method for diff flags between two manifests (presumably because there is no full access to the private _flags field). The only caller is merge.manifestmerge(), which also wants a diff of files between the same manifests. Let's combine the code for diffing files and flags into a single method on manifestdict. This puts all the manifest diffing in one place and will allow for further simplification. It might also be useful for it to be encapsulated in manifestdict if we later decide to to shard manifests. The docstring is intentionally unclear about missing entries for now.

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