2023-05-23 - closing states on the stream endpoint descriptor This document deals with the current flags on the SE desc: - SE_FL_ERR_PENDING: an error was met while sending, but some incoming data might still be pending. This flag will be promoted to SE_FL_ERROR when the SE_FL_EOI or SE_FL_EOS flags are set via the standard API (se_fl_set()). - SE_FL_ERROR ("ERR"): an error was met, last data were received if any, and no more progress will happen. - SE_FL_EOI ("EOI"): the end of the input message was seen, without implying an end of the connection nor the end of event reporting for this stream. For example and end of HTTP request or response will set EOI, after which it's still possible (in case of a request) to bring an abort or error. Said differently, the expected end of the message was seen. - SE_FL_EOS ("EOS"): the definitive end of the input data was detected. It may result from an error, an abort, a connection shutdown, and no more receive events will be reported. The different muxes (H1,H2,H3) can face slightly different situations due to the nature, properties, and limitations of their underlying protocols, and will set these 3 flags to best translate the lower layer's situation and report it to the upper layer: +-----------+----------------------------------------------------------------- |ERR EOS EOI| Description per mux +-----------+----------------------------------------------------------------- | 0 0 0 | all: transfer still in progress +-----------+----------------------------------------------------------------- | 0 0 1 | H1: end of message reached. | | H2: "ES" flag seen on a frame. | | H3: not set +-----------+----------------------------------------------------------------- | 0 1 0 | H1: not set (*1) | | H2: not set (*2) | | H3: RST received before FIN (client stops uploading) +-----------+----------------------------------------------------------------- | 0 1 1 | H1: end of message + read0, such as close response or aborted | | request | | H2: not set (*2) | | H3: end of message reached (any subsequent RSTs are ignored) +-----------+----------------------------------------------------------------- | 1 0 0 | all: could be used to report a protocol error (ex: invalid chunk | | encoding, forbidden response header seen from a server). +-----------+----------------------------------------------------------------- | 1 0 1 | all: could be used to report an internal error or a downstream | | protocol error, such as a forbidden header in an HTX block | | coming from the stream layer or the impossibility to encode | | a message. Seems unused right now. +-----------+----------------------------------------------------------------- | 1 1 0 | H1: truncated client input data before response, or truncated | | response from the server | | H2: RST or read0 received before end of input message | | H3: RST + STOP_SENDING before FIN +-----------+----------------------------------------------------------------- | 1 1 1 | H1: error face while sending after end of input message | | H2: RST or read0 received after end of input message | | H3: STOP_SENDING received after a frame with FIN +-----------+----------------------------------------------------------------- *1: EOS alone is currently not set by H1, however this situation could best describe an H1 upload that was interrupted by the client while receiving an early response, a reused persistent server connection that delivered a read0 immediately after the request was sent, or a truncated server response (or possibly one in close mode when no C-L was advertised). Right now these situations are always accompanied with an ERR flag in addition to the EOS one. *2: H2 doesn't set EOS without ERR because currently the only ways to close a stream in H2 are by resetting the stream (which conveys an error) or closing the connection (which renders it unusable in both directions and prevents from sending as well).