From 4fb06f026f2ca9d8fdd498207c71fd760b3e3b82 Mon Sep 17 00:00:00 2001 From: Mike Bishop Date: Thu, 29 Nov 2018 15:52:36 -0800 Subject: [PATCH 1/6] INITIAL_PRIORITY --- draft-ietf-quic-http.md | 87 +++++++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 12 deletions(-) diff --git a/draft-ietf-quic-http.md b/draft-ietf-quic-http.md index 087bcc6257..109fd64d44 100644 --- a/draft-ietf-quic-http.md +++ b/draft-ietf-quic-http.md @@ -478,7 +478,7 @@ HTTP_WRONG_STREAM. 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -|PT |DT |Empty|E| Prioritized Element ID (i) ... +|PT |DT | Empty | Prioritized Element ID (i) ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Element Dependency ID (i) ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -496,13 +496,9 @@ The PRIORITY frame payload has the following fields: : A two-bit field indicating the type of element being depended on. Empty: - : A three-bit field which MUST be zero when sent and MUST be ignored + : A four-bit field which MUST be zero when sent and MUST be ignored on receipt. - Exclusive: - : A flag which indicates that the stream dependency is exclusive (see - {{!RFC7540}}, Section 5.3). - Prioritized Element ID: : A variable-length integer that identifies the element being prioritized. Depending on the value of Prioritized Type, this contains the Stream ID of a @@ -825,6 +821,70 @@ MUST be treated as a connection error of type HTTP_MALFORMED_FRAME. A server MUST treat a MAX_PUSH_ID frame payload that does not contain a single variable-length integer as a connection error of type HTTP_MALFORMED_FRAME. +### INITIAL_PRIORITY {#frame-initial-priority} + +The INITIAL_PRIORITY (type=0x0F) frame specifies the client-advised priority of +a new stream. INITIAL_PRIORITY frames MAY be sent as the first frame of a +request stream, and MUST NOT be sent thereafter or on other streams. An +INITIAL_PRIORITY frame sent on a non-request stream MUST be treated as a +connection error of type HTTP_WRONG_STREAM. An INITIAL_PRIORITY frame received +after other frames or received by a client MUST be treated as a stream error of +type HTTP_UNEXPECTED_FRAME. + +~~~~~~~~~~ drawing + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|DT | Empty | Element Dependency ID (i) ... ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Weight (8) | ++-+-+-+-+-+-+-+-+ +~~~~~~~~~~ +{: #fig-initial-priority title="INITIAL_PRIORITY frame payload"} + +The INITIAL_PRIORITY frame payload has the following fields: + + Dependency Type: + : A two-bit field indicating the type of element being depended on. + + Empty: + : A six-bit field which MUST be zero when sent and MUST be ignored + on receipt. + + Element Dependency ID: + : A variable-length integer that identifies the element on which a dependency + is being expressed. Depending on the value of Dependency Type, this contains + the Stream ID of a request stream, the Push ID of a promised resource, the + Placeholder ID of a placeholder, or is ignored. For details of + dependencies, see {{priority}} and {{!RFC7540}}, Section 5.3. + + Weight: + : An unsigned 8-bit integer representing a priority weight for the stream (see + {{!RFC7540}}, Section 5.3). Add one to the value to obtain a weight between + 1 and 256. + +An INITIAL_PRIORITY frame identifies an element upon which the current request +stream depends at creation. The values for the Dependency Type and Element +Dependency ID have the same interpretation as in the PRIORITY frame (see +{{frame-priority}}). + +When an INITIAL_PRIORITY frame claims to reference a request, the associated ID +MUST identify a client-initiated bidirectional stream. A server MUST treat +receipt of PRIORITY frame with a Stream ID of any other type as a connection +error of type HTTP_MALFORMED_FRAME. + +An INITIAL_PRIORITY frame that references a non-existent Push ID or a +Placeholder ID greater than the server's limit MUST be treated as an +HTTP_MALFORMED_FRAME error. + +The INITIAL_PRIORITY frame enables a request to be given a priority upon +receipt, independent of reordering that might occur between data on the client's +control stream and the request stream. Subsequent PRIORITY frames on the +control stream can update this dependency; the contents of the INITIAL_PRIORITY +frame are ignored if a PRIORITY frame has already been received which assigns a +different priority to the request. See {{priority}} for more information. + + ### Reserved Frame Types {#frame-grease} Frame types of the format `0xb + (0x1f * N)` are reserved to exercise the @@ -1009,10 +1069,13 @@ another request, which expresses the preference that the latter stream (the "dependent" request). Taken together, the dependencies across all requests in a connection form a dependency tree. -When a client request is first sent or a placeholder first allocated, the -element is dependent on the root of the priority tree. Pushed streams are -initially dependent on the client request on which the PUSH_PROMISE frame was -sent. In all cases, elements are assigned an initial weight of 16. +When a client request is first sent, its parent and weight are determined by the +INITIAL_PRIORITY frame (see {{frame-initial-priority}}) which begins the stream, +if present. Otherwise, the element is dependent on the root of the priority +tree. Placeholders are also dependent on the root of the priority tree when +first allocated. Pushed streams are initially dependent on the client request +on which the PUSH_PROMISE frame was sent. In all cases, elements are assigned an +initial weight of 16 unless an INITIAL_PRIORITY frame is present. The structure of the dependency tree changes as PRIORITY frames modify the dependency links between requests. The PRIORITY frame {{frame-priority}} @@ -1672,8 +1735,8 @@ commutative, both sender and receiver must apply them in the same order to ensure that both sides have a consistent view of the stream dependency tree. HTTP/2 specifies priority assignments in PRIORITY frames and (optionally) in HEADERS frames. To achieve in-order delivery of priority changes in HTTP/3, -PRIORITY frames are sent on the control stream and the PRIORITY section is -removed from the HEADERS frame. +PRIORITY frames are sent on the control stream and exclusive prioritization +has been removed. Likewise, HPACK was designed with the assumption of in-order delivery. A sequence of encoded header blocks must arrive (and be decoded) at an endpoint in From 9ec6b29839d2717ab135efeb77c345d8692eb36b Mon Sep 17 00:00:00 2001 From: Mike Bishop Date: Mon, 3 Dec 2018 12:56:11 -0800 Subject: [PATCH 2/6] Re-merge INITIAL_PRIORITY and PRIORITY, per Kazuho and Lucas --- draft-ietf-quic-http.md | 138 ++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 91 deletions(-) diff --git a/draft-ietf-quic-http.md b/draft-ietf-quic-http.md index 109fd64d44..22676f5811 100644 --- a/draft-ietf-quic-http.md +++ b/draft-ietf-quic-http.md @@ -468,19 +468,25 @@ HEADERS frames can only be sent on request / push streams. ### PRIORITY {#frame-priority} -The PRIORITY (type=0x02) frame specifies the sender-advised priority of a -stream. In order to ensure that prioritization is processed in a consistent -order, PRIORITY frames MUST be sent on the control stream. A PRIORITY frame -sent on any other stream MUST be treated as a connection error of type -HTTP_WRONG_STREAM. +The PRIORITY (type=0x02) frame specifies the client-advised priority of a +stream. When opening a new request stream, a PRIORITY frame MAY be sent as the +first frame of the stream. In order to ensure that prioritization is processed +in a consistent order, any subsequent PRIORITY frames MUST be sent on the +control stream. A PRIORITY frame received on a push stream, received after +other frames on a request stream, or received by a client MUST be treated as a +stream error of type HTTP_UNEXPECTED_FRAME. + +Subsequent PRIORITY frames sent on the control stream might arrive before +PRIORITY frames sent on a request stream due to reordering. PRIORITY frames on +the control stream always take precedence. ~~~~~~~~~~ drawing 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -|PT |DT | Empty | Prioritized Element ID (i) ... +|PT |DT | Empty | [Prioritized Element ID (i)] ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -| Element Dependency ID (i) ... +| [Element Dependency ID (i)] ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Weight (8) | +-+-+-+-+-+-+-+-+ @@ -490,7 +496,9 @@ HTTP_WRONG_STREAM. The PRIORITY frame payload has the following fields: Prioritized Type: - : A two-bit field indicating the type of element being prioritized. + : A two-bit field indicating the type of element being prioritized. When + sent on a request stream, this MUST be set to `11`. When sent on the + control stream, this MUST NOT be set to `11`. Dependency Type: : A two-bit field indicating the type of element being depended on. @@ -502,14 +510,14 @@ The PRIORITY frame payload has the following fields: Prioritized Element ID: : A variable-length integer that identifies the element being prioritized. Depending on the value of Prioritized Type, this contains the Stream ID of a - request stream, the Push ID of a promised resource, or a Placeholder ID of a - placeholder. + request stream, the Push ID of a promised resource, a Placeholder ID of a + placeholder, or is absent. Element Dependency ID: : A variable-length integer that identifies the element on which a dependency is being expressed. Depending on the value of Dependency Type, this contains the Stream ID of a request stream, the Push ID of a promised resource, the - Placeholder ID of a placeholder, or is ignored. For details of + Placeholder ID of a placeholder, or is absent. For details of dependencies, see {{priority}} and {{!RFC7540}}, Section 5.3. Weight: @@ -526,17 +534,27 @@ request using the corresponding stream ID, a server push using a Push ID (see The values for the Prioritized Element Type and Element Dependency Type imply the interpretation of the associated Element ID fields. -| Type Bits | Type Description | Element ID Contents | -| --------- | ---------------- | ------------------- | -| 00 | Request stream | Stream ID | -| 01 | Push stream | Push ID | -| 10 | Placeholder | Placeholder ID | -| 11 | Root of the tree | Ignored | +| Type Bits | Type Description | Prioritized Element ID Contents | +| --------- | ---------------- | ------------------------------- | +| 00 | Request stream | Stream ID | +| 01 | Push stream | Push ID | +| 10 | Placeholder | Placeholder ID | +| 11 | Current stream | Absent | + +| Type Bits | Type Description | Element Dependency ID Contents | +| --------- | ---------------- | ------------------------------ | +| 00 | Request stream | Stream ID | +| 01 | Push stream | Push ID | +| 10 | Placeholder | Placeholder ID | +| 11 | Root of the tree | Absent | Note that the root of the tree cannot be referenced using a Stream ID of 0, as in {{!RFC7540}}; QUIC stream 0 carries a valid HTTP request. The root of the tree cannot be reprioritized. A PRIORITY frame that prioritizes the root of the -tree MUST be treated as a connection error of type HTTP_MALFORMED_FRAME. +tree or the control stream MUST be treated as a connection error of type +HTTP_MALFORMED_FRAME. A PRIORITY frame sent on a request stream that +prioritizes any other stream MUST be treated as a stream error of type +HTTP_MALFORMED_FRAME. When a PRIORITY frame claims to reference a request, the associated ID MUST identify a client-initiated bidirectional stream. A server MUST treat receipt @@ -821,69 +839,6 @@ MUST be treated as a connection error of type HTTP_MALFORMED_FRAME. A server MUST treat a MAX_PUSH_ID frame payload that does not contain a single variable-length integer as a connection error of type HTTP_MALFORMED_FRAME. -### INITIAL_PRIORITY {#frame-initial-priority} - -The INITIAL_PRIORITY (type=0x0F) frame specifies the client-advised priority of -a new stream. INITIAL_PRIORITY frames MAY be sent as the first frame of a -request stream, and MUST NOT be sent thereafter or on other streams. An -INITIAL_PRIORITY frame sent on a non-request stream MUST be treated as a -connection error of type HTTP_WRONG_STREAM. An INITIAL_PRIORITY frame received -after other frames or received by a client MUST be treated as a stream error of -type HTTP_UNEXPECTED_FRAME. - -~~~~~~~~~~ drawing - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -|DT | Empty | Element Dependency ID (i) ... -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -| Weight (8) | -+-+-+-+-+-+-+-+-+ -~~~~~~~~~~ -{: #fig-initial-priority title="INITIAL_PRIORITY frame payload"} - -The INITIAL_PRIORITY frame payload has the following fields: - - Dependency Type: - : A two-bit field indicating the type of element being depended on. - - Empty: - : A six-bit field which MUST be zero when sent and MUST be ignored - on receipt. - - Element Dependency ID: - : A variable-length integer that identifies the element on which a dependency - is being expressed. Depending on the value of Dependency Type, this contains - the Stream ID of a request stream, the Push ID of a promised resource, the - Placeholder ID of a placeholder, or is ignored. For details of - dependencies, see {{priority}} and {{!RFC7540}}, Section 5.3. - - Weight: - : An unsigned 8-bit integer representing a priority weight for the stream (see - {{!RFC7540}}, Section 5.3). Add one to the value to obtain a weight between - 1 and 256. - -An INITIAL_PRIORITY frame identifies an element upon which the current request -stream depends at creation. The values for the Dependency Type and Element -Dependency ID have the same interpretation as in the PRIORITY frame (see -{{frame-priority}}). - -When an INITIAL_PRIORITY frame claims to reference a request, the associated ID -MUST identify a client-initiated bidirectional stream. A server MUST treat -receipt of PRIORITY frame with a Stream ID of any other type as a connection -error of type HTTP_MALFORMED_FRAME. - -An INITIAL_PRIORITY frame that references a non-existent Push ID or a -Placeholder ID greater than the server's limit MUST be treated as an -HTTP_MALFORMED_FRAME error. - -The INITIAL_PRIORITY frame enables a request to be given a priority upon -receipt, independent of reordering that might occur between data on the client's -control stream and the request stream. Subsequent PRIORITY frames on the -control stream can update this dependency; the contents of the INITIAL_PRIORITY -frame are ignored if a PRIORITY frame has already been received which assigns a -different priority to the request. See {{priority}} for more information. - ### Reserved Frame Types {#frame-grease} @@ -1070,16 +1025,17 @@ another request, which expresses the preference that the latter stream (the connection form a dependency tree. When a client request is first sent, its parent and weight are determined by the -INITIAL_PRIORITY frame (see {{frame-initial-priority}}) which begins the stream, -if present. Otherwise, the element is dependent on the root of the priority -tree. Placeholders are also dependent on the root of the priority tree when -first allocated. Pushed streams are initially dependent on the client request -on which the PUSH_PROMISE frame was sent. In all cases, elements are assigned an -initial weight of 16 unless an INITIAL_PRIORITY frame is present. - -The structure of the dependency tree changes as PRIORITY frames modify the -dependency links between requests. The PRIORITY frame {{frame-priority}} -identifies a prioritized element. The elements which can be prioritized are: +PRIORITY frame (see {{frame-priority}}) which begins the stream, if present. +Otherwise, the element is dependent on the root of the priority tree. +Placeholders are also dependent on the root of the priority tree when first +allocated. Pushed streams are initially dependent on the client request on +which the PUSH_PROMISE frame was sent. In all cases, elements are assigned an +initial weight of 16 unless an PRIORITY frame begins the stream. + +The structure of the dependency tree changes as PRIORITY frames on the control +stream modify the dependency links between requests. The PRIORITY frame +{{frame-priority}} identifies a prioritized element. The elements which can be +prioritized are: - Requests, identified by the ID of the request stream - Pushes, identified by the Push ID of the promised resource From 1b220927312ee89cbd9d91607ea135f19a940098 Mon Sep 17 00:00:00 2001 From: Mike Bishop Date: Mon, 3 Dec 2018 13:07:08 -0800 Subject: [PATCH 3/6] Rework error layout --- draft-ietf-quic-http.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/draft-ietf-quic-http.md b/draft-ietf-quic-http.md index 22676f5811..5f2f822b26 100644 --- a/draft-ietf-quic-http.md +++ b/draft-ietf-quic-http.md @@ -469,12 +469,13 @@ HEADERS frames can only be sent on request / push streams. ### PRIORITY {#frame-priority} The PRIORITY (type=0x02) frame specifies the client-advised priority of a -stream. When opening a new request stream, a PRIORITY frame MAY be sent as the -first frame of the stream. In order to ensure that prioritization is processed -in a consistent order, any subsequent PRIORITY frames MUST be sent on the -control stream. A PRIORITY frame received on a push stream, received after -other frames on a request stream, or received by a client MUST be treated as a -stream error of type HTTP_UNEXPECTED_FRAME. +stream. + +When opening a new request stream, a PRIORITY frame MAY be sent as the first +frame of the stream. In order to ensure that prioritization is processed in a +consistent order, any subsequent PRIORITY frames MUST be sent on the control +stream. A PRIORITY frame received after other frames on a request stream MUST +be treated as a stream error of type HTTP_UNEXPECTED_FRAME. Subsequent PRIORITY frames sent on the control stream might arrive before PRIORITY frames sent on a request stream due to reordering. PRIORITY frames on @@ -565,6 +566,11 @@ A PRIORITY frame that references a non-existent Push ID or a Placeholder ID greater than the server's limit MUST be treated as an HTTP_MALFORMED_FRAME error. +A PRIORITY frame received on any stream other than a request or control stream +MUST be treated as a connection error of type HTTP_WRONG_STREAM. + +PRIORITY frames received by a client MUST be treated as a stream error of type +HTTP_UNEXPECTED_FRAME. ### CANCEL_PUSH {#frame-cancel-push} From 1920b13a15adc3b71915fe532e52a8f7ff7981c3 Mon Sep 17 00:00:00 2001 From: Mike Bishop Date: Mon, 3 Dec 2018 13:11:20 -0800 Subject: [PATCH 4/6] More error shuffling --- draft-ietf-quic-http.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/draft-ietf-quic-http.md b/draft-ietf-quic-http.md index 5f2f822b26..f6e21c6700 100644 --- a/draft-ietf-quic-http.md +++ b/draft-ietf-quic-http.md @@ -551,10 +551,10 @@ the interpretation of the associated Element ID fields. Note that the root of the tree cannot be referenced using a Stream ID of 0, as in {{!RFC7540}}; QUIC stream 0 carries a valid HTTP request. The root of the -tree cannot be reprioritized. A PRIORITY frame that prioritizes the root of the -tree or the control stream MUST be treated as a connection error of type -HTTP_MALFORMED_FRAME. A PRIORITY frame sent on a request stream that +tree cannot be reprioritized. A PRIORITY frame sent on a request stream that prioritizes any other stream MUST be treated as a stream error of type +HTTP_MALFORMED_FRAME. Likewise, a PRIORITY frame sent on a control stream that +prioritizes the current stream MUST be treated as a connection error of type HTTP_MALFORMED_FRAME. When a PRIORITY frame claims to reference a request, the associated ID MUST From 9acfcf6c6838fd93f557791419043aee47353c6f Mon Sep 17 00:00:00 2001 From: Mike Bishop Date: Wed, 5 Dec 2018 10:54:44 -0800 Subject: [PATCH 5/6] Limit references to existing elements --- draft-ietf-quic-http.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/draft-ietf-quic-http.md b/draft-ietf-quic-http.md index a56d7ab655..21a5e7acec 100644 --- a/draft-ietf-quic-http.md +++ b/draft-ietf-quic-http.md @@ -472,10 +472,11 @@ The PRIORITY (type=0x02) frame specifies the client-advised priority of a stream. When opening a new request stream, a PRIORITY frame MAY be sent as the first -frame of the stream. In order to ensure that prioritization is processed in a -consistent order, any subsequent PRIORITY frames MUST be sent on the control -stream. A PRIORITY frame received after other frames on a request stream MUST -be treated as a stream error of type HTTP_UNEXPECTED_FRAME. +frame of the stream creating a dependency on an existing element. In order to +ensure that prioritization is processed in a consistent order, any subsequent +PRIORITY frames MUST be sent on the control stream. A PRIORITY frame received +after other frames on a request stream MUST be treated as a stream error of type +HTTP_UNEXPECTED_FRAME. Subsequent PRIORITY frames sent on the control stream might arrive before PRIORITY frames sent on a request stream due to reordering. PRIORITY frames on @@ -552,10 +553,11 @@ the interpretation of the associated Element ID fields. Note that the root of the tree cannot be referenced using a Stream ID of 0, as in {{!RFC7540}}; QUIC stream 0 carries a valid HTTP request. The root of the tree cannot be reprioritized. A PRIORITY frame sent on a request stream that -prioritizes any other stream MUST be treated as a stream error of type -HTTP_MALFORMED_FRAME. Likewise, a PRIORITY frame sent on a control stream that -prioritizes the current stream MUST be treated as a connection error of type -HTTP_MALFORMED_FRAME. +prioritizes any other stream or expresses a dependency on a request with a +greater Stream ID than the current stream MUST be treated as a stream error of +type HTTP_MALFORMED_FRAME. Likewise, a PRIORITY frame sent on a control stream +that prioritizes the current stream MUST be treated as a connection error of +type HTTP_MALFORMED_FRAME. When a PRIORITY frame claims to reference a request, the associated ID MUST identify a client-initiated bidirectional stream. A server MUST treat receipt From c66e72446a21d1c682ea6e053d78274ecbf29938 Mon Sep 17 00:00:00 2001 From: Mike Bishop Date: Thu, 6 Dec 2018 14:43:31 -0800 Subject: [PATCH 6/6] Explicitly prohibit invalid PET values --- draft-ietf-quic-http.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/draft-ietf-quic-http.md b/draft-ietf-quic-http.md index 21a5e7acec..e60c80c35a 100644 --- a/draft-ietf-quic-http.md +++ b/draft-ietf-quic-http.md @@ -552,12 +552,12 @@ the interpretation of the associated Element ID fields. Note that the root of the tree cannot be referenced using a Stream ID of 0, as in {{!RFC7540}}; QUIC stream 0 carries a valid HTTP request. The root of the -tree cannot be reprioritized. A PRIORITY frame sent on a request stream that -prioritizes any other stream or expresses a dependency on a request with a -greater Stream ID than the current stream MUST be treated as a stream error of -type HTTP_MALFORMED_FRAME. Likewise, a PRIORITY frame sent on a control stream -that prioritizes the current stream MUST be treated as a connection error of -type HTTP_MALFORMED_FRAME. +tree cannot be reprioritized. A PRIORITY frame sent on a request stream with the +Prioritized Element Type set to any value other than `11` or which expresses a +dependency on a request with a greater Stream ID than the current stream MUST be +treated as a stream error of type HTTP_MALFORMED_FRAME. Likewise, a PRIORITY +frame sent on a control stream with the Prioritized Element Type set to `11` +MUST be treated as a connection error of type HTTP_MALFORMED_FRAME. When a PRIORITY frame claims to reference a request, the associated ID MUST identify a client-initiated bidirectional stream. A server MUST treat receipt