mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-28 22:31:06 +01:00
BUG/MEDIUM: cache/filters: Fix loop on HTX blocks caching the response payload
During the payload filtering, the offset is relative to the head of the HTX message and not its first index. This index is the position of the first block to (re)start the HTTP analysis. It must be used during HTTP analysis but not during the payload forwarding. So, from the cache point of view, when we loop on the HTX blocks to cache the response payload, we must start from the head of the HTX message. To ease the loop, we use the function htx_find_offset(). This patch must be backported as far as 2.0. It depends on the commit "MINOR: htx: Add a function to return a block at a specific an offset". So this one must be backported first.
This commit is contained in:
parent
81340d7b53
commit
497c759558
12
src/cache.c
12
src/cache.c
@ -314,6 +314,7 @@ cache_store_http_payload(struct stream *s, struct filter *filter, struct http_ms
|
||||
struct htx *htx = htxbuf(&msg->chn->buf);
|
||||
struct htx_blk *blk;
|
||||
struct shared_block *fb;
|
||||
struct htx_ret htxret;
|
||||
unsigned int orig_len, to_forward;
|
||||
int ret;
|
||||
|
||||
@ -328,16 +329,15 @@ cache_store_http_payload(struct stream *s, struct filter *filter, struct http_ms
|
||||
chunk_reset(&trash);
|
||||
orig_len = len;
|
||||
to_forward = 0;
|
||||
for (blk = htx_get_first_blk(htx); blk && len; blk = htx_get_next_blk(htx, blk)) {
|
||||
|
||||
htxret = htx_find_offset(htx, offset);
|
||||
blk = htxret.blk;
|
||||
offset = htxret.ret;
|
||||
for (; blk && len; blk = htx_get_next_blk(htx, blk)) {
|
||||
enum htx_blk_type type = htx_get_blk_type(blk);
|
||||
uint32_t info, sz = htx_get_blksz(blk);
|
||||
struct ist v;
|
||||
|
||||
if (offset >= sz) {
|
||||
offset -= sz;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case HTX_BLK_UNUSED:
|
||||
break;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user