From: Christopher Faulet Date: Mon, 7 Jan 2019 13:53:27 +0000 (+0100) Subject: MINOR: htx: Add a function to truncate all blocks after a specific offset X-Git-Tag: v2.0-dev1~242 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=00cf697215033ffc5fb2ff63b3ba80598b3d396b;p=thirdparty%2Fhaproxy.git MINOR: htx: Add a function to truncate all blocks after a specific offset This function will be used to truncate all incoming data in a channel, keeping outgoing ones. This may be backported to 1.9. --- diff --git a/include/common/htx.h b/include/common/htx.h index 56a6c9b969..94df4bbd48 100644 --- a/include/common/htx.h +++ b/include/common/htx.h @@ -170,6 +170,7 @@ extern struct htx htx_empty; struct htx_blk *htx_defrag(struct htx *htx, struct htx_blk *blk); struct htx_blk *htx_add_blk(struct htx *htx, enum htx_blk_type type, uint32_t blksz); struct htx_blk *htx_remove_blk(struct htx *htx, struct htx_blk *blk); +void htx_truncate(struct htx *htx, uint32_t offset); struct htx_blk *htx_replace_blk_value(struct htx *htx, struct htx_blk *blk, const struct ist old, const struct ist new); diff --git a/src/htx.c b/src/htx.c index af94643440..3e7e4df384 100644 --- a/src/htx.c +++ b/src/htx.c @@ -287,6 +287,26 @@ struct htx_blk *htx_remove_blk(struct htx *htx, struct htx_blk *blk) return blk; } +/* Truncate all blocks after the one containing the offset . This last + * one is truncated too. + */ +void htx_truncate(struct htx *htx, uint32_t offset) +{ + struct htx_blk *blk; + struct htx_ret htxret; + + htxret = htx_find_blk(htx, offset); + blk = htxret.blk; + if (blk && htxret.ret) { + uint32_t sz = htx_get_blksz(blk); + + htx_set_blk_value_len(blk, sz - htxret.ret); + blk = htx_get_next_blk(htx, blk); + } + while (blk) + blk = htx_remove_blk(htx, blk); +} + /* Tries to append data to the last inserted block, if the type matches and if * there is enough non-wrapping space. Only DATA and TRAILERS content can be * appended. If the append fails, a new block is inserted. If an error occurred,