struct h3s *h3s = qcs->ctx;
struct h3c *h3c = h3s->h3c;
ssize_t total = 0, ret = 0;
- uint64_t prev_data_len = ((h3s->flags & H3_SF_HAVE_CLEN) ? h3s->body_len : h3s->data_len);
TRACE_ENTER(H3_EV_RX_FRAME, qcs->qcc->conn, qcs);
total += hlen;
TRACE_PROTO("parsing a new frame", H3_EV_RX_FRAME, qcs->qcc->conn, qcs);
- /* Check that content-length is not exceeded on a new DATA frame. */
if (ftype == H3_FT_DATA) {
h3s->data_len += flen;
- if (h3s->flags & H3_SF_HAVE_CLEN && h3_check_body_size(qcs, (fin && flen == b_data(b))))
- break;
+
+ if (h3s->flags & H3_SF_HAVE_CLEN) {
+ /* Check that content-length is not exceeded by a new DATA frame.
+ * Error immediately set by the following function if necessary.
+ */
+ if (h3_check_body_size(qcs, (fin && flen == b_data(b))))
+ break;
+ }
+ else {
+ /* content-length not present, update estimated payload length. */
+ qcs->sd->kip = h3s->data_len;
+ }
}
if ((ret = h3_check_frame_valid(h3c, qcs, ftype))) {
qcs->flags &= ~QC_SF_EOI_SUSPENDED;
}
}
+
+ /* Update estimated payload with content-length value if present. */
+ if (h3s->flags & H3_SF_HAVE_CLEN)
+ qcs->sd->kip = h3s->body_len;
}
else {
ret = h3_trailers_to_htx(qcs, b, flen, last_stream_frame);
*/
done:
- qcs->sd->kip += ((h3s->flags & H3_SF_HAVE_CLEN) ? h3s->body_len : h3s->data_len) - prev_data_len;
-
TRACE_LEAVE(H3_EV_RX_FRAME, qcs->qcc->conn, qcs);
return total;