Show More
This diff has been collapsed as it changes many lines, (601 lines changed) Show them Hide them | |||||
@@ -0,0 +1,601 | |||||
|
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 |
@@ -517,8 +517,66 def _capabilitiesv2(repo, proto): | |||||
517 | caps['rawrepoformats'] = sorted(repo.requirements & |
|
517 | caps['rawrepoformats'] = sorted(repo.requirements & | |
518 | repo.supportedformats) |
|
518 | repo.supportedformats) | |
519 |
|
519 | |||
|
520 | targets = getadvertisedredirecttargets(repo, proto) | |||
|
521 | if targets: | |||
|
522 | caps[b'redirect'] = { | |||
|
523 | b'targets': [], | |||
|
524 | b'hashes': [b'sha256', b'sha1'], | |||
|
525 | } | |||
|
526 | ||||
|
527 | for target in targets: | |||
|
528 | entry = { | |||
|
529 | b'name': target['name'], | |||
|
530 | b'protocol': target['protocol'], | |||
|
531 | b'uris': target['uris'], | |||
|
532 | } | |||
|
533 | ||||
|
534 | for key in ('snirequired', 'tlsversions'): | |||
|
535 | if key in target: | |||
|
536 | entry[key] = target[key] | |||
|
537 | ||||
|
538 | caps[b'redirect'][b'targets'].append(entry) | |||
|
539 | ||||
520 | return proto.addcapabilities(repo, caps) |
|
540 | return proto.addcapabilities(repo, caps) | |
521 |
|
541 | |||
|
542 | def getadvertisedredirecttargets(repo, proto): | |||
|
543 | """Obtain a list of content redirect targets. | |||
|
544 | ||||
|
545 | Returns a list containing potential redirect targets that will be | |||
|
546 | advertised in capabilities data. Each dict MUST have the following | |||
|
547 | keys: | |||
|
548 | ||||
|
549 | name | |||
|
550 | The name of this redirect target. This is the identifier clients use | |||
|
551 | to refer to a target. It is transferred as part of every command | |||
|
552 | request. | |||
|
553 | ||||
|
554 | protocol | |||
|
555 | Network protocol used by this target. Typically this is the string | |||
|
556 | in front of the ``://`` in a URL. e.g. ``https``. | |||
|
557 | ||||
|
558 | uris | |||
|
559 | List of representative URIs for this target. Clients can use the | |||
|
560 | URIs to test parsing for compatibility or for ordering preference | |||
|
561 | for which target to use. | |||
|
562 | ||||
|
563 | The following optional keys are recognized: | |||
|
564 | ||||
|
565 | snirequired | |||
|
566 | Bool indicating if Server Name Indication (SNI) is required to | |||
|
567 | connect to this target. | |||
|
568 | ||||
|
569 | tlsversions | |||
|
570 | List of bytes indicating which TLS versions are supported by this | |||
|
571 | target. | |||
|
572 | ||||
|
573 | By default, clients reflect the target order advertised by servers | |||
|
574 | and servers will use the first client-advertised target when picking | |||
|
575 | a redirect target. So targets should be advertised in the order the | |||
|
576 | server prefers they be used. | |||
|
577 | """ | |||
|
578 | return [] | |||
|
579 | ||||
522 | def wireprotocommand(name, args=None, permission='push', cachekeyfn=None): |
|
580 | def wireprotocommand(name, args=None, permission='push', cachekeyfn=None): | |
523 | """Decorator to declare a wire protocol command. |
|
581 | """Decorator to declare a wire protocol command. | |
524 |
|
582 |
@@ -17,6 +17,7 from mercurial import ( | |||||
17 | ) |
|
17 | ) | |
18 | from mercurial.utils import ( |
|
18 | from mercurial.utils import ( | |
19 | interfaceutil, |
|
19 | interfaceutil, | |
|
20 | stringutil, | |||
20 | ) |
|
21 | ) | |
21 |
|
22 | |||
22 | CACHE = None |
|
23 | CACHE = None | |
@@ -26,6 +27,8 configitem = registrar.configitem(config | |||||
26 |
|
27 | |||
27 | configitem('simplecache', 'cacheobjects', |
|
28 | configitem('simplecache', 'cacheobjects', | |
28 | default=False) |
|
29 | default=False) | |
|
30 | configitem('simplecache', 'redirectsfile', | |||
|
31 | default=None) | |||
29 |
|
32 | |||
30 | @interfaceutil.implementer(repository.iwireprotocolcommandcacher) |
|
33 | @interfaceutil.implementer(repository.iwireprotocolcommandcacher) | |
31 | class memorycacher(object): |
|
34 | class memorycacher(object): | |
@@ -91,6 +94,19 class memorycacher(object): | |||||
91 | def makeresponsecacher(orig, repo, proto, command, args, objencoderfn): |
|
94 | def makeresponsecacher(orig, repo, proto, command, args, objencoderfn): | |
92 | return memorycacher(repo.ui, command, objencoderfn) |
|
95 | return memorycacher(repo.ui, command, objencoderfn) | |
93 |
|
96 | |||
|
97 | def loadredirecttargets(ui): | |||
|
98 | path = ui.config('simplecache', 'redirectsfile') | |||
|
99 | if not path: | |||
|
100 | return [] | |||
|
101 | ||||
|
102 | with open(path, 'rb') as fh: | |||
|
103 | s = fh.read() | |||
|
104 | ||||
|
105 | return stringutil.evalpythonliteral(s) | |||
|
106 | ||||
|
107 | def getadvertisedredirecttargets(orig, repo, proto): | |||
|
108 | return loadredirecttargets(repo.ui) | |||
|
109 | ||||
94 | def extsetup(ui): |
|
110 | def extsetup(ui): | |
95 | global CACHE |
|
111 | global CACHE | |
96 |
|
112 | |||
@@ -98,3 +114,5 def extsetup(ui): | |||||
98 |
|
114 | |||
99 | extensions.wrapfunction(wireprotov2server, 'makeresponsecacher', |
|
115 | extensions.wrapfunction(wireprotov2server, 'makeresponsecacher', | |
100 | makeresponsecacher) |
|
116 | makeresponsecacher) | |
|
117 | extensions.wrapfunction(wireprotov2server, 'getadvertisedredirecttargets', | |||
|
118 | getadvertisedredirecttargets) |
General Comments 0
You need to be logged in to leave comments.
Login now