mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-03-25 04:17:42 +00:00
MINOR: htx: Add an HTX flag to know when a message is fragmented
HTX_FL_FRAGMENTED flag is now set on an HTX message when it is fragmented. It happens when an HTX block is removed in the middle of the message and flagged as unused. HTX_FL_FRAGMENTED flag is removed when all data are removed from the message or when the message is defragmented. Note that some optimisations are still possible because the flag can be avoided in other situations. For instance when the last header of a bodyless message is removed.
This commit is contained in:
parent
68a14db573
commit
4697c92c9d
@ -142,7 +142,7 @@
|
||||
#define HTX_FL_NONE 0x00000000
|
||||
#define HTX_FL_PARSING_ERROR 0x00000001 /* Set when a parsing error occurred */
|
||||
#define HTX_FL_PROCESSING_ERROR 0x00000002 /* Set when a processing error occurred */
|
||||
/* 0x00000004 unused */
|
||||
#define HTX_FL_FRAGMENTED 0x00000004 /* Set when the HTX buffer is fragmented */
|
||||
#define HTX_FL_PROXY_RESP 0x00000008 /* Set when the response was generated by HAProxy */
|
||||
#define HTX_FL_EOM 0x00000010 /* Set when end-of-message is reached from the HTTP point of view
|
||||
* (at worst, on the EOM block is missing)
|
||||
|
10
src/htx.c
10
src/htx.c
@ -79,6 +79,7 @@ struct htx_blk *htx_defrag(struct htx *htx, struct htx_blk *blk, uint32_t blkinf
|
||||
htx->tail = new - 1;
|
||||
htx->head_addr = htx->end_addr = 0;
|
||||
htx->tail_addr = addr;
|
||||
htx->flags &= ~HTX_FL_FRAGMENTED;
|
||||
memcpy((void *)htx->blocks, (void *)tmp->blocks, htx->size);
|
||||
|
||||
return ((blkpos == -1) ? NULL : htx_get_blk(htx, blkpos));
|
||||
@ -339,10 +340,10 @@ struct htx_blk *htx_remove_blk(struct htx *htx, struct htx_blk *blk)
|
||||
|
||||
/* This is the last block in use */
|
||||
if (htx->head == htx->tail) {
|
||||
uint32_t flags = htx->flags; /* Preserve flags */
|
||||
uint32_t flags = (htx->flags & ~HTX_FL_FRAGMENTED); /* Preserve flags except FRAGMENTED */
|
||||
|
||||
htx_reset(htx);
|
||||
htx->flags |= flags;
|
||||
htx->flags = flags; /* restore flags */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -368,6 +369,9 @@ struct htx_blk *htx_remove_blk(struct htx *htx, struct htx_blk *blk)
|
||||
blk = NULL;
|
||||
goto end;
|
||||
}
|
||||
else
|
||||
htx->flags |= HTX_FL_FRAGMENTED;
|
||||
|
||||
blk = htx_get_blk(htx, pos+1);
|
||||
|
||||
end:
|
||||
@ -459,7 +463,7 @@ struct htx_ret htx_drain(struct htx *htx, uint32_t count)
|
||||
struct htx_ret htxret = { .blk = NULL, .ret = 0 };
|
||||
|
||||
if (count == htx->data) {
|
||||
uint32_t flags = htx->flags;
|
||||
uint32_t flags = (htx->flags & ~HTX_FL_FRAGMENTED); /* Preserve flags except FRAGMENTED */
|
||||
|
||||
htx_reset(htx);
|
||||
htx->flags = flags; /* restore flags */
|
||||
|
Loading…
Reference in New Issue
Block a user