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.
This commit is contained in:
Christopher Faulet 2019-01-07 14:53:27 +01:00
parent f9a48ef791
commit 00cf697215
2 changed files with 21 additions and 0 deletions

View File

@ -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_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_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); 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, struct htx_blk *htx_replace_blk_value(struct htx *htx, struct htx_blk *blk,
const struct ist old, const struct ist new); const struct ist old, const struct ist new);

View File

@ -287,6 +287,26 @@ struct htx_blk *htx_remove_blk(struct htx *htx, struct htx_blk *blk)
return blk; return blk;
} }
/* Truncate all blocks after the one containing the offset <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 /* 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 * 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, * appended. If the append fails, a new block is inserted. If an error occurred,