##// END OF EJS Templates
wireprotov2: send content encoded frames from server...
wireprotov2: send content encoded frames from server Now that we have support for negotiating encodings and configuring an encoder, we can start sending content encoded frames from the server. This commit teaches the wireprotov2 server code to send content encoded frames. On the mozilla-unified repository with zstd enabled peers, this change reduces the total amount of data transferred from server to client drastically: befor: 7,190,995,812 bytes after: 1,605,508,691 bytes Differential Revision: https://phab.mercurial-scm.org/D4927

File last commit:

r40173:b5bf3dd6 default
r40173:b5bf3dd6 default
Show More
test-http-api-httpv2.t
732 lines | 23.9 KiB | text/troff | Tads3Lexer
/ tests / test-http-api-httpv2.t
Kyle Lippincott
tests: mark tests that fail when using chg as #require no-chg...
r38041 #require no-chg
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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> GET /api/exp-http-v2-0002 HTTP/1.1\r\n
Gregory Szorc
wireproto: support /api/* URL space for exposing APIs...
r37064 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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> API exp-http-v2-0002 not enabled\n
Gregory Szorc
wireproto: support /api/* URL space for exposing APIs...
r37064
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
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> GET /api/exp-http-v2-0002/ro/customreadonly HTTP/1.1\r\n
Gregory Szorc
wireproto: require POST for all HTTPv2 requests...
r37066 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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/customreadonly HTTP/1.1\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 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: send protocol settings frame from client...
r40168 s> client MUST specify Accept header with value: application/mercurial-exp-framing-0006\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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/customreadonly HTTP/1.1\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 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: send protocol settings frame from client...
r40168 s> client MUST specify Accept header with value: application/mercurial-exp-framing-0006\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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/customreadonly HTTP/1.1\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 s> Accept-Encoding: identity\r\n
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> accept: application/mercurial-exp-framing-0006\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: send protocol settings frame from client...
r40168 s> client MUST send Content-Type header with value: application/mercurial-exp-framing-0006\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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/customreadonly HTTP/1.1\r\n
Gregory Szorc
wireproto: define content negotiation for HTTPv2...
r37068 s> Accept-Encoding: identity\r\n
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> *\r\n (glob)
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> content-type: application/mercurial-exp-framing-0006\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: send protocol settings frame from client...
r40168 s> Content-Type: application/mercurial-exp-framing-0006\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: send content encoded frames from server...
r40173 s> 11\r\n
s> \t\x00\x00\x01\x00\x02\x01\x92Hidentity
s> \r\n
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> 13\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x0b\x00\x00\x01\x00\x02\x041\xa1FstatusBok
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 27\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x1f\x00\x00\x01\x00\x02\x041X\x1dcustomreadonly bytes response
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 8\r\n
s> \x00\x00\x00\x01\x00\x02\x002
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
tests: don't be as verbose in wireprotov2 tests...
r40084 $ sendhttpv2peerverbose << EOF
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501 > command customreadonly
> EOF
creating http peer for wire protocol version 2
sending customreadonly command
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/customreadonly HTTP/1.1\r\n
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501 s> Accept-Encoding: identity\r\n
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> accept: application/mercurial-exp-framing-0006\r\n
s> content-type: application/mercurial-exp-framing-0006\r\n
s> content-length: 65\r\n
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501 s> host: $LOCALIP:$HGPORT\r\n (glob)
s> user-agent: Mercurial debugwireproto\r\n
s> \r\n
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> \x1c\x00\x00\x01\x00\x01\x01\x82\xa1Pcontentencodings\x81Hidentity\x15\x00\x00\x01\x00\x01\x00\x11\xa1DnameNcustomreadonly
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501 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: send protocol settings frame from client...
r40168 s> Content-Type: application/mercurial-exp-framing-0006\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: send content encoded frames from server...
r40173 s> 11\r\n
s> \t\x00\x00\x01\x00\x02\x01\x92
s> Hidentity
s> \r\n
received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos)
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> 13\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x0b\x00\x00\x01\x00\x02\x041
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \xa1FstatusBok
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501 s> \r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation)
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> 27\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x1f\x00\x00\x01\x00\x02\x041
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> X\x1dcustomreadonly bytes response
s> \r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 received frame(size=31; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation)
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> 8\r\n
s> \x00\x00\x00\x01\x00\x02\x002
s> \r\n
Gregory Szorc
wireproto: crude support for version 2 HTTP peer...
r37501 s> 0\r\n
s> \r\n
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
Gregory Szorc
wireprotov2peer: stream decoded responses...
r39597 response: gen[
Gregory Szorc
stringutil: teach pprint() to indent...
r39414 b'customreadonly bytes response'
]
Gregory Szorc
httppeer: report http statistics...
r40070 (sent 2 HTTP requests and * bytes; received * bytes in responses) (glob)
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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> GET /api/exp-http-v2-0002/rw/customreadonly 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)
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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> GET /api/exp-http-v2-0002/rw/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)
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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/rw/customreadonly 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 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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/rw/customreadonly HTTP/1.1\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> Accept-Encoding: identity\r\n
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> accept: application/mercurial-exp-framing-0006\r\n
s> content-type: application/mercurial-exp-framing-0006\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: send protocol settings frame from client...
r40168 s> Content-Type: application/mercurial-exp-framing-0006\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: send content encoded frames from server...
r40173 s> 11\r\n
s> \t\x00\x00\x01\x00\x02\x01\x92Hidentity
s> \r\n
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> 13\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x0b\x00\x00\x01\x00\x02\x041\xa1FstatusBok
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 27\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x1f\x00\x00\x01\x00\x02\x041X\x1dcustomreadonly bytes response
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 8\r\n
s> \x00\x00\x00\x01\x00\x02\x002
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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/rw/badcommand HTTP/1.1\r\n
Gregory Szorc
wireproto: define permissions-based routing of HTTPv2 wire protocol...
r37065 s> Accept-Encoding: identity\r\n
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> accept: application/mercurial-exp-framing-0006\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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/debugreflect HTTP/1.1\r\n
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/debugreflect HTTP/1.1\r\n
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 s> Accept-Encoding: identity\r\n
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> accept: application/mercurial-exp-framing-0006\r\n
s> content-type: application/mercurial-exp-framing-0006\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
Gregory Szorc
wireprotoframing: use our CBOR module...
r39477 s> \'\x00\x00\x01\x00\x01\x01\x11\xa2Dargs\xa2Dbar1CvalCfooDval1DnameHcommand1
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
wireprotov2: server support for sending content redirects...
r40061 s> Content-Length: 223\r\n
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 s> \r\n
Gregory Szorc
wireprotoframing: use our CBOR module...
r39477 s> received: 1 1 1 \xa2Dargs\xa2Dbar1CvalCfooDval1DnameHcommand1\n
Gregory Szorc
wireprotov2: server support for sending content redirects...
r40061 s> ["runcommand", {"args": {"bar1": "val", "foo": "val1"}, "command": "command1", "data": null, "redirect": 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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/customreadonly HTTP/1.1\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> Accept-Encoding: identity\r\n
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> accept: application/mercurial-exp-framing-0006\r\n
s> content-type: application/mercurial-exp-framing-0006\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: send protocol settings frame from client...
r40168 s> Content-Type: application/mercurial-exp-framing-0006\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: send content encoded frames from server...
r40173 s> 11\r\n
s> \t\x00\x00\x01\x00\x02\x01\x92Hidentity
s> \r\n
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> 13\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x0b\x00\x00\x01\x00\x02\x041\xa1FstatusBok
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 27\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x1f\x00\x00\x01\x00\x02\x041X\x1dcustomreadonly bytes response
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 8\r\n
s> \x00\x00\x00\x01\x00\x02\x002
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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/multirequest HTTP/1.1\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 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: send protocol settings frame from client...
r40168 s> Content-Type: application/mercurial-exp-framing-0006\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: send content encoded frames from server...
r40173 s> 11\r\n
s> \t\x00\x00\x01\x00\x02\x01\x92Hidentity
s> \r\n
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> 13\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x0b\x00\x00\x01\x00\x02\x041\xa1FstatusBok
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 27\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x1f\x00\x00\x01\x00\x02\x041X\x1dcustomreadonly bytes response
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 8\r\n
s> \x00\x00\x00\x01\x00\x02\x002
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> \r\n
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> 13\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x0b\x00\x00\x03\x00\x02\x041\xa1FstatusBok
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 27\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x1f\x00\x00\x03\x00\x02\x041X\x1dcustomreadonly bytes response
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 8\r\n
s> \x00\x00\x00\x03\x00\x02\x002
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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/multirequest HTTP/1.1\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> Accept-Encoding: identity\r\n
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> accept: application/mercurial-exp-framing-0006\r\n
s> content-type: application/mercurial-exp-framing-0006\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: send protocol settings frame from client...
r40168 s> Content-Type: application/mercurial-exp-framing-0006\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: send content encoded frames from server...
r40173 s> 11\r\n
s> \t\x00\x00\x03\x00\x02\x01\x92Hidentity
s> \r\n
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> 13\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x0b\x00\x00\x03\x00\x02\x041\xa1FstatusBok
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 28\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x00\x00\x03\x00\x02\x041\xa3Ibookmarks@Jnamespaces@Fphases@
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 8\r\n
s> \x00\x00\x00\x03\x00\x02\x002
Gregory Szorc
wireproto: use CBOR for command requests...
r37308 s> \r\n
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> 13\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x0b\x00\x00\x01\x00\x02\x041\xa1FstatusBok
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 9\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x01\x00\x00\x01\x00\x02\x041\xa0
Gregory Szorc
wireprotov2: implement commands as a generator of objects...
r39595 s> \r\n
s> 8\r\n
s> \x00\x00\x00\x01\x00\x02\x002
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
Gregory Szorc
wireprotov2: allow multiple fields to follow revision maps...
r39839 s> POST /api/exp-http-v2-0002/ro/multirequest HTTP/1.1\r\n
Gregory Szorc
wireproto: service multiple command requests per HTTP request...
r37077 s> Accept-Encoding: identity\r\n
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> accept: application/mercurial-exp-framing-0006\r\n
s> content-type: application/mercurial-exp-framing-0006\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
wireprotov2: send protocol settings frame from client...
r40168 Defining an invalid content encoding results in warning
$ hg --config experimental.httppeer.v2-encoder-order=identity,badencoder --verbose debugwireproto --nologhandshake --peer http2 http://$LOCALIP:$HGPORT/ << EOF
> command heads
> EOF
creating http peer for wire protocol version 2
sending heads command
wire protocol version 2 encoder referenced in config (badencoder) is not known; ignoring
s> POST /api/exp-http-v2-0002/ro/heads HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
s> accept: application/mercurial-exp-framing-0006\r\n
s> content-type: application/mercurial-exp-framing-0006\r\n
s> content-length: 56\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> user-agent: Mercurial debugwireproto\r\n
s> \r\n
s> \x1c\x00\x00\x01\x00\x01\x01\x82\xa1Pcontentencodings\x81Hidentity\x0c\x00\x00\x01\x00\x01\x00\x11\xa1DnameEheads
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-0006\r\n
s> Transfer-Encoding: chunked\r\n
s> \r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> 11\r\n
s> \t\x00\x00\x01\x00\x02\x01\x92
s> Hidentity
s> \r\n
received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos)
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> 13\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x0b\x00\x00\x01\x00\x02\x041
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> \xa1FstatusBok
s> \r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 received frame(size=11; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation)
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> 1e\r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> \x16\x00\x00\x01\x00\x02\x041
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> \x81T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
s> \r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 received frame(size=22; request=1; stream=2; streamflags=encoded; type=command-response; flags=continuation)
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> 8\r\n
s> \x00\x00\x00\x01\x00\x02\x002
s> \r\n
s> 0\r\n
s> \r\n
received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos)
response: [
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
]
(sent 2 HTTP requests and * bytes; received * bytes in responses) (glob)
#if zstd
$ hg --verbose debugwireproto --nologhandshake --peer http2 http://$LOCALIP:$HGPORT/ << EOF
> command heads
> EOF
creating http peer for wire protocol version 2
sending heads command
s> POST /api/exp-http-v2-0002/ro/heads HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
s> accept: application/mercurial-exp-framing-0006\r\n
s> content-type: application/mercurial-exp-framing-0006\r\n
s> content-length: 70\r\n
s> host: $LOCALIP:$HGPORT\r\n (glob)
s> user-agent: Mercurial debugwireproto\r\n
s> \r\n
s> *\x00\x00\x01\x00\x01\x01\x82\xa1Pcontentencodings\x83Hzstd-8mbDzlibHidentity\x0c\x00\x00\x01\x00\x01\x00\x11\xa1DnameEheads
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-0006\r\n
s> Transfer-Encoding: chunked\r\n
s> \r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 s> 11\r\n
s> \t\x00\x00\x01\x00\x02\x01\x92
s> Hzstd-8mb
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> \r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 received frame(size=9; request=1; stream=2; streamflags=stream-begin; type=stream-settings; flags=eos)
s> 25\r\n
s> \x1d\x00\x00\x01\x00\x02\x042
s> (\xb5/\xfd\x00P\xa4\x00\x00p\xa1FstatusBok\x81T\x00\x01\x00\tP\x02
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> \r\n
Gregory Szorc
wireprotov2: send content encoded frames from server...
r40173 received frame(size=29; request=1; stream=2; streamflags=encoded; type=command-response; flags=eos)
Gregory Szorc
wireprotov2: send protocol settings frame from client...
r40168 s> 0\r\n
s> \r\n
response: [
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
]
(sent 2 HTTP requests and * bytes; received * bytes in responses) (glob)
#endif
Gregory Szorc
wireproto: implement basic frame reading and processing...
r37070 $ cat error.log