mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 07:37:02 +02:00
REORG: htx: Inline htx functions to add HTX blocks in a message
The HTX functions used to add new HTX blocks in a message have been moved to the header file to inline them in calling functions. These functions are small enough.
This commit is contained in:
parent
fb38c910f8
commit
df3db630e4
@ -44,19 +44,12 @@ struct htx_blk *htx_replace_blk_value(struct htx *htx, struct htx_blk *blk,
|
|||||||
struct htx_ret htx_xfer_blks(struct htx *dst, struct htx *src, uint32_t count,
|
struct htx_ret htx_xfer_blks(struct htx *dst, struct htx *src, uint32_t count,
|
||||||
enum htx_blk_type mark);
|
enum htx_blk_type mark);
|
||||||
|
|
||||||
struct htx_sl *htx_add_stline(struct htx *htx, enum htx_blk_type type, unsigned int flags,
|
|
||||||
const struct ist p1, const struct ist p2, const struct ist p3);
|
|
||||||
struct htx_sl *htx_replace_stline(struct htx *htx, struct htx_blk *blk, const struct ist p1,
|
struct htx_sl *htx_replace_stline(struct htx *htx, struct htx_blk *blk, const struct ist p1,
|
||||||
const struct ist p2, const struct ist p3);
|
const struct ist p2, const struct ist p3);
|
||||||
|
|
||||||
struct htx_blk *htx_replace_header(struct htx *htx, struct htx_blk *blk,
|
struct htx_blk *htx_replace_header(struct htx *htx, struct htx_blk *blk,
|
||||||
const struct ist name, const struct ist value);
|
const struct ist name, const struct ist value);
|
||||||
|
|
||||||
struct htx_blk *htx_add_header(struct htx *htx, const struct ist name, const struct ist value);
|
|
||||||
struct htx_blk *htx_add_trailer(struct htx *htx, const struct ist name, const struct ist value);
|
|
||||||
struct htx_blk *htx_add_all_headers(struct htx *htx, const struct http_hdr *hdrs);
|
|
||||||
struct htx_blk *htx_add_all_trailers(struct htx *htx, const struct http_hdr *hdrs);
|
|
||||||
struct htx_blk *htx_add_endof(struct htx *htx, enum htx_blk_type type);
|
|
||||||
struct htx_ret htx_reserve_max_data(struct htx *htx);
|
struct htx_ret htx_reserve_max_data(struct htx *htx);
|
||||||
struct htx_blk *htx_add_data_atonce(struct htx *htx, struct ist data);
|
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);
|
size_t htx_add_data(struct htx *htx, const struct ist data);
|
||||||
@ -431,6 +424,123 @@ static inline struct ist htx_get_blk_value(const struct htx *htx, const struct h
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add a new start-line. It returns it on success, otherwise it returns NULL. It
|
||||||
|
* is the caller responsibility to set sl->info, if necessary.
|
||||||
|
*/
|
||||||
|
static inline struct htx_sl *htx_add_stline(struct htx *htx, enum htx_blk_type type, unsigned int flags,
|
||||||
|
const struct ist p1, const struct ist p2, const struct ist p3)
|
||||||
|
{
|
||||||
|
struct htx_blk *blk;
|
||||||
|
struct htx_sl *sl;
|
||||||
|
uint32_t size;
|
||||||
|
|
||||||
|
if (type != HTX_BLK_REQ_SL && type != HTX_BLK_RES_SL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
size = sizeof(*sl) + p1.len + p2.len + p3.len;
|
||||||
|
|
||||||
|
/* FIXME: check size (< 256MB) */
|
||||||
|
blk = htx_add_blk(htx, type, size);
|
||||||
|
if (!blk)
|
||||||
|
return NULL;
|
||||||
|
blk->info += size;
|
||||||
|
|
||||||
|
sl = htx_get_blk_ptr(htx, blk);
|
||||||
|
sl->hdrs_bytes = -1;
|
||||||
|
sl->flags = flags;
|
||||||
|
|
||||||
|
HTX_SL_P1_LEN(sl) = p1.len;
|
||||||
|
HTX_SL_P2_LEN(sl) = p2.len;
|
||||||
|
HTX_SL_P3_LEN(sl) = p3.len;
|
||||||
|
|
||||||
|
memcpy(HTX_SL_P1_PTR(sl), p1.ptr, p1.len);
|
||||||
|
memcpy(HTX_SL_P2_PTR(sl), p2.ptr, p2.len);
|
||||||
|
memcpy(HTX_SL_P3_PTR(sl), p3.ptr, p3.len);
|
||||||
|
|
||||||
|
return sl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adds an HTX block of type HDR in <htx>. It returns the new block on
|
||||||
|
* success. Otherwise, it returns NULL. The header name is always lower cased.
|
||||||
|
*/
|
||||||
|
static inline struct htx_blk *htx_add_header(struct htx *htx, const struct ist name,
|
||||||
|
const struct ist value)
|
||||||
|
{
|
||||||
|
struct htx_blk *blk;
|
||||||
|
|
||||||
|
/* FIXME: check name.len (< 256B) and value.len (< 1MB) */
|
||||||
|
blk = htx_add_blk(htx, HTX_BLK_HDR, name.len + value.len);
|
||||||
|
if (!blk)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
blk->info += (value.len << 8) + name.len;
|
||||||
|
ist2bin_lc(htx_get_blk_ptr(htx, blk), name);
|
||||||
|
memcpy(htx_get_blk_ptr(htx, blk) + name.len, value.ptr, value.len);
|
||||||
|
return blk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adds an HTX block of type TLR in <htx>. It returns the new block on
|
||||||
|
* success. Otherwise, it returns NULL. The trailer name is always lower cased.
|
||||||
|
*/
|
||||||
|
static inline struct htx_blk *htx_add_trailer(struct htx *htx, const struct ist name,
|
||||||
|
const struct ist value)
|
||||||
|
{
|
||||||
|
struct htx_blk *blk;
|
||||||
|
|
||||||
|
/* FIXME: check name.len (< 256B) and value.len (< 1MB) */
|
||||||
|
blk = htx_add_blk(htx, HTX_BLK_TLR, name.len + value.len);
|
||||||
|
if (!blk)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
blk->info += (value.len << 8) + name.len;
|
||||||
|
ist2bin_lc(htx_get_blk_ptr(htx, blk), name);
|
||||||
|
memcpy(htx_get_blk_ptr(htx, blk) + name.len, value.ptr, value.len);
|
||||||
|
return blk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adds an HTX block of type EOH or EOT in <htx>. It returns the new block on
|
||||||
|
* success. Otherwise, it returns NULL.
|
||||||
|
*/
|
||||||
|
static inline struct htx_blk *htx_add_endof(struct htx *htx, enum htx_blk_type type)
|
||||||
|
{
|
||||||
|
struct htx_blk *blk;
|
||||||
|
|
||||||
|
blk = htx_add_blk(htx, type, 1);
|
||||||
|
if (!blk)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
blk->info += 1;
|
||||||
|
return blk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add all headers from the list <hdrs> into the HTX message <htx>, followed by
|
||||||
|
* the EOH. On success, it returns the last block inserted (the EOH), otherwise
|
||||||
|
* NULL is returned. */
|
||||||
|
static inline struct htx_blk *htx_add_all_headers(struct htx *htx, const struct http_hdr *hdrs)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; hdrs[i].n.len; i++) {
|
||||||
|
if (!htx_add_header(htx, hdrs[i].n, hdrs[i].v))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return htx_add_endof(htx, HTX_BLK_EOH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add all trailers from the list <hdrs> into the HTX message <htx>, followed by
|
||||||
|
* the EOT. On success, it returns the last block inserted (the EOT), otherwise
|
||||||
|
* NULL is returned. */
|
||||||
|
static inline struct htx_blk *htx_add_all_trailers(struct htx *htx, const struct http_hdr *hdrs)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; hdrs[i].n.len; i++) {
|
||||||
|
if (!htx_add_trailer(htx, hdrs[i].n, hdrs[i].v))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return htx_add_endof(htx, HTX_BLK_EOT);
|
||||||
|
}
|
||||||
|
|
||||||
/* Removes <n> bytes from the beginning of DATA block <blk>. The block's start
|
/* Removes <n> bytes from the beginning of DATA block <blk>. The block's start
|
||||||
* address and its length are adjusted, and the htx's total data count is
|
* address and its length are adjusted, and the htx's total data count is
|
||||||
* updated. This is used to mark that part of some data were transferred
|
* updated. This is used to mark that part of some data were transferred
|
||||||
|
117
src/htx.c
117
src/htx.c
@ -817,123 +817,6 @@ struct htx_sl *htx_replace_stline(struct htx *htx, struct htx_blk *blk, const st
|
|||||||
return sl;
|
return sl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add a new start-line. It returns it on success, otherwise it returns NULL. It
|
|
||||||
* is the caller responsibility to set sl->info, if necessary.
|
|
||||||
*/
|
|
||||||
struct htx_sl *htx_add_stline(struct htx *htx, enum htx_blk_type type, unsigned int flags,
|
|
||||||
const struct ist p1, const struct ist p2, const struct ist p3)
|
|
||||||
{
|
|
||||||
struct htx_blk *blk;
|
|
||||||
struct htx_sl *sl;
|
|
||||||
uint32_t size;
|
|
||||||
|
|
||||||
if (type != HTX_BLK_REQ_SL && type != HTX_BLK_RES_SL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
size = sizeof(*sl) + p1.len + p2.len + p3.len;
|
|
||||||
|
|
||||||
/* FIXME: check size (< 256MB) */
|
|
||||||
blk = htx_add_blk(htx, type, size);
|
|
||||||
if (!blk)
|
|
||||||
return NULL;
|
|
||||||
blk->info += size;
|
|
||||||
|
|
||||||
sl = htx_get_blk_ptr(htx, blk);
|
|
||||||
sl->hdrs_bytes = -1;
|
|
||||||
sl->flags = flags;
|
|
||||||
|
|
||||||
HTX_SL_P1_LEN(sl) = p1.len;
|
|
||||||
HTX_SL_P2_LEN(sl) = p2.len;
|
|
||||||
HTX_SL_P3_LEN(sl) = p3.len;
|
|
||||||
|
|
||||||
memcpy(HTX_SL_P1_PTR(sl), p1.ptr, p1.len);
|
|
||||||
memcpy(HTX_SL_P2_PTR(sl), p2.ptr, p2.len);
|
|
||||||
memcpy(HTX_SL_P3_PTR(sl), p3.ptr, p3.len);
|
|
||||||
|
|
||||||
return sl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Adds an HTX block of type HDR in <htx>. It returns the new block on
|
|
||||||
* success. Otherwise, it returns NULL. The header name is always lower cased.
|
|
||||||
*/
|
|
||||||
struct htx_blk *htx_add_header(struct htx *htx, const struct ist name,
|
|
||||||
const struct ist value)
|
|
||||||
{
|
|
||||||
struct htx_blk *blk;
|
|
||||||
|
|
||||||
/* FIXME: check name.len (< 256B) and value.len (< 1MB) */
|
|
||||||
blk = htx_add_blk(htx, HTX_BLK_HDR, name.len + value.len);
|
|
||||||
if (!blk)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
blk->info += (value.len << 8) + name.len;
|
|
||||||
ist2bin_lc(htx_get_blk_ptr(htx, blk), name);
|
|
||||||
memcpy(htx_get_blk_ptr(htx, blk) + name.len, value.ptr, value.len);
|
|
||||||
return blk;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Adds an HTX block of type TLR in <htx>. It returns the new block on
|
|
||||||
* success. Otherwise, it returns NULL. The trailer name is always lower cased.
|
|
||||||
*/
|
|
||||||
struct htx_blk *htx_add_trailer(struct htx *htx, const struct ist name,
|
|
||||||
const struct ist value)
|
|
||||||
{
|
|
||||||
struct htx_blk *blk;
|
|
||||||
|
|
||||||
/* FIXME: check name.len (< 256B) and value.len (< 1MB) */
|
|
||||||
blk = htx_add_blk(htx, HTX_BLK_TLR, name.len + value.len);
|
|
||||||
if (!blk)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
blk->info += (value.len << 8) + name.len;
|
|
||||||
ist2bin_lc(htx_get_blk_ptr(htx, blk), name);
|
|
||||||
memcpy(htx_get_blk_ptr(htx, blk) + name.len, value.ptr, value.len);
|
|
||||||
return blk;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add all headers from the list <hdrs> into the HTX message <htx>, followed by
|
|
||||||
* the EOH. On success, it returns the last block inserted (the EOH), otherwise
|
|
||||||
* NULL is returned. */
|
|
||||||
struct htx_blk *htx_add_all_headers(struct htx *htx, const struct http_hdr *hdrs)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; hdrs[i].n.len; i++) {
|
|
||||||
if (!htx_add_header(htx, hdrs[i].n, hdrs[i].v))
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return htx_add_endof(htx, HTX_BLK_EOH);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add all trailers from the list <hdrs> into the HTX message <htx>, followed by
|
|
||||||
* the EOT. On success, it returns the last block inserted (the EOT), otherwise
|
|
||||||
* NULL is returned. */
|
|
||||||
struct htx_blk *htx_add_all_trailers(struct htx *htx, const struct http_hdr *hdrs)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; hdrs[i].n.len; i++) {
|
|
||||||
if (!htx_add_trailer(htx, hdrs[i].n, hdrs[i].v))
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return htx_add_endof(htx, HTX_BLK_EOT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Adds an HTX block of type EOH or EOT in <htx>. It returns the new block on
|
|
||||||
* success. Otherwise, it returns NULL.
|
|
||||||
*/
|
|
||||||
struct htx_blk *htx_add_endof(struct htx *htx, enum htx_blk_type type)
|
|
||||||
{
|
|
||||||
struct htx_blk *blk;
|
|
||||||
|
|
||||||
blk = htx_add_blk(htx, type, 1);
|
|
||||||
if (!blk)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
blk->info += 1;
|
|
||||||
return blk;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reserves the maximum possible size for an HTX data block, by extending an
|
/* Reserves the maximum possible size for an HTX data block, by extending an
|
||||||
* existing one or by creating a now one. It returns a compound result with the
|
* existing one or by creating a now one. It returns a compound result with the
|
||||||
* HTX block and the position where new data must be inserted (0 for a new
|
* HTX block and the position where new data must be inserted (0 for a new
|
||||||
|
Loading…
Reference in New Issue
Block a user