h2s->st = H2_SS_OPEN;
h2s->flags |= flags;
h2s->body_len = body_len;
+ if (h2s->flags & H2_SF_DATA_CLEN)
+ h2s->sd->kip = h2s->body_len;
h2s_propagate_term_flags(h2c, h2s);
done:
goto fail;
}
+ if (h2s->flags & H2_SF_DATA_CLEN)
+ h2s->sd->kip = h2s->body_len;
+
if (se_fl_test(h2s->sd, SE_FL_ERROR) && h2s->st < H2_SS_ERROR)
h2s->st = H2_SS_ERROR;
else if (h2s->flags & H2_SF_ES_RCVD) {
struct htx_ret htxret;
size_t ret = 0;
uint prev_h2c_flags = h2c->flags;
+ unsigned long long prev_body_len = h2s->body_len;
TRACE_ENTER(H2_EV_STRM_RECV, h2c->conn, h2s);
ret -= h2s_htx->data;
end:
+ /* If ther is no content-length, take care to update <kip> field */
+ if (!(h2s->flags & H2_SF_DATA_CLEN))
+ h2s->sd->kip += prev_body_len - h2s->body_len;
+
/* release the rxbuf if it's not used anymore */
if (rxbuf && !b_data(rxbuf) && b_size(rxbuf)) {
BUG_ON_HOT(rxbuf != _h2s_rxbuf_head(h2s));