http2: avoid quadratic complexity in headers

When adding an element to the dynamic headers table, the oldest
ones may get evicted. When multiple elements get evicted, they
should get evicted all at once with drain, instead of one by one
as there will be a massive move each time.

Ticket: #6103
pull/8965/head
Philippe Antoine 2 years ago committed by Victor Julien
parent f346b3fc30
commit 6350736882

@ -456,13 +456,15 @@ fn http2_parse_headers_block_literal_incindex<'a>(
} else { } else {
dyn_headers.table.push(headcopy); dyn_headers.table.push(headcopy);
} }
let mut toremove = 0;
while dyn_headers.current_size > dyn_headers.max_size while dyn_headers.current_size > dyn_headers.max_size
&& !dyn_headers.table.is_empty() && toremove < dyn_headers.table.len()
{ {
dyn_headers.current_size -= dyn_headers.current_size -=
32 + dyn_headers.table[0].name.len() + dyn_headers.table[0].value.len(); 32 + dyn_headers.table[toremove].name.len() + dyn_headers.table[toremove].value.len();
dyn_headers.table.remove(0); toremove += 1;
} }
dyn_headers.table.drain(0..toremove);
} }
return Ok((r, head)); return Ok((r, head));
} }

Loading…
Cancel
Save