##// END OF EJS Templates
copies: clean up _related logic...
copies: clean up _related logic The limit parameter was never actually used, since the only way the 4th case could be reached was if f1r and f2r converged. The new code makes this clear, and additionally reduces the conditional block to just 3 cases.

File last commit:

r37338:a67fd1fe default
r37410:a4f02a17 default
Show More
test-http-api-httpv2.t
560 lines | 17.6 KiB | text/troff | Tads3Lexer
/ tests / test-http-api-httpv2.t
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 $ HTTPV2=exp-http-v2-0001
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 $ MEDIATYPE=application/mercurial-exp-framing-0003
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065
Gregory Szorc
wireproto: support /api/* URL space for exposing APIs...
r37064 $ send() {
> hg --verbose debugwireproto --peer raw http://$LOCALIP:$HGPORT/
> }
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 $ cat > dummycommands.py << EOF
> from mercurial import wireprototypes, wireproto
> @wireproto.wireprotocommand('customreadonly', permission='pull')
> def customreadonly(repo, proto):
> return wireprototypes.bytesresponse(b'customreadonly bytes response')
> @wireproto.wireprotocommand('customreadwrite', permission='push')
> def customreadwrite(repo, proto):
> return wireprototypes.bytesresponse(b'customreadwrite bytes response')
> EOF
$ cat >> $HGRCPATH << EOF
> [extensions]
> dummycommands = $TESTTMP/dummycommands.py
> EOF
Gregory Szorc
wireproto: support /api/* URL space for exposing APIs...
r37064 $ hg init server
$ cat > server/.hg/hgrc << EOF
> [experimental]
> web.apiserver = true
> EOF
$ hg -R server serve -p $HGPORT -d --pid-file hg.pid
$ cat hg.pid > $DAEMON_PIDS
HTTP v2 protocol not enabled by default
$ send << EOF
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 > httprequest GET api/$HTTPV2
Gregory Szorc
wireproto: support /api/* URL space for exposing APIs...
r37064 > user-agent: test
> EOF
using raw connection to peer
s> GET /api/exp-http-v2-0001 HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
s> HTTP/1.1 404 Not Found\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: text/plain\r\n
s> Content-Length: 33\r\n
s> \r\n
s> API exp-http-v2-0001 not enabled\n
Restart server with support for HTTP v2 API
$ killdaemons.py
$ cat > server/.hg/hgrc << EOF
> [experimental]
> web.apiserver = true
> web.api.http-v2 = true
> EOF
$ hg -R server serve -p $HGPORT -d --pid-file hg.pid
$ cat hg.pid > $DAEMON_PIDS
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 Request to unknown command yields 404
$ send << EOF
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 > httprequest POST api/$HTTPV2/ro/badcommand
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 > user-agent: test
> EOF
using raw connection to peer
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 s> POST /api/exp-http-v2-0001/ro/badcommand HTTP/1.1\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> Accept-Encoding: identity\r\n
s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
s> HTTP/1.1 404 Not Found\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: text/plain\r\n
s> Content-Length: 42\r\n
s> \r\n
s> unknown wire protocol command: badcommand\n
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 GET to read-only command yields a 405
$ send << EOF
> httprequest GET api/$HTTPV2/ro/customreadonly
> user-agent: test
> EOF
using raw connection to peer
s> GET /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
s> HTTP/1.1 405 Method Not Allowed\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Allow: POST\r\n
s> Content-Length: 30\r\n
s> \r\n
s> commands require POST requests
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 Missing Accept header results in 406
$ send << EOF
> httprequest POST api/$HTTPV2/ro/customreadonly
> user-agent: test
> EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
s> HTTP/1.1 406 Not Acceptable\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: text/plain\r\n
Gregory Szorc
wireproto: define and implement protocol for issuing requests...
r37069 s> Content-Length: 85\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> client MUST specify Accept header with value: application/mercurial-exp-framing-0003\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068
Bad Accept header results in 406
$ send << EOF
> httprequest POST api/$HTTPV2/ro/customreadonly
> accept: invalid
> user-agent: test
> EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
s> accept: invalid\r\n
s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
s> HTTP/1.1 406 Not Acceptable\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: text/plain\r\n
Gregory Szorc
wireproto: define and implement protocol for issuing requests...
r37069 s> Content-Length: 85\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> client MUST specify Accept header with value: application/mercurial-exp-framing-0003\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068
Bad Content-Type header results in 415
$ send << EOF
> httprequest POST api/$HTTPV2/ro/customreadonly
> accept: $MEDIATYPE
> user-agent: test
> content-type: badmedia
> EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> accept: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 s> content-type: badmedia\r\n
s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
s> HTTP/1.1 415 Unsupported Media Type\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: text/plain\r\n
Gregory Szorc
wireproto: define and implement protocol for issuing requests...
r37069 s> Content-Length: 88\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> client MUST send Content-Type header with value: application/mercurial-exp-framing-0003\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068
Request to read-only command works out of the box
$ send << EOF
> httprequest POST api/$HTTPV2/ro/customreadonly
> accept: $MEDIATYPE
> content-type: $MEDIATYPE
> user-agent: test
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 > frame 1 1 stream-begin command-request new cbor:{b'name': b'customreadonly'}
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 > EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> *\r\n (glob)
s> content-type: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 s> user-agent: test\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> content-length: 29\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \x15\x00\x00\x01\x00\x01\x01\x11\xa1DnameNcustomreadonly
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 s> makefile('rb', None)
s> HTTP/1.1 200 OK\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> Content-Type: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: define and implement responses in framing protocol...
r37073 s> Transfer-Encoding: chunked\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 s> \r\n
Gregory Szorc
wireproto: add streams to frame-based protocol...
r37304 s> 25\r\n
s> \x1d\x00\x00\x01\x00\x02\x01Bcustomreadonly bytes response
Gregory Szorc
wireproto: define and implement responses in framing protocol...
r37073 s> \r\n
s> 0\r\n
s> \r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 Request to read-write command fails because server is read-only by default
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 GET to read-write request yields 405
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065
$ send << EOF
> httprequest GET api/$HTTPV2/rw/customreadonly
> user-agent: test
> EOF
using raw connection to peer
s> GET /api/exp-http-v2-0001/rw/customreadonly HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 s> HTTP/1.1 405 Method Not Allowed\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 s> Allow: POST\r\n
s> Content-Length: 30\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> \r\n
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 s> commands require POST requests
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065
Even for unknown commands
$ send << EOF
> httprequest GET api/$HTTPV2/rw/badcommand
> user-agent: test
> EOF
using raw connection to peer
s> GET /api/exp-http-v2-0001/rw/badcommand HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 s> HTTP/1.1 405 Method Not Allowed\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 s> Allow: POST\r\n
s> Content-Length: 30\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> \r\n
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 s> commands require POST requests
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065
SSL required by default
$ send << EOF
> httprequest POST api/$HTTPV2/rw/customreadonly
> user-agent: test
> EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/rw/customreadonly HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
s> HTTP/1.1 403 ssl required\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Length: 17\r\n
Gregory Szorc
wireproto: support /api/* URL space for exposing APIs...
r37064 s> \r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> permission denied
Restart server to allow non-ssl read-write operations
$ killdaemons.py
$ cat > server/.hg/hgrc << EOF
> [experimental]
> web.apiserver = true
> web.api.http-v2 = true
> [web]
> push_ssl = false
> allow-push = *
> EOF
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 $ hg -R server serve -p $HGPORT -d --pid-file hg.pid -E error.log
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 $ cat hg.pid > $DAEMON_PIDS
Authorized request for valid read-write command works
$ send << EOF
> httprequest POST api/$HTTPV2/rw/customreadonly
> user-agent: test
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 > accept: $MEDIATYPE
> content-type: $MEDIATYPE
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 > frame 1 1 stream-begin command-request new cbor:{b'name': b'customreadonly'}
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 > EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/rw/customreadonly HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> accept: application/mercurial-exp-framing-0003\r\n
s> content-type: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> user-agent: test\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> content-length: 29\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \x15\x00\x00\x01\x00\x01\x01\x11\xa1DnameNcustomreadonly
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> makefile('rb', None)
s> HTTP/1.1 200 OK\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> Content-Type: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: define and implement responses in framing protocol...
r37073 s> Transfer-Encoding: chunked\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> \r\n
Gregory Szorc
wireproto: add streams to frame-based protocol...
r37304 s> 25\r\n
s> \x1d\x00\x00\x01\x00\x02\x01Bcustomreadonly bytes response
Gregory Szorc
wireproto: define and implement responses in framing protocol...
r37073 s> \r\n
s> 0\r\n
s> \r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065
Authorized request for unknown command is rejected
$ send << EOF
> httprequest POST api/$HTTPV2/rw/badcommand
> user-agent: test
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 > accept: $MEDIATYPE
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 > EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/rw/badcommand HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> accept: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
s> HTTP/1.1 404 Not Found\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: text/plain\r\n
s> Content-Length: 42\r\n
s> \r\n
s> unknown wire protocol command: badcommand\n
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070
debugreflect isn't enabled by default
$ send << EOF
> httprequest POST api/$HTTPV2/ro/debugreflect
> user-agent: test
> EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/ro/debugreflect HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
s> user-agent: test\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
s> makefile('rb', None)
s> HTTP/1.1 404 Not Found\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: text/plain\r\n
s> Content-Length: 34\r\n
s> \r\n
s> debugreflect service not available
Restart server to get debugreflect endpoint
$ killdaemons.py
$ cat > server/.hg/hgrc << EOF
> [experimental]
> web.apiserver = true
> web.api.debugreflect = true
> web.api.http-v2 = true
> [web]
> push_ssl = false
> allow-push = *
> EOF
$ hg -R server serve -p $HGPORT -d --pid-file hg.pid -E error.log
$ cat hg.pid > $DAEMON_PIDS
Command frames can be reflected via debugreflect
$ send << EOF
> httprequest POST api/$HTTPV2/ro/debugreflect
> accept: $MEDIATYPE
> content-type: $MEDIATYPE
> user-agent: test
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 > frame 1 1 stream-begin command-request new cbor:{b'name': b'command1', b'args': {b'foo': b'val1', b'bar1': b'val'}}
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 > EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/ro/debugreflect HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> accept: application/mercurial-exp-framing-0003\r\n
s> content-type: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 s> user-agent: test\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> content-length: 47\r\n
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
Yuya Nishihara
stringutil: drop escapedata() in favor of escapestr()...
r37338 s> \'\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa2CfooDval1Dbar1CvalDnameHcommand1
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 s> makefile('rb', None)
s> HTTP/1.1 200 OK\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: text/plain\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> Content-Length: 205\r\n
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> received: 1 1 1 \xa2Dargs\xa2CfooDval1Dbar1CvalDnameHcommand1\n
Gregory Szorc
wireproto: add request IDs to frames...
r37075 s> ["runcommand", {"args": {"bar1": "val", "foo": "val1"}, "command": "command1", "data": null, "requestid": 1}]\n
Gregory Szorc
wireproto: buffer output frames when in half duplex mode...
r37074 s> received: <no frame>\n
s> {"action": "noop"}
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 Multiple requests to regular command URL are not allowed
$ send << EOF
> httprequest POST api/$HTTPV2/ro/customreadonly
> accept: $MEDIATYPE
> content-type: $MEDIATYPE
> user-agent: test
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 > frame 1 1 stream-begin command-request new cbor:{b'name': b'customreadonly'}
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 > EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> accept: application/mercurial-exp-framing-0003\r\n
s> content-type: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> user-agent: test\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> content-length: 29\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \x15\x00\x00\x01\x00\x01\x01\x11\xa1DnameNcustomreadonly
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> makefile('rb', None)
s> HTTP/1.1 200 OK\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> Content-Type: application/mercurial-exp-framing-0003\r\n
s> Transfer-Encoding: chunked\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> 25\r\n
s> \x1d\x00\x00\x01\x00\x02\x01Bcustomreadonly bytes response
s> \r\n
s> 0\r\n
s> \r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077
Multiple requests to "multirequest" URL are allowed
$ send << EOF
> httprequest POST api/$HTTPV2/ro/multirequest
> accept: $MEDIATYPE
> content-type: $MEDIATYPE
> user-agent: test
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 > frame 1 1 stream-begin command-request new cbor:{b'name': b'customreadonly'}
> frame 3 1 0 command-request new cbor:{b'name': b'customreadonly'}
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 > EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/ro/multirequest HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> *\r\n (glob)
s> *\r\n (glob)
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> user-agent: test\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> content-length: 58\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \x15\x00\x00\x01\x00\x01\x01\x11\xa1DnameNcustomreadonly\x15\x00\x00\x03\x00\x01\x00\x11\xa1DnameNcustomreadonly
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> makefile('rb', None)
s> HTTP/1.1 200 OK\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> Content-Type: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> Transfer-Encoding: chunked\r\n
s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> 25\r\n
Gregory Szorc
wireproto: add streams to frame-based protocol...
r37304 s> \x1d\x00\x00\x01\x00\x02\x01Bcustomreadonly bytes response
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> \r\n
Gregory Szorc
wireproto: add streams to frame-based protocol...
r37304 s> 25\r\n
Gregory Szorc
wireproto: explicit API to create outgoing streams...
r37305 s> \x1d\x00\x00\x03\x00\x02\x00Bcustomreadonly bytes response
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> \r\n
s> 0\r\n
s> \r\n
Interleaved requests to "multirequest" are processed
$ send << EOF
> httprequest POST api/$HTTPV2/ro/multirequest
> accept: $MEDIATYPE
> content-type: $MEDIATYPE
> user-agent: test
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 > frame 1 1 stream-begin command-request new|more \xa2Dargs\xa1Inamespace
> frame 3 1 0 command-request new|more \xa2Dargs\xa1Inamespace
> frame 3 1 0 command-request continuation JnamespacesDnameHlistkeys
> frame 1 1 0 command-request continuation IbookmarksDnameHlistkeys
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 > EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/ro/multirequest HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> accept: application/mercurial-exp-framing-0003\r\n
s> content-type: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> user-agent: test\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> content-length: 115\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \x11\x00\x00\x01\x00\x01\x01\x15\xa2Dargs\xa1Inamespace\x11\x00\x00\x03\x00\x01\x00\x15\xa2Dargs\xa1Inamespace\x19\x00\x00\x03\x00\x01\x00\x12JnamespacesDnameHlistkeys\x18\x00\x00\x01\x00\x01\x00\x12IbookmarksDnameHlistkeys
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> makefile('rb', None)
s> HTTP/1.1 200 OK\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> Content-Type: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> Transfer-Encoding: chunked\r\n
s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> 26\r\n
Yuya Nishihara
stringutil: drop escapedata() in favor of escapestr()...
r37338 s> \x1e\x00\x00\x03\x00\x02\x01Bbookmarks\t\n
s> namespaces\t\n
s> phases\t
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \r\n
Gregory Szorc
wireproto: add streams to frame-based protocol...
r37304 s> 8\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \x00\x00\x00\x01\x00\x02\x00B
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> \r\n
s> 0\r\n
s> \r\n
Restart server to disable read-write access
$ killdaemons.py
$ cat > server/.hg/hgrc << EOF
> [experimental]
> web.apiserver = true
> web.api.debugreflect = true
> web.api.http-v2 = true
> [web]
> push_ssl = false
> EOF
$ hg -R server serve -p $HGPORT -d --pid-file hg.pid -E error.log
$ cat hg.pid > $DAEMON_PIDS
Attempting to run a read-write command via multirequest on read-only URL is not allowed
$ send << EOF
> httprequest POST api/$HTTPV2/ro/multirequest
> accept: $MEDIATYPE
> content-type: $MEDIATYPE
> user-agent: test
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 > frame 1 1 stream-begin command-request new cbor:{b'name': b'unbundle'}
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 > EOF
using raw connection to peer
s> POST /api/exp-http-v2-0001/ro/multirequest HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> accept: application/mercurial-exp-framing-0003\r\n
s> content-type: application/mercurial-exp-framing-0003\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> user-agent: test\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> content-length: 23\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> host: $LOCALIP:$HGPORT\r\n (glob)
s> \r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \x0f\x00\x00\x01\x00\x01\x01\x11\xa1DnameHunbundle
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> makefile('rb', None)
s> HTTP/1.1 403 Forbidden\r\n
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: text/plain\r\n
s> Content-Length: 53\r\n
s> \r\n
s> insufficient permissions to execute command: unbundle
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 $ cat error.log