tests/get-with-headers.py
author Gregory Szorc <gregory.szorc@gmail.com>
Mon, 24 Mar 2014 22:12:37 -0700
branchstable
changeset 1366 987a80dec7db
parent 1297 60e578eae19d
permissions -rwxr-xr-x
run-tests: allow test paths in other directories Previously, test paths were assumed to be in the same directory and wouldn't have a directory component. If a path with a directory component was specified, it would be filtered out. This change allow paths to contain directories. This in turn allows tests from other directories to be executed. Executing tests in other directories may break assumptions elsewhere in the testing code. However, on initial glance, things appear to "just work." This approach of running tests from other directories is successfully being used at https://hg.mozilla.org/hgcustom/version-control-tools/file/7085790ff3af/run-mercurial-tests.py [ original upstream message ]

#!/usr/bin/env python

"""This does HTTP GET requests given a host:port and path and returns
a subset of the headers plus the body of the result."""

import httplib, sys

try:
    import msvcrt, os
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
    msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
except ImportError:
    pass

twice = False
if '--twice' in sys.argv:
    sys.argv.remove('--twice')
    twice = True
headeronly = False
if '--headeronly' in sys.argv:
    sys.argv.remove('--headeronly')
    headeronly = True

reasons = {'Not modified': 'Not Modified'} # python 2.4

tag = None
def request(host, path, show):
    assert not path.startswith('/'), path
    global tag
    headers = {}
    if tag:
        headers['If-None-Match'] = tag

    conn = httplib.HTTPConnection(host)
    conn.request("GET", '/' + path, None, headers)
    response = conn.getresponse()
    print response.status, reasons.get(response.reason, response.reason)
    if show[:1] == ['-']:
        show = sorted(h for h, v in response.getheaders()
                      if h.lower() not in show)
    for h in [h.lower() for h in show]:
        if response.getheader(h, None) is not None:
            print "%s: %s" % (h, response.getheader(h))
    if not headeronly:
        print
        if response.status != 500:
            data = response.read()
            sys.stdout.write(data)

        if twice and response.getheader('ETag', None):
            tag = response.getheader('ETag')

    return response.status

status = request(sys.argv[1], sys.argv[2], sys.argv[3:])
if twice:
    status = request(sys.argv[1], sys.argv[2], sys.argv[3:])

if 200 <= status <= 305:
    sys.exit(0)
sys.exit(1)