Mercurial > hg
comparison tests/test-wireproto-content-redirects.t @ 40025:b099e6032f38
wireprotov2: server support for sending content redirects
A "content redirect" can be sent in place of inline response content.
In terms of code, we model a content redirect as a special type of
response object holding the attributes describing that redirect.
Sending a content redirect thus becomes as simple as the object
emission layer sending an instance of that type. A cacher using
externally-addressable content storage could replace the outgoing
object stream with an object advertising its location.
The bulk of the code in this commit is teaching the output layer
which handles the object stream to recognize alternate location
objects. The rules are that if an alternate location object is
present, it must be the first and only object in the object stream.
Otherwise the server emits an error.
Differential Revision: https://phab.mercurial-scm.org/D4777
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 26 Sep 2018 18:07:55 -0700 |
parents | 86b22a4cfab1 |
children | 7e807b8a9e56 |
comparison
equal
deleted
inserted
replaced
40024:86b22a4cfab1 | 40025:b099e6032f38 |
---|---|
1 $ . $TESTDIR/wireprotohelpers.sh | 1 $ . $TESTDIR/wireprotohelpers.sh |
2 | |
3 $ cat >> $HGRCPATH << EOF | |
4 > [extensions] | |
5 > blackbox = | |
6 > [blackbox] | |
7 > track = simplecache | |
8 > EOF | |
2 | 9 |
3 $ hg init server | 10 $ hg init server |
4 $ enablehttpv2 server | 11 $ enablehttpv2 server |
5 $ cd server | 12 $ cd server |
6 $ cat >> .hg/hgrc << EOF | 13 $ cat >> .hg/hgrc << EOF |
7 > [extensions] | 14 > [extensions] |
8 > simplecache = $TESTDIR/wireprotosimplecache.py | 15 > simplecache = $TESTDIR/wireprotosimplecache.py |
16 > [simplecache] | |
17 > cacheapi = true | |
9 > EOF | 18 > EOF |
10 | 19 |
11 $ echo a0 > a | 20 $ echo a0 > a |
12 $ echo b0 > b | 21 $ echo b0 > b |
13 $ hg -q commit -A -m 'commit 0' | 22 $ hg -q commit -A -m 'commit 0' |
1181 ] | 1190 ] |
1182 } | 1191 } |
1183 } | 1192 } |
1184 ] | 1193 ] |
1185 | 1194 |
1195 Set up the server to issue content redirects to its built-in API server. | |
1196 | |
1197 $ cat > redirects.py << EOF | |
1198 > [ | |
1199 > { | |
1200 > b'name': b'local', | |
1201 > b'protocol': b'http', | |
1202 > b'uris': [b'http://example.com/'], | |
1203 > }, | |
1204 > ] | |
1205 > EOF | |
1206 | |
1207 Request to eventual cache URL should return 404 (validating the cache server works) | |
1208 | |
1209 $ sendhttpraw << EOF | |
1210 > httprequest GET api/simplecache/missingkey | |
1211 > user-agent: test | |
1212 > EOF | |
1213 using raw connection to peer | |
1214 s> GET /api/simplecache/missingkey HTTP/1.1\r\n | |
1215 s> Accept-Encoding: identity\r\n | |
1216 s> user-agent: test\r\n | |
1217 s> host: $LOCALIP:$HGPORT\r\n (glob) | |
1218 s> \r\n | |
1219 s> makefile('rb', None) | |
1220 s> HTTP/1.1 404 Not Found\r\n | |
1221 s> Server: testing stub value\r\n | |
1222 s> Date: $HTTP_DATE$\r\n | |
1223 s> Content-Type: text/plain\r\n | |
1224 s> Content-Length: 22\r\n | |
1225 s> \r\n | |
1226 s> key not found in cache | |
1227 | |
1228 Send a cacheable request | |
1229 | |
1230 $ sendhttpv2peer << EOF | |
1231 > command manifestdata | |
1232 > nodes eval:[b'\x99\x2f\x47\x79\x02\x9a\x3d\xf8\xd0\x66\x6d\x00\xbb\x92\x4f\x69\x63\x4e\x26\x41'] | |
1233 > tree eval:b'' | |
1234 > fields eval:[b'parents'] | |
1235 > EOF | |
1236 creating http peer for wire protocol version 2 | |
1237 sending manifestdata command | |
1238 s> POST /api/exp-http-v2-0002/ro/manifestdata HTTP/1.1\r\n | |
1239 s> Accept-Encoding: identity\r\n | |
1240 s> accept: application/mercurial-exp-framing-0005\r\n | |
1241 s> content-type: application/mercurial-exp-framing-0005\r\n | |
1242 s> content-length: 128\r\n | |
1243 s> host: $LOCALIP:$HGPORT\r\n (glob) | |
1244 s> user-agent: Mercurial debugwireproto\r\n | |
1245 s> \r\n | |
1246 s> x\x00\x00\x01\x00\x01\x01\x11\xa3Dargs\xa3Ffields\x81GparentsEnodes\x81T\x99/Gy\x02\x9a=\xf8\xd0fm\x00\xbb\x92OicN&ADtree@DnameLmanifestdataHredirect\xa2Fhashes\x82Fsha256Dsha1Gtargets\x81Elocal | |
1247 s> makefile('rb', None) | |
1248 s> HTTP/1.1 200 OK\r\n | |
1249 s> Server: testing stub value\r\n | |
1250 s> Date: $HTTP_DATE$\r\n | |
1251 s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
1252 s> Transfer-Encoding: chunked\r\n | |
1253 s> \r\n | |
1254 s> 13\r\n | |
1255 s> \x0b\x00\x00\x01\x00\x02\x011 | |
1256 s> \xa1FstatusBok | |
1257 s> \r\n | |
1258 received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
1259 s> 63\r\n | |
1260 s> [\x00\x00\x01\x00\x02\x001 | |
1261 s> \xa1Jtotalitems\x01\xa2DnodeT\x99/Gy\x02\x9a=\xf8\xd0fm\x00\xbb\x92OicN&AGparents\x82T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 | |
1262 s> \r\n | |
1263 received frame(size=91; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |
1264 s> 8\r\n | |
1265 s> \x00\x00\x00\x01\x00\x02\x002 | |
1266 s> \r\n | |
1267 s> 0\r\n | |
1268 s> \r\n | |
1269 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |
1270 response: gen[ | |
1271 { | |
1272 b'totalitems': 1 | |
1273 }, | |
1274 { | |
1275 b'node': b'\x99/Gy\x02\x9a=\xf8\xd0fm\x00\xbb\x92OicN&A', | |
1276 b'parents': [ | |
1277 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', | |
1278 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' | |
1279 ] | |
1280 } | |
1281 ] | |
1282 | |
1283 Cached entry should be available on server | |
1284 | |
1285 $ sendhttpraw << EOF | |
1286 > httprequest GET api/simplecache/c045a581599d58608efd3d93d8129841f2af04a0 | |
1287 > user-agent: test | |
1288 > EOF | |
1289 using raw connection to peer | |
1290 s> GET /api/simplecache/c045a581599d58608efd3d93d8129841f2af04a0 HTTP/1.1\r\n | |
1291 s> Accept-Encoding: identity\r\n | |
1292 s> user-agent: test\r\n | |
1293 s> host: $LOCALIP:$HGPORT\r\n (glob) | |
1294 s> \r\n | |
1295 s> makefile('rb', None) | |
1296 s> HTTP/1.1 200 OK\r\n | |
1297 s> Server: testing stub value\r\n | |
1298 s> Date: $HTTP_DATE$\r\n | |
1299 s> Content-Type: application/mercurial-cbor\r\n | |
1300 s> Content-Length: 91\r\n | |
1301 s> \r\n | |
1302 s> \xa1Jtotalitems\x01\xa2DnodeT\x99/Gy\x02\x9a=\xf8\xd0fm\x00\xbb\x92OicN&AGparents\x82T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 | |
1303 cbor> [ | |
1304 { | |
1305 b'totalitems': 1 | |
1306 }, | |
1307 { | |
1308 b'node': b'\x99/Gy\x02\x9a=\xf8\xd0fm\x00\xbb\x92OicN&A', | |
1309 b'parents': [ | |
1310 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', | |
1311 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' | |
1312 ] | |
1313 } | |
1314 ] | |
1315 | |
1316 2nd request should result in content redirect response | |
1317 | |
1318 $ sendhttpv2peer << EOF | |
1319 > command manifestdata | |
1320 > nodes eval:[b'\x99\x2f\x47\x79\x02\x9a\x3d\xf8\xd0\x66\x6d\x00\xbb\x92\x4f\x69\x63\x4e\x26\x41'] | |
1321 > tree eval:b'' | |
1322 > fields eval:[b'parents'] | |
1323 > EOF | |
1324 creating http peer for wire protocol version 2 | |
1325 sending manifestdata command | |
1326 s> POST /api/exp-http-v2-0002/ro/manifestdata HTTP/1.1\r\n | |
1327 s> Accept-Encoding: identity\r\n | |
1328 s> accept: application/mercurial-exp-framing-0005\r\n | |
1329 s> content-type: application/mercurial-exp-framing-0005\r\n | |
1330 s> content-length: 128\r\n | |
1331 s> host: $LOCALIP:$HGPORT\r\n (glob) | |
1332 s> user-agent: Mercurial debugwireproto\r\n | |
1333 s> \r\n | |
1334 s> x\x00\x00\x01\x00\x01\x01\x11\xa3Dargs\xa3Ffields\x81GparentsEnodes\x81T\x99/Gy\x02\x9a=\xf8\xd0fm\x00\xbb\x92OicN&ADtree@DnameLmanifestdataHredirect\xa2Fhashes\x82Fsha256Dsha1Gtargets\x81Elocal | |
1335 s> makefile('rb', None) | |
1336 s> HTTP/1.1 200 OK\r\n | |
1337 s> Server: testing stub value\r\n | |
1338 s> Date: $HTTP_DATE$\r\n | |
1339 s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
1340 s> Transfer-Encoding: chunked\r\n | |
1341 s> \r\n | |
1342 s> *\r\n (glob) | |
1343 s> \x*\x00\x00\x01\x00\x02\x011 (glob) | |
1344 s> \xa2Hlocation\xa2ImediatypeX\x1aapplication/mercurial-cborCurl*http://*:$HGPORT/api/simplecache/c045a581599d58608efd3d93d8129841f2af04a0FstatusHredirect (glob) | |
1345 s> \r\n | |
1346 received frame(size=*; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) (glob) | |
1347 s> 8\r\n | |
1348 s> \x00\x00\x00\x01\x00\x02\x001 | |
1349 s> \r\n | |
1350 s> 8\r\n | |
1351 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |
1352 s> \x00\x00\x00\x01\x00\x02\x002 | |
1353 s> \r\n | |
1354 s> 0\r\n | |
1355 s> \r\n | |
1356 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |
1357 abort: redirect responses not yet supported | |
1358 [255] | |
1359 | |
1186 $ cat error.log | 1360 $ cat error.log |
1187 $ killdaemons.py | 1361 $ killdaemons.py |
1362 | |
1363 $ cat .hg/blackbox.log | |
1364 *> cacher constructed for manifestdata (glob) | |
1365 *> cache miss for c045a581599d58608efd3d93d8129841f2af04a0 (glob) | |
1366 *> storing cache entry for c045a581599d58608efd3d93d8129841f2af04a0 (glob) | |
1367 *> cacher constructed for manifestdata (glob) | |
1368 *> cache hit for c045a581599d58608efd3d93d8129841f2af04a0 (glob) | |
1369 *> sending content redirect for c045a581599d58608efd3d93d8129841f2af04a0 to http://*:$HGPORT/api/simplecache/c045a581599d58608efd3d93d8129841f2af04a0 (glob) |