annotate mercurial/helptext/internals/wireprotocolrpc.txt @ 49541:976648e20856

tests: remove non-python3 line matching and tests block We don't support Python2 anymore
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 22 Sep 2022 16:27:17 +0200
parents 2e017696181f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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.)