author | Raphaël Gomès <rgomes@octobus.net> |
Fri, 02 Aug 2019 09:55:32 +0200 | |
changeset 42676 | b9a200477edf |
parent 40125 | e2fe1074024c |
permissions | -rw-r--r-- |
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.) |