- From: Ilari Liusvaara <ilari.liusvaara@elisanet.fi>
- Date: Tue, 22 Jul 2014 15:29:02 +0300
- To: Michael Sweet <msweet@apple.com>
- Cc: Roberto Peon <grmocg@gmail.com>, Jason Greene <jason.greene@redhat.com>, David Krauss <potswa@gmail.com>, Greg Wilkins <gregw@intalio.com>, HTTP Working Group <ietf-http-wg@w3.org>, Mark Nottingham <mnot@mnot.net>
On Mon, Jul 21, 2014 at 09:16:10AM -0400, Michael Sweet wrote:
> I think perhaps we are too focused on preventing an endpoint from
> sending headers that are too large (the 0.2% case) and not on
> interoperability and avoiding dropping the connection at all costs.
>
> It may be the simplest course is to require the connection to be
> torn down, but we might be able to add a "table version" field to
> HEADERS and PUSH_PROMISE to track which header table was in use by
> the sender, add the "table version" field to the header table size
> value that is send in the SETTINGS frame for the receiver to
> communicate the active version on the receiver, and define a RST_STREAM
> error code for "wrong header table version" that triggers a re-send.
>
> (I'm not sure whether the complexity of a table versioning scheme is
> necessary for what should be an infrequent exception...)
I think the following might do the trick already:
- Keep counter of sent non-ack SETTINGS frames (settings_sent), initially 0.
- Keep counter of received SETTINGS ack frames (settings_acked), initially 0.
- Keep recovery threshold (recovery_threshold), initially 0.
- If on receiving HEADERS/PUSH_PROMISE, settings_acked < recovery_threshold, then:
* reset the stream (REFUSED_STREAM?)
* Discard the received header block (including any possible CONTINUATION).
* End processing HEADERS/PUSH_PROMISE.
- Otherwise If HEADERS/PUSH_PROMISE decompression fails, then:
* Send one SETTINGS block containg:
1) SETTINGS_HEADER_TABLE_SIZE 0
2) SETTINGS_HEADER_TABLE_SIZE <whatever>
* Set recovery_threshold <- settings_sent (includes the SETTINGS just sent).
* Discard the rest of the header block (including any possible CONTINUATION).
* Reset the stream (DECOMPRESSION_ERROR?) or 431 it.
* End processing HEADERS/PUSH_PROMISE.
-Ilari
Received on Tuesday, 22 July 2014 12:29:30 UTC