mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-25 14:12:13 +00:00
MINOR: htx: Add a function to append an HTX message to another one
the htx_append_msg() function can now be used to append an HTX message to another one. All the message is copied or nothing. If an error occurs during the copy, all changes are rolled back. This patch is mandatory to fix a bug in http_reply_and_close() function. Be careful to backport it first.
This commit is contained in:
parent
0a589fde7c
commit
0ea0c86753
@ -255,6 +255,7 @@ struct htx_blk *htx_add_data_atonce(struct htx *htx, struct ist data);
|
||||
size_t htx_add_data(struct htx *htx, const struct ist data);
|
||||
struct htx_blk *htx_add_last_data(struct htx *htx, struct ist data);
|
||||
void htx_move_blk_before(struct htx *htx, struct htx_blk **blk, struct htx_blk **ref);
|
||||
int htx_append_msg(struct htx *dst, const struct htx *src);
|
||||
|
||||
/* Functions and macros to get parts of the start-line or legnth of these
|
||||
* parts. Request and response start-lines are both composed of 3 parts.
|
||||
|
31
src/htx.c
31
src/htx.c
@ -1040,3 +1040,34 @@ void htx_move_blk_before(struct htx *htx, struct htx_blk **blk, struct htx_blk *
|
||||
*blk = cblk;
|
||||
*ref = pblk;
|
||||
}
|
||||
|
||||
/* Append the HTX message <src> to the HTX message <dst>. It returns 1 on
|
||||
* success and 0 on error. All the message or nothing is copied. If an error
|
||||
* occurred, all blocks from <src> already appended to <dst> are truncated.
|
||||
*/
|
||||
int htx_append_msg(struct htx *dst, const struct htx *src)
|
||||
{
|
||||
struct htx_blk *blk, *newblk;
|
||||
enum htx_blk_type type;
|
||||
uint32_t blksz, offset = dst->data;
|
||||
|
||||
for (blk = htx_get_head_blk(src); blk; blk = htx_get_next_blk(src, blk)) {
|
||||
type = htx_get_blk_type(blk);
|
||||
|
||||
if (type == HTX_BLK_UNUSED)
|
||||
continue;
|
||||
|
||||
blksz = htx_get_blksz(blk);
|
||||
newblk = htx_add_blk(dst, type, blksz);
|
||||
if (!newblk)
|
||||
goto error;
|
||||
newblk->info = blk->info;
|
||||
memcpy(htx_get_blk_ptr(dst, newblk), htx_get_blk_ptr(src, blk), blksz);
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
error:
|
||||
htx_truncate(dst, offset);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user