comparison tests/test-wireproto-content-redirects.t @ 40023:10cf8b116dd8

wireprotov2: advertise redirect targets in capabilities This is pretty straightforward. Redirect targets will require an extension to support. So we've added a function that can be wrapped to define redirect targets. To test this, we teach our simple cache test extension to read redirect targets from a file. It's a bit hacky. But it gets the job done. Differential Revision: https://phab.mercurial-scm.org/D4775
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 26 Sep 2018 17:46:48 -0700
parents
children 86b22a4cfab1
comparison
equal deleted inserted replaced
40022:33eb670e2834 40023:10cf8b116dd8
1 $ . $TESTDIR/wireprotohelpers.sh
2
3 $ hg init server
4 $ enablehttpv2 server
5 $ cd server
6 $ cat >> .hg/hgrc << EOF
7 > [extensions]
8 > simplecache = $TESTDIR/wireprotosimplecache.py
9 > EOF
10
11 $ echo a0 > a
12 $ echo b0 > b
13 $ hg -q commit -A -m 'commit 0'
14 $ echo a1 > a
15 $ hg commit -m 'commit 1'
16
17 $ hg --debug debugindex -m
18 rev linkrev nodeid p1 p2
19 0 0 992f4779029a3df8d0666d00bb924f69634e2641 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
20 1 1 a988fb43583e871d1ed5750ee074c6d840bbbfc8 992f4779029a3df8d0666d00bb924f69634e2641 0000000000000000000000000000000000000000
21
22 $ hg --config simplecache.redirectsfile=redirects.py serve -p $HGPORT -d --pid-file hg.pid -E error.log
23 $ cat hg.pid > $DAEMON_PIDS
24
25 $ cat > redirects.py << EOF
26 > [
27 > {
28 > b'name': b'target-a',
29 > b'protocol': b'http',
30 > b'snirequired': False,
31 > b'tlsversions': [b'1.2', b'1.3'],
32 > b'uris': [b'http://example.com/'],
33 > },
34 > ]
35 > EOF
36
37 Redirect targets advertised when configured
38
39 $ sendhttpv2peerhandshake << EOF
40 > command capabilities
41 > EOF
42 creating http peer for wire protocol version 2
43 s> GET /?cmd=capabilities HTTP/1.1\r\n
44 s> Accept-Encoding: identity\r\n
45 s> vary: X-HgProto-1,X-HgUpgrade-1\r\n
46 s> x-hgproto-1: cbor\r\n
47 s> x-hgupgrade-1: exp-http-v2-0002\r\n
48 s> accept: application/mercurial-0.1\r\n
49 s> host: $LOCALIP:$HGPORT\r\n (glob)
50 s> user-agent: Mercurial debugwireproto\r\n
51 s> \r\n
52 s> makefile('rb', None)
53 s> HTTP/1.1 200 OK\r\n
54 s> Server: testing stub value\r\n
55 s> Date: $HTTP_DATE$\r\n
56 s> Content-Type: application/mercurial-cbor\r\n
57 s> Content-Length: 1970\r\n
58 s> \r\n
59 s> \xa3GapibaseDapi/Dapis\xa1Pexp-http-v2-0002\xa6Hcommands\xaaIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x84IbookmarksGparentsEphaseHrevisionInoderange\xa3Gdefault\xf6Hrequired\xf4DtypeDlistEnodes\xa3Gdefault\xf6Hrequired\xf4DtypeDlistJnodesdepth\xa3Gdefault\xf6Hrequired\xf4DtypeCintKpermissions\x81DpullHfiledata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDpath\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xa3Gdefault\xf4Hrequired\xf4DtypeDboolKpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\xa3Gdefault\x80Hrequired\xf4DtypeDlistKpermissions\x81DpullHlistkeys\xa2Dargs\xa1Inamespace\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullFlookup\xa2Dargs\xa1Ckey\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullLmanifestdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDtree\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullGpushkey\xa2Dargs\xa4Ckey\xa2Hrequired\xf5DtypeEbytesInamespace\xa2Hrequired\xf5DtypeEbytesCnew\xa2Hrequired\xf5DtypeEbytesCold\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpushKcompression\x82\xa1DnameDzstd\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Rpathfilterprefixes\xd9\x01\x02\x82Epath:Lrootfilesin:Nrawrepoformats\x82LgeneraldeltaHrevlogv1Hredirect\xa2Fhashes\x82Fsha256Dsha1Gtargets\x81\xa5DnameHtarget-aHprotocolDhttpKsnirequired\xf4Ktlsversions\x82C1.2C1.3Duris\x81Shttp://example.com/Nv1capabilitiesY\x01\xd8batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
60 sending capabilities command
61 s> POST /api/exp-http-v2-0002/ro/capabilities HTTP/1.1\r\n
62 s> Accept-Encoding: identity\r\n
63 s> accept: application/mercurial-exp-framing-0005\r\n
64 s> content-type: application/mercurial-exp-framing-0005\r\n
65 s> content-length: 27\r\n
66 s> host: $LOCALIP:$HGPORT\r\n (glob)
67 s> user-agent: Mercurial debugwireproto\r\n
68 s> \r\n
69 s> \x13\x00\x00\x01\x00\x01\x01\x11\xa1DnameLcapabilities
70 s> makefile('rb', None)
71 s> HTTP/1.1 200 OK\r\n
72 s> Server: testing stub value\r\n
73 s> Date: $HTTP_DATE$\r\n
74 s> Content-Type: application/mercurial-exp-framing-0005\r\n
75 s> Transfer-Encoding: chunked\r\n
76 s> \r\n
77 s> 13\r\n
78 s> \x0b\x00\x00\x01\x00\x02\x011
79 s> \xa1FstatusBok
80 s> \r\n
81 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
82 s> 5ab\r\n
83 s> \xa3\x05\x00\x01\x00\x02\x001
84 s> \xa6Hcommands\xaaIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x84IbookmarksGparentsEphaseHrevisionInoderange\xa3Gdefault\xf6Hrequired\xf4DtypeDlistEnodes\xa3Gdefault\xf6Hrequired\xf4DtypeDlistJnodesdepth\xa3Gdefault\xf6Hrequired\xf4DtypeCintKpermissions\x81DpullHfiledata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDpath\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xa3Gdefault\xf4Hrequired\xf4DtypeDboolKpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\xa3Gdefault\x80Hrequired\xf4DtypeDlistKpermissions\x81DpullHlistkeys\xa2Dargs\xa1Inamespace\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullFlookup\xa2Dargs\xa1Ckey\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullLmanifestdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDtree\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullGpushkey\xa2Dargs\xa4Ckey\xa2Hrequired\xf5DtypeEbytesInamespace\xa2Hrequired\xf5DtypeEbytesCnew\xa2Hrequired\xf5DtypeEbytesCold\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpushKcompression\x82\xa1DnameDzstd\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Rpathfilterprefixes\xd9\x01\x02\x82Epath:Lrootfilesin:Nrawrepoformats\x82LgeneraldeltaHrevlogv1Hredirect\xa2Fhashes\x82Fsha256Dsha1Gtargets\x81\xa5DnameHtarget-aHprotocolDhttpKsnirequired\xf4Ktlsversions\x82C1.2C1.3Duris\x81Shttp://example.com/
85 s> \r\n
86 received frame(size=1443; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
87 s> 8\r\n
88 s> \x00\x00\x00\x01\x00\x02\x002
89 s> \r\n
90 s> 0\r\n
91 s> \r\n
92 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
93 response: gen[
94 {
95 b'commands': {
96 b'branchmap': {
97 b'args': {},
98 b'permissions': [
99 b'pull'
100 ]
101 },
102 b'capabilities': {
103 b'args': {},
104 b'permissions': [
105 b'pull'
106 ]
107 },
108 b'changesetdata': {
109 b'args': {
110 b'fields': {
111 b'default': set([]),
112 b'required': False,
113 b'type': b'set',
114 b'validvalues': set([
115 b'bookmarks',
116 b'parents',
117 b'phase',
118 b'revision'
119 ])
120 },
121 b'noderange': {
122 b'default': None,
123 b'required': False,
124 b'type': b'list'
125 },
126 b'nodes': {
127 b'default': None,
128 b'required': False,
129 b'type': b'list'
130 },
131 b'nodesdepth': {
132 b'default': None,
133 b'required': False,
134 b'type': b'int'
135 }
136 },
137 b'permissions': [
138 b'pull'
139 ]
140 },
141 b'filedata': {
142 b'args': {
143 b'fields': {
144 b'default': set([]),
145 b'required': False,
146 b'type': b'set',
147 b'validvalues': set([
148 b'parents',
149 b'revision'
150 ])
151 },
152 b'haveparents': {
153 b'default': False,
154 b'required': False,
155 b'type': b'bool'
156 },
157 b'nodes': {
158 b'required': True,
159 b'type': b'list'
160 },
161 b'path': {
162 b'required': True,
163 b'type': b'bytes'
164 }
165 },
166 b'permissions': [
167 b'pull'
168 ]
169 },
170 b'heads': {
171 b'args': {
172 b'publiconly': {
173 b'default': False,
174 b'required': False,
175 b'type': b'bool'
176 }
177 },
178 b'permissions': [
179 b'pull'
180 ]
181 },
182 b'known': {
183 b'args': {
184 b'nodes': {
185 b'default': [],
186 b'required': False,
187 b'type': b'list'
188 }
189 },
190 b'permissions': [
191 b'pull'
192 ]
193 },
194 b'listkeys': {
195 b'args': {
196 b'namespace': {
197 b'required': True,
198 b'type': b'bytes'
199 }
200 },
201 b'permissions': [
202 b'pull'
203 ]
204 },
205 b'lookup': {
206 b'args': {
207 b'key': {
208 b'required': True,
209 b'type': b'bytes'
210 }
211 },
212 b'permissions': [
213 b'pull'
214 ]
215 },
216 b'manifestdata': {
217 b'args': {
218 b'fields': {
219 b'default': set([]),
220 b'required': False,
221 b'type': b'set',
222 b'validvalues': set([
223 b'parents',
224 b'revision'
225 ])
226 },
227 b'haveparents': {
228 b'default': False,
229 b'required': False,
230 b'type': b'bool'
231 },
232 b'nodes': {
233 b'required': True,
234 b'type': b'list'
235 },
236 b'tree': {
237 b'required': True,
238 b'type': b'bytes'
239 }
240 },
241 b'permissions': [
242 b'pull'
243 ]
244 },
245 b'pushkey': {
246 b'args': {
247 b'key': {
248 b'required': True,
249 b'type': b'bytes'
250 },
251 b'namespace': {
252 b'required': True,
253 b'type': b'bytes'
254 },
255 b'new': {
256 b'required': True,
257 b'type': b'bytes'
258 },
259 b'old': {
260 b'required': True,
261 b'type': b'bytes'
262 }
263 },
264 b'permissions': [
265 b'push'
266 ]
267 }
268 },
269 b'compression': [
270 {
271 b'name': b'zstd'
272 },
273 {
274 b'name': b'zlib'
275 }
276 ],
277 b'framingmediatypes': [
278 b'application/mercurial-exp-framing-0005'
279 ],
280 b'pathfilterprefixes': set([
281 b'path:',
282 b'rootfilesin:'
283 ]),
284 b'rawrepoformats': [
285 b'generaldelta',
286 b'revlogv1'
287 ],
288 b'redirect': {
289 b'hashes': [
290 b'sha256',
291 b'sha1'
292 ],
293 b'targets': [
294 {
295 b'name': b'target-a',
296 b'protocol': b'http',
297 b'snirequired': False,
298 b'tlsversions': [
299 b'1.2',
300 b'1.3'
301 ],
302 b'uris': [
303 b'http://example.com/'
304 ]
305 }
306 ]
307 }
308 }
309 ]
310
311 $ cat > redirects.py << EOF
312 > [
313 > {
314 > b'name': b'target-a',
315 > b'protocol': b'http',
316 > b'uris': [b'http://example.com/'],
317 > },
318 > {
319 > b'name': b'target-b',
320 > b'protocol': b'unknown',
321 > b'uris': [b'unknown://example.com/'],
322 > },
323 > ]
324 > EOF
325
326 $ sendhttpv2peerhandshake << EOF
327 > command capabilities
328 > EOF
329 creating http peer for wire protocol version 2
330 s> GET /?cmd=capabilities HTTP/1.1\r\n
331 s> Accept-Encoding: identity\r\n
332 s> vary: X-HgProto-1,X-HgUpgrade-1\r\n
333 s> x-hgproto-1: cbor\r\n
334 s> x-hgupgrade-1: exp-http-v2-0002\r\n
335 s> accept: application/mercurial-0.1\r\n
336 s> host: $LOCALIP:$HGPORT\r\n (glob)
337 s> user-agent: Mercurial debugwireproto\r\n
338 s> \r\n
339 s> makefile('rb', None)
340 s> HTTP/1.1 200 OK\r\n
341 s> Server: testing stub value\r\n
342 s> Date: $HTTP_DATE$\r\n
343 s> Content-Type: application/mercurial-cbor\r\n
344 s> Content-Length: 1997\r\n
345 s> \r\n
346 s> \xa3GapibaseDapi/Dapis\xa1Pexp-http-v2-0002\xa6Hcommands\xaaIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x84IbookmarksGparentsEphaseHrevisionInoderange\xa3Gdefault\xf6Hrequired\xf4DtypeDlistEnodes\xa3Gdefault\xf6Hrequired\xf4DtypeDlistJnodesdepth\xa3Gdefault\xf6Hrequired\xf4DtypeCintKpermissions\x81DpullHfiledata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDpath\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xa3Gdefault\xf4Hrequired\xf4DtypeDboolKpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\xa3Gdefault\x80Hrequired\xf4DtypeDlistKpermissions\x81DpullHlistkeys\xa2Dargs\xa1Inamespace\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullFlookup\xa2Dargs\xa1Ckey\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullLmanifestdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDtree\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullGpushkey\xa2Dargs\xa4Ckey\xa2Hrequired\xf5DtypeEbytesInamespace\xa2Hrequired\xf5DtypeEbytesCnew\xa2Hrequired\xf5DtypeEbytesCold\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpushKcompression\x82\xa1DnameDzstd\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Rpathfilterprefixes\xd9\x01\x02\x82Epath:Lrootfilesin:Nrawrepoformats\x82LgeneraldeltaHrevlogv1Hredirect\xa2Fhashes\x82Fsha256Dsha1Gtargets\x82\xa3DnameHtarget-aHprotocolDhttpDuris\x81Shttp://example.com/\xa3DnameHtarget-bHprotocolGunknownDuris\x81Vunknown://example.com/Nv1capabilitiesY\x01\xd8batch branchmap $USUAL_BUNDLE2_CAPS$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
347 sending capabilities command
348 s> POST /api/exp-http-v2-0002/ro/capabilities HTTP/1.1\r\n
349 s> Accept-Encoding: identity\r\n
350 s> accept: application/mercurial-exp-framing-0005\r\n
351 s> content-type: application/mercurial-exp-framing-0005\r\n
352 s> content-length: 27\r\n
353 s> host: $LOCALIP:$HGPORT\r\n (glob)
354 s> user-agent: Mercurial debugwireproto\r\n
355 s> \r\n
356 s> \x13\x00\x00\x01\x00\x01\x01\x11\xa1DnameLcapabilities
357 s> makefile('rb', None)
358 s> HTTP/1.1 200 OK\r\n
359 s> Server: testing stub value\r\n
360 s> Date: $HTTP_DATE$\r\n
361 s> Content-Type: application/mercurial-exp-framing-0005\r\n
362 s> Transfer-Encoding: chunked\r\n
363 s> \r\n
364 s> 13\r\n
365 s> \x0b\x00\x00\x01\x00\x02\x011
366 s> \xa1FstatusBok
367 s> \r\n
368 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation)
369 s> 5c6\r\n
370 s> \xbe\x05\x00\x01\x00\x02\x001
371 s> \xa6Hcommands\xaaIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullMchangesetdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x84IbookmarksGparentsEphaseHrevisionInoderange\xa3Gdefault\xf6Hrequired\xf4DtypeDlistEnodes\xa3Gdefault\xf6Hrequired\xf4DtypeDlistJnodesdepth\xa3Gdefault\xf6Hrequired\xf4DtypeCintKpermissions\x81DpullHfiledata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDpath\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xa3Gdefault\xf4Hrequired\xf4DtypeDboolKpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\xa3Gdefault\x80Hrequired\xf4DtypeDlistKpermissions\x81DpullHlistkeys\xa2Dargs\xa1Inamespace\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullFlookup\xa2Dargs\xa1Ckey\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullLmanifestdata\xa2Dargs\xa4Ffields\xa4Gdefault\xd9\x01\x02\x80Hrequired\xf4DtypeCsetKvalidvalues\xd9\x01\x02\x82GparentsHrevisionKhaveparents\xa3Gdefault\xf4Hrequired\xf4DtypeDboolEnodes\xa2Hrequired\xf5DtypeDlistDtree\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpullGpushkey\xa2Dargs\xa4Ckey\xa2Hrequired\xf5DtypeEbytesInamespace\xa2Hrequired\xf5DtypeEbytesCnew\xa2Hrequired\xf5DtypeEbytesCold\xa2Hrequired\xf5DtypeEbytesKpermissions\x81DpushKcompression\x82\xa1DnameDzstd\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Rpathfilterprefixes\xd9\x01\x02\x82Epath:Lrootfilesin:Nrawrepoformats\x82LgeneraldeltaHrevlogv1Hredirect\xa2Fhashes\x82Fsha256Dsha1Gtargets\x82\xa3DnameHtarget-aHprotocolDhttpDuris\x81Shttp://example.com/\xa3DnameHtarget-bHprotocolGunknownDuris\x81Vunknown://example.com/
372 s> \r\n
373 received frame(size=1470; request=1; stream=2; streamflags=; type=command-response; flags=continuation)
374 s> 8\r\n
375 s> \x00\x00\x00\x01\x00\x02\x002
376 s> \r\n
377 s> 0\r\n
378 s> \r\n
379 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
380 response: gen[
381 {
382 b'commands': {
383 b'branchmap': {
384 b'args': {},
385 b'permissions': [
386 b'pull'
387 ]
388 },
389 b'capabilities': {
390 b'args': {},
391 b'permissions': [
392 b'pull'
393 ]
394 },
395 b'changesetdata': {
396 b'args': {
397 b'fields': {
398 b'default': set([]),
399 b'required': False,
400 b'type': b'set',
401 b'validvalues': set([
402 b'bookmarks',
403 b'parents',
404 b'phase',
405 b'revision'
406 ])
407 },
408 b'noderange': {
409 b'default': None,
410 b'required': False,
411 b'type': b'list'
412 },
413 b'nodes': {
414 b'default': None,
415 b'required': False,
416 b'type': b'list'
417 },
418 b'nodesdepth': {
419 b'default': None,
420 b'required': False,
421 b'type': b'int'
422 }
423 },
424 b'permissions': [
425 b'pull'
426 ]
427 },
428 b'filedata': {
429 b'args': {
430 b'fields': {
431 b'default': set([]),
432 b'required': False,
433 b'type': b'set',
434 b'validvalues': set([
435 b'parents',
436 b'revision'
437 ])
438 },
439 b'haveparents': {
440 b'default': False,
441 b'required': False,
442 b'type': b'bool'
443 },
444 b'nodes': {
445 b'required': True,
446 b'type': b'list'
447 },
448 b'path': {
449 b'required': True,
450 b'type': b'bytes'
451 }
452 },
453 b'permissions': [
454 b'pull'
455 ]
456 },
457 b'heads': {
458 b'args': {
459 b'publiconly': {
460 b'default': False,
461 b'required': False,
462 b'type': b'bool'
463 }
464 },
465 b'permissions': [
466 b'pull'
467 ]
468 },
469 b'known': {
470 b'args': {
471 b'nodes': {
472 b'default': [],
473 b'required': False,
474 b'type': b'list'
475 }
476 },
477 b'permissions': [
478 b'pull'
479 ]
480 },
481 b'listkeys': {
482 b'args': {
483 b'namespace': {
484 b'required': True,
485 b'type': b'bytes'
486 }
487 },
488 b'permissions': [
489 b'pull'
490 ]
491 },
492 b'lookup': {
493 b'args': {
494 b'key': {
495 b'required': True,
496 b'type': b'bytes'
497 }
498 },
499 b'permissions': [
500 b'pull'
501 ]
502 },
503 b'manifestdata': {
504 b'args': {
505 b'fields': {
506 b'default': set([]),
507 b'required': False,
508 b'type': b'set',
509 b'validvalues': set([
510 b'parents',
511 b'revision'
512 ])
513 },
514 b'haveparents': {
515 b'default': False,
516 b'required': False,
517 b'type': b'bool'
518 },
519 b'nodes': {
520 b'required': True,
521 b'type': b'list'
522 },
523 b'tree': {
524 b'required': True,
525 b'type': b'bytes'
526 }
527 },
528 b'permissions': [
529 b'pull'
530 ]
531 },
532 b'pushkey': {
533 b'args': {
534 b'key': {
535 b'required': True,
536 b'type': b'bytes'
537 },
538 b'namespace': {
539 b'required': True,
540 b'type': b'bytes'
541 },
542 b'new': {
543 b'required': True,
544 b'type': b'bytes'
545 },
546 b'old': {
547 b'required': True,
548 b'type': b'bytes'
549 }
550 },
551 b'permissions': [
552 b'push'
553 ]
554 }
555 },
556 b'compression': [
557 {
558 b'name': b'zstd'
559 },
560 {
561 b'name': b'zlib'
562 }
563 ],
564 b'framingmediatypes': [
565 b'application/mercurial-exp-framing-0005'
566 ],
567 b'pathfilterprefixes': set([
568 b'path:',
569 b'rootfilesin:'
570 ]),
571 b'rawrepoformats': [
572 b'generaldelta',
573 b'revlogv1'
574 ],
575 b'redirect': {
576 b'hashes': [
577 b'sha256',
578 b'sha1'
579 ],
580 b'targets': [
581 {
582 b'name': b'target-a',
583 b'protocol': b'http',
584 b'uris': [
585 b'http://example.com/'
586 ]
587 },
588 {
589 b'name': b'target-b',
590 b'protocol': b'unknown',
591 b'uris': [
592 b'unknown://example.com/'
593 ]
594 }
595 ]
596 }
597 }
598 ]
599
600 $ cat error.log
601 $ killdaemons.py