Change:
the message header (see RFC7230, Section 3.2), sent as a single HEADERS frame (see frame-headers), <del> the payload body (see RFC7230, Section 3.3), sent as a series of DATA frames (see frame-data), </del> <ins> optionally, the payload body, if present (see RFC7230, Section 3.3), sent as a series of DATA frames (see frame-data), </ins> <del> optionally, one HEADERS frame containing the trailer-part, if present (see RFC7230, Section 4.1.2). </del> <ins> optionally, trailing headers, if present (see RFC7230, Section 4.1.2), sent as a single HEADERS frame. </ins> A server MAY send one or more PUSH_PROMISE frames (see frame-push- promise) before, after, or interleaved with the frames of a response message.  These PUSH_PROMISE frames are not part of the response; see server-push for more details. <ins> Frames of unknown types (extensions), including reserved frames (frame-grease) MAY be sent on a request or push stream before, after, or interleaved with other frames described in this section. </ins> The HEADERS and PUSH_PROMISE frames might reference updates to the QPACK dynamic table.  While these updates are not directly part of the message exchange, they must be received and processed before the

Discussion:
Clarify HTTP message definition. Require the connection to be closed upon receipt of frames in incorrect order. Refer to HTTP messages in push stream section. This addresses URL
Good catch. I added a paragraph to explicitly allow unknown frames to the message exchange section. I also modified the wording in the push section to be more permissive of interleaved frames ("by" instead of "consists of").
LGTM
According to URL, a bidirectional HTTP stream can have at least one HEADERS frame (exactly one if the stream is client-initiated), zero or more DATA frames, then zero or one HEADERS frame, in this order. Handling the receipt of frames that does not conform to this requirement is inconsistent: (1) If a DATA frame is received before any other frame, that's an error: (2) If the trailing HEADERS frame is followed by another HEADERS frame, that is to be discarded: (3) There is no guidance on how to handle a DATA frame after the trailing headers. I suggest that every violation to this requirement should be an error. (I do not feel strongly whether a connection error like (1) is handled right now, or a stream error. The implementation I am contributing to will promote most stream errors to connection errors regardless.) Note that (2) comes from the technical limitation that header blocks needed to be processed, which is not the case any longer with QPACK. It just seems like that when the requirement to decode the header block was removed at URL, adding the requirement to signal an error was not in scope of that commit.
I agree with NAME . If you read that requirement a certain way, then any use of trailers will blow up the connection :) I think we could rewrite this text to be clearer about when DATA frames are expected to be received.
Good points. Let's continue tightening down the screws. :-)
Closed in .
This text was already somewhat lacking by not discussing the possibility of extension frames being interleaved; stating that the push stream consists of "responses" rather than "frames" extends this shortcoming to the push stream section. I'm open to fixing this in a separate PR, if you prefer, though.