get-with-headers.py
92 lines
| 2.4 KiB
| text/x-python
|
PythonLexer
/ tests / get-with-headers.py
Eric Hopper
|
r2532 | #!/usr/bin/env python | ||
Martin Geisler
|
r8447 | """This does HTTP GET requests given a host:port and path and returns | ||
Eric Hopper
|
r2532 | a subset of the headers plus the body of the result.""" | ||
Robert Stanca
|
r28726 | from __future__ import absolute_import, print_function | ||
Gregory Szorc
|
r27296 | |||
import json | ||||
import os | ||||
import sys | ||||
Patrick Mezard
|
r7054 | |||
Pulkit Goyal
|
r29455 | from mercurial import ( | ||
util, | ||||
) | ||||
httplib = util.httplib | ||||
Patrick Mezard
|
r7054 | try: | ||
Gregory Szorc
|
r27296 | import msvcrt | ||
Patrick Mezard
|
r7054 | msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) | ||
msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY) | ||||
except ImportError: | ||||
pass | ||||
Dirkjan Ochtman
|
r12182 | twice = False | ||
if '--twice' in sys.argv: | ||||
sys.argv.remove('--twice') | ||||
twice = True | ||||
Pierre-Yves David
|
r18400 | headeronly = False | ||
if '--headeronly' in sys.argv: | ||||
sys.argv.remove('--headeronly') | ||||
headeronly = True | ||||
Gregory Szorc
|
r24543 | formatjson = False | ||
if '--json' in sys.argv: | ||||
sys.argv.remove('--json') | ||||
formatjson = True | ||||
Dirkjan Ochtman
|
r12182 | |||
Gregory Szorc
|
r30764 | hgproto = None | ||
if '--hgproto' in sys.argv: | ||||
idx = sys.argv.index('--hgproto') | ||||
hgproto = sys.argv[idx + 1] | ||||
sys.argv.pop(idx) | ||||
sys.argv.pop(idx) | ||||
Dirkjan Ochtman
|
r12182 | tag = None | ||
def request(host, path, show): | ||||
Mads Kiilerich
|
r17017 | assert not path.startswith('/'), path | ||
Dirkjan Ochtman
|
r12182 | global tag | ||
headers = {} | ||||
if tag: | ||||
headers['If-None-Match'] = tag | ||||
Gregory Szorc
|
r30764 | if hgproto: | ||
headers['X-HgProto-1'] = hgproto | ||||
Bryan O'Sullivan
|
r5561 | |||
Dirkjan Ochtman
|
r12182 | conn = httplib.HTTPConnection(host) | ||
Mads Kiilerich
|
r17017 | conn.request("GET", '/' + path, None, headers) | ||
Dirkjan Ochtman
|
r12182 | response = conn.getresponse() | ||
Robert Stanca
|
r28726 | print(response.status, response.reason) | ||
Mads Kiilerich
|
r18380 | if show[:1] == ['-']: | ||
Mads Kiilerich
|
r18393 | show = sorted(h for h, v in response.getheaders() | ||
if h.lower() not in show) | ||||
Dirkjan Ochtman
|
r12182 | for h in [h.lower() for h in show]: | ||
if response.getheader(h, None) is not None: | ||||
Robert Stanca
|
r28726 | print("%s: %s" % (h, response.getheader(h))) | ||
Pierre-Yves David
|
r18400 | if not headeronly: | ||
Robert Stanca
|
r28726 | print() | ||
Gregory Szorc
|
r23409 | data = response.read() | ||
Gregory Szorc
|
r24543 | |||
# Pretty print JSON. This also has the beneficial side-effect | ||||
# of verifying emitted JSON is well-formed. | ||||
if formatjson: | ||||
# json.dumps() will print trailing newlines. Eliminate them | ||||
# to make tests easier to write. | ||||
data = json.loads(data) | ||||
lines = json.dumps(data, sort_keys=True, indent=2).splitlines() | ||||
for line in lines: | ||||
Robert Stanca
|
r28726 | print(line.rstrip()) | ||
Gregory Szorc
|
r24543 | else: | ||
sys.stdout.write(data) | ||||
Dirkjan Ochtman
|
r12182 | |||
Gregory Szorc
|
r31791 | if twice and response.getheader('ETag', None): | ||
tag = response.getheader('ETag') | ||||
Dirkjan Ochtman
|
r12182 | |||
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: | ||||
Bryan O'Sullivan
|
r5561 | sys.exit(0) | ||
sys.exit(1) | ||||