diff --git a/include/proto/channel.h b/include/proto/channel.h index 5d9c7a8aa..0ea458f77 100644 --- a/include/proto/channel.h +++ b/include/proto/channel.h @@ -361,6 +361,25 @@ static inline void channel_forward_forever(struct channel *chn) chn->to_forward = CHN_INFINITE_FORWARD; } +/* bytes of input data was added into the channel . This functions + * must be called to update the channel state. It also handles the fast + * forwarding. */ +static inline void channel_add_input(struct channel *chn, unsigned int len) +{ + if (chn->to_forward) { + unsigned long fwd = len; + if (chn->to_forward != CHN_INFINITE_FORWARD) { + if (fwd > chn->to_forward) + fwd = chn->to_forward; + chn->to_forward -= fwd; + } + c_adv(chn, fwd); + } + /* notify that some data was read */ + chn->total += len; + chn->flags |= CF_READ_PARTIAL; +} + static inline unsigned long long channel_htx_forward(struct channel *chn, struct htx *htx, unsigned long long bytes) { unsigned long long ret; @@ -378,7 +397,6 @@ static inline void channel_htx_forward_forever(struct channel *chn, struct htx * channel_forward_forever(chn); b_set_data(&chn->buf, b_size(&chn->buf)); } - /*********************************************************************/ /* These functions are used to compute various channel content sizes */ /*********************************************************************/ diff --git a/src/channel.c b/src/channel.c index 3bf5c5042..d4a46ffed 100644 --- a/src/channel.c +++ b/src/channel.c @@ -172,19 +172,7 @@ int ci_putblk(struct channel *chn, const char *blk, int len) memcpy(c_orig(chn), blk + max, len - max); b_add(&chn->buf, len); - chn->total += len; - if (chn->to_forward) { - unsigned long fwd = len; - if (chn->to_forward != CHN_INFINITE_FORWARD) { - if (fwd > chn->to_forward) - fwd = chn->to_forward; - chn->to_forward -= fwd; - } - c_adv(chn, fwd); - } - - /* notify that some data was read from the SI into the buffer */ - chn->flags |= CF_READ_PARTIAL; + channel_add_input(chn, len); return len; }