##// END OF EJS Templates
revlog: extract function for getting node from known-to-exist rev...
revlog: extract function for getting node from known-to-exist rev Many of the calls to index_node() (which converts a rev to a nodeid) are done with a rev that's know to exist. If the function fails, there's something really wrong and we should just abort. This was done in only one place. This patch starts by extracting that code to a function that we can reuse in later patches. Differential Revision: https://phab.mercurial-scm.org/D3456

File last commit:

r37743:3ea8323d default
r37877:a91f31a1 default
Show More
test-http-api-httpv2.t
564 lines | 18.2 KiB | text/troff | Tads3Lexer
/ tests / test-http-api-httpv2.t
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ . $TESTDIR/wireprotohelpers.sh
$ enabledummycommands
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065
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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ enablehttpv2 server
Gregory Szorc
wireproto: support /api/* URL space for exposing APIs...
r37064 $ 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 > 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 > 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
wireprotov2: change command response protocol to include a leading map...
r37743 s> client MUST specify Accept header with value: application/mercurial-exp-framing-0005\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068
Bad Accept header results in 406
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 > 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
wireprotov2: change command response protocol to include a leading map...
r37743 s> client MUST specify Accept header with value: application/mercurial-exp-framing-0005\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068
Bad Content-Type header results in 415
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 > 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
wireprotov2: change command response protocol to include a leading map...
r37743 s> accept: application/mercurial-exp-framing-0005\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
wireprotov2: change command response protocol to include a leading map...
r37743 s> client MUST send Content-Type header with value: application/mercurial-exp-framing-0005\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068
Request to read-only command works out of the box
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 > 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)
Gregory Szorc
wireprotov2: change command response protocol to include a leading map...
r37743 s> content-type: application/mercurial-exp-framing-0005\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
wireprotov2: change command response protocol to include a leading map...
r37743 s> Content-Type: application/mercurial-exp-framing-0005\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
wireprotov2: change command response protocol to include a leading map...
r37743 s> 32\r\n
s> *\x00\x00\x01\x00\x02\x012\xa1FstatusBokX\x1dcustomreadonly 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: crude support for version 2 HTTP peer...
r37501 $ sendhttpv2peer << EOF
> command customreadonly
> EOF
creating http peer for wire protocol version 2
sending customreadonly command
s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
Gregory Szorc
wireprotov2: change command response protocol to include a leading map...
r37743 s> accept: application/mercurial-exp-framing-0005\r\n
s> content-type: application/mercurial-exp-framing-0005\r\n
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501 s> content-length: 29\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> user-agent: Mercurial debugwireproto\r\n
s> \r\n
s> \x15\x00\x00\x01\x00\x01\x01\x11\xa1DnameNcustomreadonly
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
wireprotov2: change command response protocol to include a leading map...
r37743 s> Content-Type: application/mercurial-exp-framing-0005\r\n
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501 s> Transfer-Encoding: chunked\r\n
s> \r\n
Gregory Szorc
wireprotov2: change command response protocol to include a leading map...
r37743 s> 32\r\n
s> *\x00\x00\x01\x00\x02\x012
s> \xa1FstatusBokX\x1dcustomreadonly bytes response
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501 s> \r\n
Gregory Szorc
wireprotov2: change command response protocol to include a leading map...
r37743 received frame(size=42; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=eos)
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501 s> 0\r\n
s> \r\n
Gregory Szorc
wireprotov2: change command response protocol to include a leading map...
r37743 response: [{b'status': b'ok'}, b'customreadonly bytes response']
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501
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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 > 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 > 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 > 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 > 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
wireprotov2: change command response protocol to include a leading map...
r37743 s> accept: application/mercurial-exp-framing-0005\r\n
s> content-type: application/mercurial-exp-framing-0005\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
wireprotov2: change command response protocol to include a leading map...
r37743 s> Content-Type: application/mercurial-exp-framing-0005\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
wireprotov2: change command response protocol to include a leading map...
r37743 s> 32\r\n
s> *\x00\x00\x01\x00\x02\x012\xa1FstatusBokX\x1dcustomreadonly 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 > 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
wireprotov2: change command response protocol to include a leading map...
r37743 s> accept: application/mercurial-exp-framing-0005\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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 > 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 > 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
wireprotov2: change command response protocol to include a leading map...
r37743 s> accept: application/mercurial-exp-framing-0005\r\n
s> content-type: application/mercurial-exp-framing-0005\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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 > 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
wireprotov2: change command response protocol to include a leading map...
r37743 s> accept: application/mercurial-exp-framing-0005\r\n
s> content-type: application/mercurial-exp-framing-0005\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
wireprotov2: change command response protocol to include a leading map...
r37743 s> Content-Type: application/mercurial-exp-framing-0005\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> Transfer-Encoding: chunked\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> \r\n
Gregory Szorc
wireprotov2: change command response protocol to include a leading map...
r37743 s> 32\r\n
s> *\x00\x00\x01\x00\x02\x012\xa1FstatusBokX\x1dcustomreadonly bytes response
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 > 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
wireprotov2: change command response protocol to include a leading map...
r37743 s> Content-Type: application/mercurial-exp-framing-0005\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> Transfer-Encoding: chunked\r\n
s> \r\n
Gregory Szorc
wireprotov2: change command response protocol to include a leading map...
r37743 s> 32\r\n
s> *\x00\x00\x01\x00\x02\x012\xa1FstatusBokX\x1dcustomreadonly bytes response
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> \r\n
Gregory Szorc
wireprotov2: change command response protocol to include a leading map...
r37743 s> 32\r\n
s> *\x00\x00\x03\x00\x02\x002\xa1FstatusBokX\x1dcustomreadonly 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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 > 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
wireprotov2: change command response protocol to include a leading map...
r37743 s> accept: application/mercurial-exp-framing-0005\r\n
s> content-type: application/mercurial-exp-framing-0005\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
wireprotov2: change command response protocol to include a leading map...
r37743 s> Content-Type: application/mercurial-exp-framing-0005\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> Transfer-Encoding: chunked\r\n
s> \r\n
Gregory Szorc
wireprotov2: change command response protocol to include a leading map...
r37743 s> 33\r\n
s> +\x00\x00\x03\x00\x02\x012\xa1FstatusBok\xa3Fphases@Ibookmarks@Jnamespaces@
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \r\n
Gregory Szorc
wireprotov2: change command response protocol to include a leading map...
r37743 s> 14\r\n
s> \x0c\x00\x00\x01\x00\x02\x002\xa1FstatusBok\xa0
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
Gregory Szorc
tests: extract wire protocol shell helpers to standalone file...
r37500 $ sendhttpraw << EOF
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 > httprequest POST api/$HTTPV2/ro/multirequest
> accept: $MEDIATYPE
> content-type: $MEDIATYPE
> user-agent: test
Gregory Szorc
wireproto: only expose "getbundle" and "unbundle" to v1 transports...
r37557 > frame 1 1 stream-begin command-request new cbor:{b'name': b'pushkey'}
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
wireprotov2: change command response protocol to include a leading map...
r37743 s> accept: application/mercurial-exp-framing-0005\r\n
s> content-type: application/mercurial-exp-framing-0005\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> user-agent: test\r\n
Gregory Szorc
wireproto: only expose "getbundle" and "unbundle" to v1 transports...
r37557 s> content-length: 22\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: only expose "getbundle" and "unbundle" to v1 transports...
r37557 s> \x0e\x00\x00\x01\x00\x01\x01\x11\xa1DnameGpushkey
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
Gregory Szorc
wireproto: only expose "getbundle" and "unbundle" to v1 transports...
r37557 s> Content-Length: 52\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> \r\n
Gregory Szorc
wireproto: only expose "getbundle" and "unbundle" to v1 transports...
r37557 s> insufficient permissions to execute command: pushkey
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 $ cat error.log