/* other flags */
#define QC_CF_IS_BACK 0x00008000 // this is an outgoing connection
+#define QC_CF_CC_RECV 0x00010000 // CONNECTION_CLOSE received
+
extern struct pool_head *pool_head_qcs;
/* Stream types */
struct qcc *qcc = qcs->qcc;
TRACE_ENTER(QC_EV_STRM_END, qcs ? qcs->qcc->conn : NULL, qcs);
- if (b_data(&qcs->tx.buf) || b_data(&qcs->tx.xprt_buf)) {
+ if (b_data(&qcs->tx.buf) ||
+ (b_data(&qcs->tx.xprt_buf) && !(qcc->flags & QC_CF_CC_RECV))) {
qcs->flags |= QC_SF_DETACH;
goto out;
}
qcs_destroy(qcs);
- if (qcc_is_dead(qcc))
+ if (qcc_is_dead(qcc)) {
qc_release(qcc);
+ TRACE_LEAVE(QC_EV_STRM_END, NULL);
+ return;
+ }
out:
TRACE_LEAVE(QC_EV_STRM_END, qcs ? qcs->qcc->conn : NULL);
break;
case QUIC_FT_CONNECTION_CLOSE:
case QUIC_FT_CONNECTION_CLOSE_APP:
+ conn->qcc->flags |= QC_CF_CC_RECV;
break;
case QUIC_FT_HANDSHAKE_DONE:
if (objt_listener(ctx->conn->target))