struct cache_st *st = filter->ctx;
struct htx *htx = htxbuf(&msg->chn->buf);
struct htx_blk *blk;
- struct htx_ret htx_ret;
struct cache_entry *object;
int ret, to_forward = 0;
}
object = (struct cache_entry *)st->first_block->data;
- htx_ret = htx_find_blk(htx, offset);
- blk = htx_ret.blk;
- offset = htx_ret.ret;
-
- while (blk && len) {
+ for (blk = htx_get_first_blk(htx); blk && len; blk = htx_get_next_blk(htx, blk)) {
struct shared_block *fb;
enum htx_blk_type type = htx_get_blk_type(blk);
uint32_t sz = htx_get_blksz(blk);
struct ist v;
+ if (offset >= sz) {
+ offset -= sz;
+ continue;
+ }
+
switch (type) {
case HTX_BLK_UNUSED:
break;
}
offset = 0;
- blk = htx_get_next_blk(htx, blk);
}
return to_forward;
{
struct filter *filter;
unsigned long long *strm_off = &FLT_STRM_OFF(s, msg->chn);
- unsigned int out = co_data(msg->chn);
- int ret = len - out;
+ int ret = len - co_data(msg->chn);
list_for_each_entry(filter, &strm_flt(s)->filters, list) {
/* Call "data" filters only */
unsigned long long *flt_off = &FLT_OFF(filter, msg->chn);
unsigned int offset = *flt_off - *strm_off;
- ret = FLT_OPS(filter)->http_payload(s, filter, msg, out + offset, ret - offset);
+ ret = FLT_OPS(filter)->http_payload(s, filter, msg, offset, ret - offset);
if (ret < 0)
goto end;
*flt_off += ret;
}
}
*strm_off += ret;
-
end:
return ret;
}
struct comp_state *st = filter->ctx;
struct htx *htx = htxbuf(&msg->chn->buf);
struct htx_blk *blk;
- struct htx_ret htx_ret;
int ret, consumed = 0, to_forward = 0;
- htx_ret = htx_find_blk(htx, offset);
- blk = htx_ret.blk;
- offset = htx_ret.ret;
-
- while (blk && len) {
+ for (blk = htx_get_first_blk(htx); blk && len; blk = htx_get_next_blk(htx, blk)) {
enum htx_blk_type type = htx_get_blk_type(blk);
uint32_t sz = htx_get_blksz(blk);
struct ist v;
+ if (offset >= sz) {
+ offset -= sz;
+ continue;
+ }
+
switch (type) {
case HTX_BLK_UNUSED:
break;
}
offset = 0;
- blk = htx_get_next_blk(htx, blk);
}
end:
static void
trace_htx_hexdump(struct htx *htx, unsigned int offset, unsigned int len)
{
- struct htx_ret htx_ret;
struct htx_blk *blk;
- htx_ret = htx_find_blk(htx, offset);
- blk = htx_ret.blk;
- offset = htx_ret.ret;
-
- while (blk) {
+ for (blk = htx_get_first_blk(htx); blk && len; blk = htx_get_next_blk(htx, blk)) {
enum htx_blk_type type = htx_get_blk_type(blk);
+ uint32_t sz = htx_get_blksz(blk);
struct ist v;
+ if (offset >= sz) {
+ offset -= sz;
+ continue;
+ }
+
v = htx_get_blk_value(htx, blk);
v.ptr += offset;
v.len -= offset;
len -= v.len;
if (type == HTX_BLK_DATA || type == HTX_BLK_TLR)
trace_hexdump(v);
- blk = htx_get_next_blk(htx, blk);
}
}
ret = flt_http_payload(s, msg, htx->data);
if (ret < 0)
goto return_bad_req;
- c_adv(req, ret);
+ channel_htx_fwd_payload(req, htx, ret);
if (htx->data != co_data(req) || htx->extra)
goto missing_data_or_waiting;
}
ret = flt_http_payload(s, msg, htx->data);
if (ret < 0)
goto return_bad_res;
- c_adv(res, ret);
+ channel_htx_fwd_payload(res, htx, ret);
if (htx->data != co_data(res) || htx->extra)
goto missing_data_or_waiting;
}