static int h3_resp_headers_send(struct qcs *qcs, struct htx *htx)
{
int err;
- struct h3s *h3s = qcs->ctx;
- struct h3c *h3c = h3s->h3c;
struct buffer outbuf;
struct buffer headers_buf = BUF_NULL;
struct buffer *res;
else if (type == HTX_BLK_HDR) {
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);
- h3c->err = H3_ERR_INTERNAL_ERROR;
goto err;
}
list[hdr].n = htx_get_blk_name(htx, blk);
if (!(res = qcc_get_stream_txbuf(qcs, &err))) {
if (err) {
TRACE_ERROR("cannot allocate Tx buffer", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
- h3c->err = H3_ERR_INTERNAL_ERROR;
goto err;
}
ABORT_NOW();
if (qpack_encode_int_status(&headers_buf, status)) {
TRACE_ERROR("invalid status code", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
- h3c->err = H3_ERR_INTERNAL_ERROR;
goto err;
}
static int h3_resp_trailers_send(struct qcs *qcs, struct htx *htx)
{
int err;
- struct h3s *h3s = qcs->ctx;
- struct h3c *h3c = h3s->h3c;
struct buffer headers_buf = BUF_NULL;
struct buffer *res;
struct http_hdr list[global.tune.max_http_hdr];
if (type == HTX_BLK_TLR) {
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);
- h3c->err = H3_ERR_INTERNAL_ERROR;
goto err;
}
list[hdr].n = htx_get_blk_name(htx, blk);
}
else {
TRACE_ERROR("unexpected HTX block", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
- h3c->err = H3_ERR_INTERNAL_ERROR;
goto err;
}
}
if (!(res = qcc_get_stream_txbuf(qcs, &err))) {
if (err) {
TRACE_ERROR("cannot allocate Tx buffer", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
- h3c->err = H3_ERR_INTERNAL_ERROR;
goto err;
}
struct buffer *buf, size_t count)
{
int err;
- struct h3s *h3s = qcs->ctx;
- struct h3c *h3c = h3s->h3c;
struct buffer outbuf;
struct buffer *res;
size_t total = 0;
if (!(res = qcc_get_stream_txbuf(qcs, &err))) {
if (err) {
TRACE_ERROR("cannot allocate Tx buffer", H3_EV_TX_FRAME|H3_EV_TX_DATA, qcs->qcc->conn, qcs);
- h3c->err = H3_ERR_INTERNAL_ERROR;
goto err;
}
static size_t h3_snd_buf(struct qcs *qcs, struct buffer *buf, size_t count)
{
- struct h3s *h3s = qcs->ctx;
- struct h3c *h3c = h3s->h3c;
size_t total = 0;
enum htx_blk_type btype;
struct htx *htx;
htx = htx_from_buf(buf);
- while (count && !htx_is_empty(htx) && qcc_stream_can_send(qcs) &&
- !h3c->err) {
-
+ while (count && !htx_is_empty(htx) && qcc_stream_can_send(qcs) && ret >= 0) {
idx = htx_get_head(htx);
blk = htx_get_blk(htx, idx);
btype = htx_get_blk_type(blk);
count -= bsize;
break;
}
-
- /* If an error occurred, connection error must be set to break from the current loop. */
- BUG_ON(ret < 0 && !h3c->err);
}
- /* Interrupt sending on connection error. */
- if (unlikely(h3c->err)) {
- qcc_set_error(qcs->qcc, h3c->err, 1);
+ /* Interrupt sending on fatal error. */
+ if (unlikely(ret < 0)) {
+ qcc_set_error(qcs->qcc, H3_ERR_INTERNAL_ERROR, 1);
goto out;
}