##// END OF EJS Templates
tests: use argparse in get-with-headers.py...
Gregory Szorc -
r35798:32317f8b default
parent child Browse files
Show More
@@ -1,92 +1,89 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2
2
3 """This does HTTP GET requests given a host:port and path and returns
3 """This does HTTP GET requests given a host:port and path and returns
4 a subset of the headers plus the body of the result."""
4 a subset of the headers plus the body of the result."""
5
5
6 from __future__ import absolute_import, print_function
6 from __future__ import absolute_import, print_function
7
7
8 import argparse
8 import json
9 import json
9 import os
10 import os
10 import sys
11 import sys
11
12
12 from mercurial import (
13 from mercurial import (
13 util,
14 util,
14 )
15 )
15
16
16 httplib = util.httplib
17 httplib = util.httplib
17
18
18 try:
19 try:
19 import msvcrt
20 import msvcrt
20 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
21 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
21 msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
22 msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
22 except ImportError:
23 except ImportError:
23 pass
24 pass
24
25
25 twice = False
26 parser = argparse.ArgumentParser()
26 if '--twice' in sys.argv:
27 parser.add_argument('--twice', action='store_true')
27 sys.argv.remove('--twice')
28 parser.add_argument('--headeronly', action='store_true')
28 twice = True
29 parser.add_argument('--json', action='store_true')
29 headeronly = False
30 parser.add_argument('--hgproto')
30 if '--headeronly' in sys.argv:
31 parser.add_argument('host')
31 sys.argv.remove('--headeronly')
32 parser.add_argument('path')
32 headeronly = True
33 parser.add_argument('show', nargs='*')
33 formatjson = False
34 if '--json' in sys.argv:
35 sys.argv.remove('--json')
36 formatjson = True
37
34
38 hgproto = None
35 args = parser.parse_args()
39 if '--hgproto' in sys.argv:
36
40 idx = sys.argv.index('--hgproto')
37 twice = args.twice
41 hgproto = sys.argv[idx + 1]
38 headeronly = args.headeronly
42 sys.argv.pop(idx)
39 formatjson = args.json
43 sys.argv.pop(idx)
40 hgproto = args.hgproto
44
41
45 tag = None
42 tag = None
46 def request(host, path, show):
43 def request(host, path, show):
47 assert not path.startswith('/'), path
44 assert not path.startswith('/'), path
48 global tag
45 global tag
49 headers = {}
46 headers = {}
50 if tag:
47 if tag:
51 headers['If-None-Match'] = tag
48 headers['If-None-Match'] = tag
52 if hgproto:
49 if hgproto:
53 headers['X-HgProto-1'] = hgproto
50 headers['X-HgProto-1'] = hgproto
54
51
55 conn = httplib.HTTPConnection(host)
52 conn = httplib.HTTPConnection(host)
56 conn.request("GET", '/' + path, None, headers)
53 conn.request("GET", '/' + path, None, headers)
57 response = conn.getresponse()
54 response = conn.getresponse()
58 print(response.status, response.reason)
55 print(response.status, response.reason)
59 if show[:1] == ['-']:
56 if show[:1] == ['-']:
60 show = sorted(h for h, v in response.getheaders()
57 show = sorted(h for h, v in response.getheaders()
61 if h.lower() not in show)
58 if h.lower() not in show)
62 for h in [h.lower() for h in show]:
59 for h in [h.lower() for h in show]:
63 if response.getheader(h, None) is not None:
60 if response.getheader(h, None) is not None:
64 print("%s: %s" % (h, response.getheader(h)))
61 print("%s: %s" % (h, response.getheader(h)))
65 if not headeronly:
62 if not headeronly:
66 print()
63 print()
67 data = response.read()
64 data = response.read()
68
65
69 # Pretty print JSON. This also has the beneficial side-effect
66 # Pretty print JSON. This also has the beneficial side-effect
70 # of verifying emitted JSON is well-formed.
67 # of verifying emitted JSON is well-formed.
71 if formatjson:
68 if formatjson:
72 # json.dumps() will print trailing newlines. Eliminate them
69 # json.dumps() will print trailing newlines. Eliminate them
73 # to make tests easier to write.
70 # to make tests easier to write.
74 data = json.loads(data)
71 data = json.loads(data)
75 lines = json.dumps(data, sort_keys=True, indent=2).splitlines()
72 lines = json.dumps(data, sort_keys=True, indent=2).splitlines()
76 for line in lines:
73 for line in lines:
77 print(line.rstrip())
74 print(line.rstrip())
78 else:
75 else:
79 sys.stdout.write(data)
76 sys.stdout.write(data)
80
77
81 if twice and response.getheader('ETag', None):
78 if twice and response.getheader('ETag', None):
82 tag = response.getheader('ETag')
79 tag = response.getheader('ETag')
83
80
84 return response.status
81 return response.status
85
82
86 status = request(sys.argv[1], sys.argv[2], sys.argv[3:])
83 status = request(args.host, args.path, args.show)
87 if twice:
84 if twice:
88 status = request(sys.argv[1], sys.argv[2], sys.argv[3:])
85 status = request(args.host, args.path, args.show)
89
86
90 if 200 <= status <= 305:
87 if 200 <= status <= 305:
91 sys.exit(0)
88 sys.exit(0)
92 sys.exit(1)
89 sys.exit(1)
General Comments 0
You need to be logged in to leave comments. Login now