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