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
(cherry picked from commit 6350736882)
pull/9003/head
Philippe Antoine 3 years ago committed by Victor Julien
parent 2e4aade51d
commit 401a1b36b1

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

Loading…
Cancel
Save