##// END OF EJS Templates
wireproto: port lookup to wire protocol v2...
wireproto: port lookup to wire protocol v2 This is pretty straightforward. We don't yet handle errors because we don't have an error handling mechanism in place yet. I'm also tempted to fold this into `known`. We'll come back to this later. Differential Revision: https://phab.mercurial-scm.org/D3205

File last commit:

r37505:68915b9f default
r37556:89fed81b default
Show More
test-http-api-httpv2.t
564 lines | 18.0 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
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
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
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
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
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
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)
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: 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
s> accept: application/mercurial-exp-framing-0003\r\n
s> content-type: application/mercurial-exp-framing-0003\r\n
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
s> Content-Type: application/mercurial-exp-framing-0003\r\n
s> Transfer-Encoding: chunked\r\n
s> \r\n
s> 25\r\n
s> \x1d\x00\x00\x01\x00\x02\x01B
s> customreadonly bytes response
s> \r\n
received frame(size=29; request=1; stream=2; streamflags=stream-begin; type=bytes-response; flags=eos)
s> 0\r\n
s> \r\n
response: [b'customreadonly bytes response']
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
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
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
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
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
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
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
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
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
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
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
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: port listkeys commands to wire protocol v2...
r37505 s> 28\r\n
s> \x00\x00\x03\x00\x02\x01F\xa3Fphases@Ibookmarks@Jnamespaces@
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \r\n
Gregory Szorc
wireproto: port listkeys commands to wire protocol v2...
r37505 s> 9\r\n
s> \x01\x00\x00\x01\x00\x02\x00F\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: 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