view tests/dumbhttp.py @ 23344:6333412245ec stable

mq: when setting message in plain mode, separate it from header (issue4453) Fix inconsistent handling of plain header separation in mq patcheader - and contrary to c87f2a5a6e49, do it in the direction of having an empty line between header and description. Plain patches are like mails and should thus have an empty line between headers and body in compliance with RFC 822 3.1.
author Mads Kiilerich <madski@unity3d.com>
date Sun, 16 Nov 2014 19:57:40 +0100
parents 10116463b0b1
children 6eab50a34fed
line wrap: on
line source

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