int smallbuf = 1;
int ret, err, hdr;
+ TRACE_ENTER(H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
+
hdr = 0;
sl = NULL;
for (blk = htx_get_head_blk(htx); blk; blk = htx_get_next_blk(htx, blk)) {
break;
case HTX_BLK_HDR:
- if (unlikely(hdr >= sizeof(list) / sizeof(list[0]) - 1))
+ if (unlikely(hdr >= sizeof(list) / sizeof(list[0]) - 1)) {
+ TRACE_ERROR("too many headers", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
goto err;
+ }
list[hdr].n = htx_get_blk_name(htx, blk);
list[hdr].v = htx_get_blk_value(htx, blk);
res = smallbuf ? qcc_get_stream_txbuf(qcs, &err, 1) :
qcc_realloc_stream_txbuf(qcs);
if (!res) {
- if (err)
+ if (err) {
+ TRACE_ERROR("cannot allocate Tx buffer", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
goto err;
+ }
+ TRACE_STATE("buf window full", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
goto end;
}
/* Start the headers after frame type + length */
headers_buf = b_make(b_tail(res) + 5, b_contig_space(res) - 5, 0, 0);
+ TRACE_DATA("encoding HEADERS frame", H3_EV_TX_FRAME|H3_EV_TX_HDR,
+ qcs->qcc->conn, qcs);
if (qpack_encode_field_section_line(&headers_buf))
goto err_full;
}
end:
+ TRACE_LEAVE(H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
return ret;
err_full:
if (smallbuf) {
+ TRACE_DEVEL("retry with a full buffer", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
smallbuf = 0;
goto retry;
}
err:
+ TRACE_DEVEL("leaving on error", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
return -1;
}