#include <haproxy/stream.h>
#include <haproxy/tools.h>
+#define COMP_STATE_PROCESSING 0x01
+
const char *http_comp_flt_id = "compression filter";
struct flt_ops comp_ops;
struct comp_state {
struct comp_ctx *comp_ctx; /* compression context */
struct comp_algo *comp_algo; /* compression algorithm if not NULL */
+ unsigned int flags; /* COMP_STATE_* */
};
/* Pools used to allocate comp_state structs */
st->comp_algo = NULL;
st->comp_ctx = NULL;
+ st->flags = 0;
filter->ctx = st;
/* Register post-analyzer on AN_RES_WAIT_HTTP because we need to
if (!set_compression_response_header(st, s, msg))
goto end;
register_data_filter(s, msg->chn, filter);
+ st->flags |= COMP_STATE_PROCESSING;
}
}
while (next && htx_get_blk_type(next) == HTX_BLK_UNUSED)
next = htx_get_next_blk(htx, next);
+ if (!(st->flags & COMP_STATE_PROCESSING))
+ goto consume;
+
if (htx_compression_buffer_init(htx, &trash) < 0) {
msg->chn->flags |= CF_WAKE_WRITE;
goto end;
len -= ret;
consumed += ret;
to_forward += b_data(&trash);
+ if (last)
+ st->flags &= ~COMP_STATE_PROCESSING;
break;
case HTX_BLK_TLR:
next = htx_get_next_blk(htx, blk);
to_forward += b_data(&trash);
}
+ st->flags &= ~COMP_STATE_PROCESSING;
/* fall through */
default: