- From: Alan Egerton <eggyal@gmail.com>
- Date: Tue, 22 Sep 2020 20:38:02 +0100
- To: Lucas Pardue <lucaspardue.24.7@gmail.com>
- Cc: HTTP Working Group <ietf-http-wg@w3.org>
- Message-ID: <CA+phaeeaeL+64TyrQgp3+=wDiDbtxcTYqzSzQN2PN34WfRadsQ@mail.gmail.com>
Thanks Lucas, but I don't think either of those reports are quite the same: they both appear to concern the state transition from "idle" state on sending a PUSH_PROMISE (and that the spec can be misread as describing transitions from that state on receiving such frames); whereas I am concerned with the correct error handling on receiving an erroneous PUSH_PROMISE in the "half-closed(remote)" or "closed" states. -- Alan On Tue, Sep 22, 2020 at 7:17 PM Lucas Pardue <lucaspardue.24.7@gmail.com> wrote: > 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 19:38:26 UTC