- From: Lucas Pardue <lucaspardue.24.7@gmail.com>
- Date: Tue, 22 Sep 2020 19:17:35 +0100
- To: Alan Egerton <eggyal@gmail.com>
- Cc: HTTP Working Group <ietf-http-wg@w3.org>
- Message-ID: <CALGR9oZLp+RBZCaCr-Q4uBX7UGieSavizxWLcw3gmHpcuz8k1g@mail.gmail.com>
The confusion is possibly due to the reports in errata 4535 [1] and duplicate 4645 [2], [1] - https://www.rfc-editor.org/errata/eid4535 [2] - https://www.rfc-editor.org/errata/eid4645 On Tue, Sep 22, 2020 at 6:30 PM Alan Egerton <eggyal@gmail.com> wrote: > I'm a little unclear exactly how clients should behave upon receiving > PUSH_PROMISE frames in certain illegal states. In particular, > sections 5.1 and 6.6 of RFC 7540 appear to state contradictory > requirements: > > +------------------------------+-----------------+-----------------+ > | Client state | Section 5.1 | Section 6.6 | > +------------------------------+-----------------+-----------------+ > | half-closed(remote) | S:SC | C:PE | > | | | | > | closed (RST_STREAM received) | S:SC | C:PE | > | closed (END_STREAM received) | C:SC | C:PE | > | closed (RST_STREAM sent) | Ignore/P:? | Handle/C:PE | > +------------------------------+-----------------+-----------------+ > KEY > S: = Stream error > C: = Connection error > P: = Reset promised stream (error type not stated) > :SC = STREAM_CLOSED > :PE = PROTOCOL_ERROR > > > So, which is correct? And where RST_STREAM has been sent, should the > PUSH_PROMISE be ignored or handled (beyond sending RST_STREAM for the > promised stream, in which case what should be the error type)? > > > The relevant extracts from Section 5.1 are: > > In "half-closed(remote)": > > > If an endpoint receives additional frames, other than WINDOW_UPDATE, > > PRIORITY, or RST_STREAM, for a stream that is in this state, it MUST > > respond with a stream error (Section 5.4.2) of type STREAM_CLOSED. > > In "closed": > > > An endpoint that receives any frame other than PRIORITY after > > receiving a RST_STREAM MUST treat that as a stream error (Section > > 5.4.2) of type STREAM_CLOSED. Similarly, an endpoint that receives any > > frames after receiving a frame with the END_STREAM flag set MUST treat > > that as a connection error (Section 5.4.1) of type STREAM_CLOSED, > > unless the frame is permitted as described below. > > and > > > An endpoint MUST ignore frames that it receives on closed streams > > after it has sent a RST_STREAM frame. > > > > [deletia] > > > > An endpoint might receive a PUSH_PROMISE frame after it sends > > RST_STREAM. PUSH_PROMISE causes a stream to become "reserved" even if > > the associated stream has been reset. Therefore, a RST_STREAM is > > needed to close an unwanted promised stream. > > > And from Section 6.6 PUSH_PROMISE: > > > A receiver MUST treat the receipt of a PUSH_PROMISE on a stream that > > is neither "open" nor "half-closed (local)" as a connection error > > (Section 5.4.1) of type PROTOCOL_ERROR. However, an endpoint that has > > sent RST_STREAM on the associated stream MUST handle PUSH_PROMISE > > frames that might have been created before the RST_STREAM frame is > > received and processed. > > -- Alan >
Received on Tuesday, 22 September 2020 18:17:59 UTC