- From: Roberto Peon <grmocg@gmail.com>
- Date: Mon, 26 Aug 2013 17:21:52 -0700
- To: Jesse Wilson <jesse@swank.ca>
- Cc: HTTP Working Group <ietf-http-wg@w3.org>
- Message-ID: <CAP+FsNfpFmD3EsCXTjuarusbXNQfRn3WZA_eb8j1SZhqA-mgyA@mail.gmail.com>
As James has already said, you prune then replace. If must be this way, else you're violating the guarantee about how much memory you're using (by however long the new key-value is). It should look something like: while not enough_space_in_header_table_for_an_extra(key.size() + val.size() + 32): expire_oldest_entry(); If substituting, then, if the key index points to the element being replaced, the space necessary is only val.size(). If the key index points elsewhere, it would be key.size() + val.size() [32 excluded, since we've already paid for this slot] Thus (this only handles making space for stuff, not the whole state machine): for op in ops: if op is substitution: if key_idx == dst_idx: size_needed = val.size() else: size_needed = key.size() + val.size() else: size_needed = key.size() + val.size() + 32 while not state_table.empty() and current_size + size_needed > max_size: entry = state_table.oldest_entry() current_size -= entry.key() + entry.val() + 32 delete entry # handle inserting entry -=R On Mon, Aug 26, 2013 at 7:44 AM, Jesse Wilson <jesse@swank.ca> wrote: > I'm attempting to implement HTTP/2.0 for OkHttp<http://square.github.io/okhttp/>, > Square's HTTP client for Android and Java. > > I'd like to clarify how header table pruning works with > replacement-by-index. The doc says<http://http2.github.io/compression-spec/compression-spec.html#rfc.section.3.2.3> > : > > When the modification of the header table is the replacement of an > existing entry, the replaced entry is the one indicated in the literal > representation before any entry is removed from the header table. *If the > entry to be replaced is removed* from the header table when performing > the size adjustment, the replacement entry is inserted at the beginning of > the header table. > > Is the entry to be replaced removed before pruning-from-0 begins? Or does > all pruning happen, and then the replacement happens? > > Here‘s an example situation where the order of these operations is > relevant. Suppose I’ve got a headers table containing 4 entries, each 1024 > bytes. The max size of this table is 4096. > > 0 A: <value> (entry size: 1024) > 1 B: <value> (entry size: 1024) > 2 C: <value> (entry size: 1024) > 3 D: <value> (entry size: 1024) > > At this point I receive a literal header with substitution indexing “E” at > index 2 and entry size 2048. This will replace C. > > If I prune first, I remove A and B. Substituting yields this new headers > table: > > 0 E: <value> (entry size: 2048) > 1 D: <value> (entry size: 1024) > > If I remove the replaced entry C first, I get a different result: > > 0 B: <value> (entry size: 1024) > 1 E: <value> (entry size: 2048) > 2 D: <value> (entry size: 1024) > > Another way to look at it is whether I'm pruning until currentSize + > size(E) <= max or until currentSize - size(C) + size(E) <= max. > > Thanks! >
Received on Tuesday, 27 August 2013 00:22:21 UTC