Mercurial > hg
annotate mercurial/helptext/internals/wireprotocolrpc.txt @ 52032:09a54892b7ee
mergestate: reduce the number of attribute lookups
This code is called a lot during updates, this is a very small but also very
easy thing to do.
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Wed, 21 Aug 2024 09:48:14 +0200 |
parents | 2e017696181f |
children |
rev | line source |
---|---|
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
1 **Experimental and under development** |
35976
48a3a9283f09
sshpeer: initial definition and implementation of new SSH protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35975
diff
changeset
|
2 |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
3 This document describe's Mercurial's transport-agnostic remote procedure |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
4 call (RPC) protocol which is used to perform interactions with remote |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
5 servers. This protocol is also referred to as ``hgrpc``. |
35976
48a3a9283f09
sshpeer: initial definition and implementation of new SSH protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35975
diff
changeset
|
6 |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
7 The protocol has the following high-level features: |
35976
48a3a9283f09
sshpeer: initial definition and implementation of new SSH protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35975
diff
changeset
|
8 |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
9 * Concurrent request and response support (multiple commands can be issued |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
10 simultaneously and responses can be streamed simultaneously). |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
11 * Supports half-duplex and full-duplex connections. |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
12 * All data is transmitted within *frames*, which have a well-defined |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
13 header and encode their length. |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
14 * Side-channels for sending progress updates and printing output. Text |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
15 output from the remote can be localized locally. |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
16 * Support for simultaneous and long-lived compression streams, even across |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
17 requests. |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
18 * Uses CBOR for data exchange. |
35976
48a3a9283f09
sshpeer: initial definition and implementation of new SSH protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35975
diff
changeset
|
19 |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
20 The protocol is not specific to Mercurial and could be used by other |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
21 applications. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
22 |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
23 High-level Overview |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
24 =================== |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
25 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
26 To operate the protocol, a bi-directional, half-duplex pipe supporting |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
27 ordered sends and receives is required. That is, each peer has one pipe |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
28 for sending data and another for receiving. Full-duplex pipes are also |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
29 supported. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
30 |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
31 All data is read and written in atomic units called *frames*. These |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
32 are conceptually similar to TCP packets. Higher-level functionality |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
33 is built on the exchange and processing of frames. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
34 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
35 All frames are associated with a *stream*. A *stream* provides a |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
36 unidirectional grouping of frames. Streams facilitate two goals: |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
37 content encoding and parallelism. There is a dedicated section on |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
38 streams below. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
39 |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
40 The protocol is request-response based: the client issues requests to |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
41 the server, which issues replies to those requests. Server-initiated |
37057
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
42 messaging is not currently supported, but this specification carves |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
43 out room to implement it. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
44 |
37057
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
45 All frames are associated with a numbered request. Frames can thus |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
46 be logically grouped by their request ID. |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
47 |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
48 Frames |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
49 ====== |
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
50 |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
51 Frames begin with an 8 octet header followed by a variable length |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
52 payload:: |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
53 |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
54 +------------------------------------------------+ |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
55 | Length (24) | |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
56 +--------------------------------+---------------+ |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
57 | Request ID (16) | Stream ID (8) | |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
58 +------------------+-------------+---------------+ |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
59 | Stream Flags (8) | |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
60 +-----------+------+ |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
61 | Type (4) | |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
62 +-----------+ |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
63 | Flags (4) | |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
64 +===========+===================================================| |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
65 | Frame Payload (0...) ... |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
66 +---------------------------------------------------------------+ |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
67 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
68 The length of the frame payload is expressed as an unsigned 24 bit |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
69 little endian integer. Values larger than 65535 MUST NOT be used unless |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
70 given permission by the server as part of the negotiated capabilities |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
71 during the handshake. The frame header is not part of the advertised |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
72 frame length. The payload length is the over-the-wire length. If there |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
73 is content encoding applied to the payload as part of the frame's stream, |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
74 the length is the output of that content encoding, not the input. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
75 |
37057
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
76 The 16-bit ``Request ID`` field denotes the integer request identifier, |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
77 stored as an unsigned little endian integer. Odd numbered requests are |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
78 client-initiated. Even numbered requests are server-initiated. This |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
79 refers to where the *request* was initiated - not where the *frame* was |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
80 initiated, so servers will send frames with odd ``Request ID`` in |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
81 response to client-initiated requests. Implementations are advised to |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
82 start ordering request identifiers at ``1`` and ``0``, increment by |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
83 ``2``, and wrap around if all available numbers have been exhausted. |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
84 |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
85 The 8-bit ``Stream ID`` field denotes the stream that the frame is |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
86 associated with. Frames belonging to a stream may have content |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
87 encoding applied and the receiver may need to decode the raw frame |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
88 payload to obtain the original data. Odd numbered IDs are |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
89 client-initiated. Even numbered IDs are server-initiated. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
90 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
91 The 8-bit ``Stream Flags`` field defines stream processing semantics. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
92 See the section on streams below. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
93 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
94 The 4-bit ``Type`` field denotes the type of frame being sent. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
95 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
96 The 4-bit ``Flags`` field defines special, per-type attributes for |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
97 the frame. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
98 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
99 The sections below define the frame types and their behavior. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
100 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
101 Command Request (``0x01``) |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
102 -------------------------- |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
103 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
104 This frame contains a request to run a command. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
105 |
37292
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
106 The payload consists of a CBOR map defining the command request. The |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
107 bytestring keys of that map are: |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
108 |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
109 name |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
110 Name of the command that should be executed (bytestring). |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
111 args |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
112 Map of bytestring keys to various value types containing the named |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
113 arguments to this command. |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
114 |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
115 Each command defines its own set of argument names and their expected |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
116 types. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
117 |
40022
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
118 redirect (optional) |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
119 (map) Advertises client support for following response *redirects*. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
120 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
121 This map has the following bytestring keys: |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
122 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
123 targets |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
124 (array of bytestring) List of named redirect targets supported by |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
125 this client. The names come from the targets advertised by the |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
126 server's *capabilities* message. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
127 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
128 hashes |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
129 (array of bytestring) List of preferred hashing algorithms that can |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
130 be used for content integrity verification. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
131 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
132 See the *Content Redirects* section below for more on content redirects. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
133 |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
134 This frame type MUST ONLY be sent from clients to servers: it is illegal |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
135 for a server to send this frame to a client. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
136 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
137 The following flag values are defined for this type: |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
138 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
139 0x01 |
37292
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
140 New command request. When set, this frame represents the beginning |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
141 of a new request to run a command. The ``Request ID`` attached to this |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
142 frame MUST NOT be active. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
143 0x02 |
37292
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
144 Command request continuation. When set, this frame is a continuation |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
145 from a previous command request frame for its ``Request ID``. This |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
146 flag is set when the CBOR data for a command request does not fit |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
147 in a single frame. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
148 0x04 |
37292
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
149 Additional frames expected. When set, the command request didn't fit |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
150 into a single frame and additional CBOR data follows in a subsequent |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
151 frame. |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
152 0x08 |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
153 Command data frames expected. When set, command data frames are |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
154 expected to follow the final command request frame for this request. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
155 |
37292
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
156 ``0x01`` MUST be set on the initial command request frame for a |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
157 ``Request ID``. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
158 |
37292
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
159 ``0x01`` or ``0x02`` MUST be set to indicate this frame's role in |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
160 a series of command request frames. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
161 |
37723
e8fba6d578f0
wireprotov2: change frame type value for command data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37722
diff
changeset
|
162 If command data frames are to be sent, ``0x08`` MUST be set on ALL |
37292
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
163 command request frames. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
164 |
37723
e8fba6d578f0
wireprotov2: change frame type value for command data
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37722
diff
changeset
|
165 Command Data (``0x02``) |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
166 ----------------------- |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
167 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
168 This frame contains raw data for a command. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
169 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
170 Most commands can be executed by specifying arguments. However, |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
171 arguments have an upper bound to their length. For commands that |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
172 accept data that is beyond this length or whose length isn't known |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
173 when the command is initially sent, they will need to stream |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
174 arbitrary data to the server. This frame type facilitates the sending |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
175 of this data. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
176 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
177 The payload of this frame type consists of a stream of raw data to be |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
178 consumed by the command handler on the server. The format of the data |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
179 is command specific. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
180 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
181 The following flag values are defined for this type: |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
182 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
183 0x01 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
184 Command data continuation. When set, the data for this command |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
185 continues into a subsequent frame. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
186 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
187 0x02 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
188 End of data. When set, command data has been fully sent to the |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
189 server. The command has been fully issued and no new data for this |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
190 command will be sent. The next frame will belong to a new command. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
191 |
37724
deff7cf7eefd
wireprotov2: change frame type and name for command response
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37723
diff
changeset
|
192 Command Response Data (``0x03``) |
deff7cf7eefd
wireprotov2: change frame type and name for command response
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37723
diff
changeset
|
193 -------------------------------- |
37055
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
194 |
37722
89a16704114c
wireprotov2: define response data as CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37657
diff
changeset
|
195 This frame contains response data to an issued command. |
89a16704114c
wireprotov2: define response data as CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37657
diff
changeset
|
196 |
37725
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
197 Response data ALWAYS consists of a series of 1 or more CBOR encoded |
37722
89a16704114c
wireprotov2: define response data as CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37657
diff
changeset
|
198 values. A CBOR value may be using indefinite length encoding. And the |
89a16704114c
wireprotov2: define response data as CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37657
diff
changeset
|
199 bytes constituting the value may span several frames. |
37055
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
200 |
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
201 The following flag values are defined for this type: |
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
202 |
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
203 0x01 |
37299
e9aadee698cf
wireproto: add frame flag to denote payloads as CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37292
diff
changeset
|
204 Data continuation. When set, an additional frame containing response data |
e9aadee698cf
wireproto: add frame flag to denote payloads as CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37292
diff
changeset
|
205 will follow. |
37055
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
206 0x02 |
37299
e9aadee698cf
wireproto: add frame flag to denote payloads as CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37292
diff
changeset
|
207 End of data. When set, the response data has been fully sent and |
37055
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
208 no additional frames for this response will be sent. |
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
209 |
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
210 The ``0x01`` flag is mutually exclusive with the ``0x02`` flag. |
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
211 |
37726
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
212 Error Occurred (``0x05``) |
37055
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
213 ------------------------- |
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
214 |
37726
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
215 Some kind of error occurred. |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
216 |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
217 There are 3 general kinds of failures that can occur: |
37055
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
218 |
37726
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
219 * Command error encountered before any response issued |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
220 * Command error encountered after a response was issued |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
221 * Protocol or stream level error |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
222 |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
223 This frame type is used to capture the latter cases. (The general |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
224 command error case is handled by the leading CBOR map in |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
225 ``Command Response`` frames.) |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
226 |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
227 The payload of this frame contains a CBOR map detailing the error. That |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
228 map has the following bytestring keys: |
37055
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
229 |
37726
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
230 type |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
231 (bytestring) The overall type of error encountered. Can be one of the |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
232 following values: |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
233 |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
234 protocol |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
235 A protocol-level error occurred. This typically means someone |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
236 is violating the framing protocol semantics and the server is |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
237 refusing to proceed. |
37055
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
238 |
37726
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
239 server |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
240 A server-level error occurred. This typically indicates some kind of |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
241 logic error on the server, likely the fault of the server. |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
242 |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
243 command |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
244 A command-level error, likely the fault of the client. |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
245 |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
246 message |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
247 (array of maps) A richly formatted message that is intended for |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
248 human consumption. See the ``Human Output Side-Channel`` frame |
0c184ca594bb
wireprotov2: change behavior of error frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37725
diff
changeset
|
249 section for a description of the format of this data structure. |
37055
61393f888dfe
wireproto: define and implement responses in framing protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37051
diff
changeset
|
250 |
37060
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
251 Human Output Side-Channel (``0x06``) |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
252 ------------------------------------ |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
253 |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
254 This frame contains a message that is intended to be displayed to |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
255 people. Whereas most frames communicate machine readable data, this |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
256 frame communicates textual data that is intended to be shown to |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
257 humans. |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
258 |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
259 The frame consists of a series of *formatting requests*. Each formatting |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
260 request consists of a formatting string, arguments for that formatting |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
261 string, and labels to apply to that formatting string. |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
262 |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
263 A formatting string is a printf()-like string that allows variable |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
264 substitution within the string. Labels allow the rendered text to be |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
265 *decorated*. Assuming use of the canonical Mercurial code base, a |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
266 formatting string can be the input to the ``i18n._`` function. This |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
267 allows messages emitted from the server to be localized. So even if |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
268 the server has different i18n settings, people could see messages in |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
269 their *native* settings. Similarly, the use of labels allows |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
270 decorations like coloring and underlining to be applied using the |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
271 client's configured rendering settings. |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
272 |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
273 Formatting strings are similar to ``printf()`` strings or how |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
274 Python's ``%`` operator works. The only supported formatting sequences |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
275 are ``%s`` and ``%%``. ``%s`` will be replaced by whatever the string |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
276 at that position resolves to. ``%%`` will be replaced by ``%``. All |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
277 other 2-byte sequences beginning with ``%`` represent a literal |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
278 ``%`` followed by that character. However, future versions of the |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
279 wire protocol reserve the right to allow clients to opt in to receiving |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
280 formatting strings with additional formatters, hence why ``%%`` is |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
281 required to represent the literal ``%``. |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
282 |
37319
36d17f37db91
wireproto: convert human output frames to CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37299
diff
changeset
|
283 The frame payload consists of a CBOR array of CBOR maps. Each map |
36d17f37db91
wireproto: convert human output frames to CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37299
diff
changeset
|
284 defines an *atom* of text data to print. Each *atom* has the following |
36d17f37db91
wireproto: convert human output frames to CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37299
diff
changeset
|
285 bytestring keys: |
37060
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
286 |
37319
36d17f37db91
wireproto: convert human output frames to CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37299
diff
changeset
|
287 msg |
36d17f37db91
wireproto: convert human output frames to CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37299
diff
changeset
|
288 (bytestring) The formatting string. Content MUST be ASCII. |
36d17f37db91
wireproto: convert human output frames to CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37299
diff
changeset
|
289 args (optional) |
36d17f37db91
wireproto: convert human output frames to CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37299
diff
changeset
|
290 Array of bytestrings defining arguments to the formatting string. |
36d17f37db91
wireproto: convert human output frames to CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37299
diff
changeset
|
291 labels (optional) |
36d17f37db91
wireproto: convert human output frames to CBOR
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37299
diff
changeset
|
292 Array of bytestrings defining labels to apply to this atom. |
37129
aaabd709df72
wireproto: review fixups
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37060
diff
changeset
|
293 |
37060
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
294 All data to be printed MUST be encoded into a single frame: this frame |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
295 does not support spanning data across multiple frames. |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
296 |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
297 All textual data encoded in these frames is assumed to be line delimited. |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
298 The last atom in the frame SHOULD end with a newline (``\n``). If it |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
299 doesn't, clients MAY add a newline to facilitate immediate printing. |
0a6c5cc09a88
wireproto: define human output side channel frame
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37059
diff
changeset
|
300 |
37291
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
301 Progress Update (``0x07``) |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
302 -------------------------- |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
303 |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
304 This frame holds the progress of an operation on the peer. Consumption |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
305 of these frames allows clients to display progress bars, estimated |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
306 completion times, etc. |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
307 |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
308 Each frame defines the progress of a single operation on the peer. The |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
309 payload consists of a CBOR map with the following bytestring keys: |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
310 |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
311 topic |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
312 Topic name (string) |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
313 pos |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
314 Current numeric position within the topic (integer) |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
315 total |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
316 Total/end numeric position of this topic (unsigned integer) |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
317 label (optional) |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
318 Unit label (string) |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
319 item (optional) |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
320 Item name (string) |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
321 |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
322 Progress state is created when a frame is received referencing a |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
323 *topic* that isn't currently tracked. Progress tracking for that |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
324 *topic* is finished when a frame is received reporting the current |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
325 position of that topic as ``-1``. |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
326 |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
327 Multiple *topics* may be active at any given time. |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
328 |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
329 Rendering of progress information is not mandated or governed by this |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
330 specification: implementations MAY render progress information however |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
331 they see fit, including not at all. |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
332 |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
333 The string data describing the topic SHOULD be static strings to |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
334 facilitate receivers localizing that string data. The emitter |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
335 MUST normalize all string data to valid UTF-8 and receivers SHOULD |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
336 validate that received data conforms to UTF-8. The topic name |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
337 SHOULD be ASCII. |
b0041036214e
wireproto: define frame to represent progress updates
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37288
diff
changeset
|
338 |
40125
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
339 Sender Protocol Settings (``0x08``) |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
340 ----------------------------------- |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
341 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
342 This frame type advertises the sender's support for various protocol and |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
343 stream level features. The data advertised in this frame is used to influence |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
344 subsequent behavior of the current frame exchange channel. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
345 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
346 The frame payload consists of a CBOR map. It may contain the following |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
347 bytestring keys: |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
348 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
349 contentencodings |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
350 (array of bytestring) A list of content encodings supported by the |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
351 sender, in order of most to least preferred. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
352 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
353 Peers are allowed to encode stream data using any of the listed |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
354 encodings. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
355 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
356 See the ``Content Encoding Profiles`` section for an enumeration |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
357 of supported content encodings. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
358 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
359 If not defined, the value is assumed to be a list with the single value |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
360 ``identity``, meaning only the no-op encoding is supported. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
361 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
362 Senders MAY filter the set of advertised encodings against what it |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
363 knows the receiver supports (e.g. if the receiver advertised encodings |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
364 via the capabilities descriptor). However, doing so will prevent |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
365 servers from gaining an understanding of the aggregate capabilities |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
366 of clients. So clients are discouraged from doing so. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
367 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
368 When this frame is not sent/received, the receiver assumes default values |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
369 for all keys. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
370 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
371 If encountered, this frame type MUST be sent before any other frame type |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
372 in a channel. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
373 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
374 The following flag values are defined for this frame type: |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
375 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
376 0x01 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
377 Data continuation. When set, an additional frame containing more protocol |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
378 settings immediately follows. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
379 0x02 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
380 End of data. When set, the protocol settings data has been completely |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
381 sent. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
382 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
383 The ``0x01`` flag is mutually exclusive with the ``0x02`` flag. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
384 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
385 Stream Encoding Settings (``0x09``) |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
386 ----------------------------------- |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
387 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
388 This frame type holds information defining the content encoding |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
389 settings for a *stream*. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
390 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
391 This frame type is likely consumed by the protocol layer and is not |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
392 passed on to applications. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
393 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
394 This frame type MUST ONLY occur on frames having the *Beginning of Stream* |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
395 ``Stream Flag`` set. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
396 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
397 The payload of this frame defines what content encoding has (possibly) |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
398 been applied to the payloads of subsequent frames in this stream. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
399 |
40125
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
400 The payload consists of a series of CBOR values. The first value is a |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
401 bytestring denoting the content encoding profile of the data in this |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
402 stream. Subsequent CBOR values supplement this simple value in a |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
403 profile-specific manner. See the ``Content Encoding Profiles`` section |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
404 for more. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
405 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
406 In the absence of this frame on a stream, it is assumed the stream is |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
407 using the ``identity`` content encoding. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
408 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
409 The following flag values are defined for this frame type: |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
410 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
411 0x01 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
412 Data continuation. When set, an additional frame containing more encoding |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
413 settings immediately follows. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
414 0x02 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
415 End of data. When set, the encoding settings data has been completely |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
416 sent. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
417 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
418 The ``0x01`` flag is mutually exclusive with the ``0x02`` flag. |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
419 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
420 Stream States and Flags |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
421 ======================= |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
422 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
423 Streams can be in two states: *open* and *closed*. An *open* stream |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
424 is active and frames attached to that stream could arrive at any time. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
425 A *closed* stream is not active. If a frame attached to a *closed* |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
426 stream arrives, that frame MUST have an appropriate stream flag |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
427 set indicating beginning of stream. All streams are in the *closed* |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
428 state by default. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
429 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
430 The ``Stream Flags`` field denotes a set of bit flags for defining |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
431 the relationship of this frame within a stream. The following flags |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
432 are defined: |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
433 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
434 0x01 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
435 Beginning of stream. The first frame in the stream MUST set this |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
436 flag. When received, the ``Stream ID`` this frame is attached to |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
437 becomes ``open``. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
438 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
439 0x02 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
440 End of stream. The last frame in a stream MUST set this flag. When |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
441 received, the ``Stream ID`` this frame is attached to becomes |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
442 ``closed``. Any content encoding context associated with this stream |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
443 can be destroyed after processing the payload of this frame. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
444 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
445 0x04 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
446 Apply content encoding. When set, any content encoding settings |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
447 defined by the stream should be applied when attempting to read |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
448 the frame. When not set, the frame payload isn't encoded. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
449 |
40125
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
450 TODO consider making stream opening and closing communicated via |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
451 explicit frame types (e.g. a "stream state change" frame) rather than |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
452 flags on all frames. This would make stream state changes more explicit, |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
453 as they could only occur on specific frame types. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
454 |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
455 Streams |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
456 ======= |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
457 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
458 Streams - along with ``Request IDs`` - facilitate grouping of frames. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
459 But the purpose of each is quite different and the groupings they |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
460 constitute are independent. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
461 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
462 A ``Request ID`` is essentially a tag. It tells you which logical |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
463 request a frame is associated with. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
464 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
465 A *stream* is a sequence of frames grouped for the express purpose |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
466 of applying a stateful encoding or for denoting sub-groups of frames. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
467 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
468 Unlike ``Request ID``s which span the request and response, a stream |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
469 is unidirectional and stream IDs are independent from client to |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
470 server. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
471 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
472 There is no strict hierarchical relationship between ``Request IDs`` |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
473 and *streams*. A stream can contain frames having multiple |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
474 ``Request IDs``. Frames belonging to the same ``Request ID`` can |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
475 span multiple streams. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
476 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
477 One goal of streams is to facilitate content encoding. A stream can |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
478 define an encoding to be applied to frame payloads. For example, the |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
479 payload transmitted over the wire may contain output from a |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
480 zstandard compression operation and the receiving end may decompress |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
481 that payload to obtain the original data. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
482 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
483 The other goal of streams is to facilitate concurrent execution. For |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
484 example, a server could spawn 4 threads to service a request that can |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
485 be easily parallelized. Each of those 4 threads could write into its |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
486 own stream. Those streams could then in turn be delivered to 4 threads |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
487 on the receiving end, with each thread consuming its stream in near |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
488 isolation. The *main* thread on both ends merely does I/O and |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
489 encodes/decodes frame headers: the bulk of the work is done by worker |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
490 threads. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
491 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
492 In addition, since content encoding is defined per stream, each |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
493 *worker thread* could perform potentially CPU bound work concurrently |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
494 with other threads. This approach of applying encoding at the |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
495 sub-protocol / stream level eliminates a potential resource constraint |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
496 on the protocol stream as a whole (it is common for the throughput of |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
497 a compression engine to be smaller than the throughput of a network). |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
498 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
499 Having multiple streams - each with their own encoding settings - also |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
500 facilitates the use of advanced data compression techniques. For |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
501 example, a transmitter could see that it is generating data faster |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
502 and slower than the receiving end is consuming it and adjust its |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
503 compression settings to trade CPU for compression ratio accordingly. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
504 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
505 While streams can define a content encoding, not all frames within |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
506 that stream must use that content encoding. This can be useful when |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
507 data is being served from caches and being derived dynamically. A |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
508 cache could pre-compressed data so the server doesn't have to |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
509 recompress it. The ability to pick and choose which frames are |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
510 compressed allows servers to easily send data to the wire without |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
511 involving potentially expensive encoding overhead. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
512 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
513 Content Encoding Profiles |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
514 ========================= |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
515 |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
516 Streams can have named content encoding *profiles* associated with |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
517 them. A profile defines a shared understanding of content encoding |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
518 settings and behavior. |
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
519 |
40125
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
520 Profiles are described in the following sections. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
521 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
522 identity |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
523 -------- |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
524 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
525 The ``identity`` profile is a no-op encoding: the encoded bytes are |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
526 exactly the input bytes. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
527 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
528 This profile MUST be supported by all peers. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
529 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
530 In the absence of an identified profile, the ``identity`` profile is |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
531 assumed. |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
532 |
40125
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
533 zstd-8mb |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
534 -------- |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
535 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
536 Zstandard encoding (RFC 8478). Zstandard is a fast and effective lossless |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
537 compression format. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
538 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
539 This profile allows decompressor window sizes of up to 8 MB. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
540 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
541 zlib |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
542 ---- |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
543 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
544 zlib compressed data (RFC 1950). zlib is a widely-used and supported |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
545 lossless compression format. |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
546 |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
547 It isn't as fast as zstandard and it is recommended to use zstandard instead, |
e2fe1074024c
wireprotov2: update stream encoding specification
Gregory Szorc <gregory.szorc@gmail.com>
parents:
40022
diff
changeset
|
548 if possible. |
37288
9bfcbe4f4745
wireproto: add streams to frame-based protocol
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37129
diff
changeset
|
549 |
37725
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
550 Command Protocol |
39558
b0e0db1565d1
internals: extract frame-based protocol docs to own document
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39439
diff
changeset
|
551 ================ |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
552 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
553 A client can request that a remote run a command by sending it |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
554 frames defining that command. This logical stream is composed of |
37292
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
555 1 or more ``Command Request`` frames and and 0 or more ``Command Data`` |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
556 frames. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
557 |
37057
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
558 All frames composing a single command request MUST be associated with |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
559 the same ``Request ID``. |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
560 |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
561 Clients MAY send additional command requests without waiting on the |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
562 response to a previous command request. If they do so, they MUST ensure |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
563 that the ``Request ID`` field of outbound frames does not conflict |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
564 with that of an active ``Request ID`` whose response has not yet been |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
565 fully received. |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
566 |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
567 Servers MAY respond to commands in a different order than they were |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
568 sent over the wire. Clients MUST be prepared to deal with this. Servers |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
569 also MAY start executing commands in a different order than they were |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
570 received, or MAY execute multiple commands concurrently. |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
571 |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
572 If there is a dependency between commands or a race condition between |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
573 commands executing (e.g. a read-only command that depends on the results |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
574 of a command that mutates the repository), then clients MUST NOT send |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
575 frames issuing a command until a response to all dependent commands has |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
576 been received. |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
577 TODO think about whether we should express dependencies between commands |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
578 to avoid roundtrip latency. |
2ec1fb9de638
wireproto: add request IDs to frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37055
diff
changeset
|
579 |
37292
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
580 A command is defined by a command name, 0 or more command arguments, |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
581 and optional command data. |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
582 |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
583 Arguments are the recommended mechanism for transferring fixed sets of |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
584 parameters to a command. Data is appropriate for transferring variable |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
585 data. Thinking in terms of HTTP, arguments would be headers and data |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
586 would be the message body. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
587 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
588 It is recommended for servers to delay the dispatch of a command |
37292
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
589 until all argument have been received. Servers MAY impose limits on the |
3d0e2cd86e05
wireproto: use CBOR for command requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37291
diff
changeset
|
590 maximum argument size. |
37051
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
591 TODO define failure mechanism. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
592 |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
593 Servers MAY dispatch to commands immediately once argument data |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
594 is available or delay until command data is received in full. |
40206e227412
wireproto: define and implement protocol for issuing requests
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37050
diff
changeset
|
595 |
37725
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
596 Once a ``Command Request`` frame is sent, a client must be prepared to |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
597 receive any of the following frames associated with that request: |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
598 ``Command Response``, ``Error Response``, ``Human Output Side-Channel``, |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
599 ``Progress Update``. |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
600 |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
601 The *main* response for a command will be in ``Command Response`` frames. |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
602 The payloads of these frames consist of 1 or more CBOR encoded values. |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
603 The first CBOR value on the first ``Command Response`` frame is special |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
604 and denotes the overall status of the command. This CBOR map contains |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
605 the following bytestring keys: |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
606 |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
607 status |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
608 (bytestring) A well-defined message containing the overall status of |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
609 this command request. The following values are defined: |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
610 |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
611 ok |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
612 The command was received successfully and its response follows. |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
613 error |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
614 There was an error processing the command. More details about the |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
615 error are encoded in the ``error`` key. |
40022
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
616 redirect |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
617 The response for this command is available elsewhere. Details on |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
618 where are in the ``location`` key. |
37725
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
619 |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
620 error (optional) |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
621 A map containing information about an encountered error. The map has the |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
622 following keys: |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
623 |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
624 message |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
625 (array of maps) A message describing the error. The message uses the |
3ea8323d6f95
wireprotov2: change command response protocol to include a leading map
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37724
diff
changeset
|
626 same format as those in the ``Human Output Side-Channel`` frame. |
39559
07b58266bce3
wireprotov2: implement commands as a generator of objects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39558
diff
changeset
|
627 |
40022
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
628 location (optional) |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
629 (map) Presence indicates that a *content redirect* has occurred. The map |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
630 provides the external location of the content. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
631 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
632 This map contains the following bytestring keys: |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
633 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
634 url |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
635 (bytestring) URL from which this content may be requested. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
636 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
637 mediatype |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
638 (bytestring) The media type for the fetched content. e.g. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
639 ``application/mercurial-*``. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
640 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
641 In some transports, this value is also advertised by the transport. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
642 e.g. as the ``Content-Type`` HTTP header. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
643 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
644 size (optional) |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
645 (unsigned integer) Total size of remote object in bytes. This is |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
646 the raw size of the entity that will be fetched, minus any |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
647 non-Mercurial protocol encoding (e.g. HTTP content or transfer |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
648 encoding.) |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
649 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
650 fullhashes (optional) |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
651 (array of arrays) Content hashes for the entire payload. Each entry |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
652 is an array of bytestrings containing the hash name and the hash value. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
653 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
654 fullhashseed (optional) |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
655 (bytestring) Optional seed value to feed into hasher for full content |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
656 hash verification. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
657 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
658 serverdercerts (optional) |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
659 (array of bytestring) DER encoded x509 certificates for the server. When |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
660 defined, clients MAY validate that the x509 certificate on the target |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
661 server exactly matches the certificate used here. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
662 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
663 servercadercerts (optional) |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
664 (array of bytestring) DER encoded x509 certificates for the certificate |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
665 authority of the target server. When defined, clients MAY validate that |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
666 the x509 on the target server was signed by CA certificate in this set. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
667 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
668 # TODO support for giving client an x509 certificate pair to be used as a |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
669 # client certificate. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
670 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
671 # TODO support common authentication mechanisms (e.g. HTTP basic/digest |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
672 # auth). |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
673 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
674 # TODO support custom authentication mechanisms. This likely requires |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
675 # server to advertise required auth mechanism so client can filter. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
676 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
677 # TODO support chained hashes. e.g. hash for each 1MB segment so client |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
678 # can iteratively validate data without having to consume all of it first. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
679 |
39559
07b58266bce3
wireprotov2: implement commands as a generator of objects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39558
diff
changeset
|
680 TODO formalize when error frames can be seen and how errors can be |
07b58266bce3
wireprotov2: implement commands as a generator of objects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39558
diff
changeset
|
681 recognized midway through a command response. |
40022
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
682 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
683 Content Redirects |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
684 ================= |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
685 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
686 Servers have the ability to respond to ANY command request with a |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
687 *redirect* to another location. Such a response is referred to as a *redirect |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
688 response*. (This feature is conceptually similar to HTTP redirects, but is |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
689 more powerful.) |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
690 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
691 A *redirect response* MUST ONLY be issued if the client advertises support |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
692 for a redirect *target*. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
693 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
694 A *redirect response* MUST NOT be issued unless the client advertises support |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
695 for one. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
696 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
697 Clients advertise support for *redirect responses* after looking at the server's |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
698 *capabilities* data, which is fetched during initial server connection |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
699 handshake. The server's capabilities data advertises named *targets* for |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
700 potential redirects. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
701 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
702 Each target is described by a protocol name, connection and protocol features, |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
703 etc. The server also advertises target-agnostic redirect settings, such as |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
704 which hash algorithms are supported for content integrity checking. (See |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
705 the documentation for the *capabilities* command for more.) |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
706 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
707 Clients examine the set of advertised redirect targets for compatibility. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
708 When sending a command request, the client advertises the set of redirect |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
709 target names it is willing to follow, along with some other settings influencing |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
710 behavior. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
711 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
712 For example, say the server is advertising a ``cdn`` redirect target that |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
713 requires SNI and TLS 1.2. If the client supports those features, it will |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
714 send command requests stating that the ``cdn`` target is acceptable to use. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
715 But if the client doesn't support SNI or TLS 1.2 (or maybe it encountered an |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
716 error using this target from a previous request), then it omits this target |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
717 name. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
718 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
719 If the client advertises support for a redirect target, the server MAY |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
720 substitute the normal, inline response data for a *redirect response* - |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
721 one where the initial CBOR map has a ``status`` key with value ``redirect``. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
722 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
723 The *redirect response* at a minimum advertises the URL where the response |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
724 can be retrieved. |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
725 |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
726 The *redirect response* MAY also advertise additional details about that |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
727 content and how to retrieve it. Notably, the response may contain the |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
728 x509 public certificates for the server being redirected to or the |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
729 certificate authority that signed that server's certificate. Unless the |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
730 client has existing settings that offer stronger trust validation than what |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
731 the server advertises, the client SHOULD use the server-provided certificates |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
732 when validating the connection to the remote server in place of any default |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
733 connection verification checks. This is because certificates coming from |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
734 the server SHOULD establish a stronger chain of trust than what the default |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
735 certification validation mechanism in most environments provides. (By default, |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
736 certificate validation ensures the signer of the cert chains up to a set of |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
737 trusted root certificates. And if an explicit certificate or CA certificate |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
738 is presented, that greadly reduces the set of certificates that will be |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
739 recognized as valid, thus reducing the potential for a "bad" certificate |
33eb670e2834
wireprotov2: define semantics for content redirects
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39559
diff
changeset
|
740 to be used and trusted.) |