diff --git a/src/mux_h2.c b/src/mux_h2.c index 57f1dfe0a..43248f2cb 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -2086,6 +2086,15 @@ static int h2_wake(struct connection *conn) { struct h2c *h2c = conn->mux_ctx; + /* + * If we received early data, try to wake any stream, just in case + * at least one of them was waiting for the handshake + */ + if ((conn->flags & (CO_FL_EARLY_SSL_HS | CO_FL_EARLY_DATA | CO_FL_HANDSHAKE)) == + CO_FL_EARLY_DATA) { + h2_wake_some_streams(h2c, 0, 0); + conn->flags &= ~CO_FL_EARLY_DATA; + } if (conn->flags & CO_FL_ERROR || conn_xprt_read0_pending(conn) || h2c->st0 == H2_CS_ERROR2 || h2c->flags & H2_CF_GOAWAY_FAILED || (eb_is_empty(&h2c->streams_by_id) && h2c->last_sid >= 0 && diff --git a/src/mux_pt.c b/src/mux_pt.c index cd3a28b42..71bb47775 100644 --- a/src/mux_pt.c +++ b/src/mux_pt.c @@ -51,6 +51,12 @@ static int mux_pt_wake(struct connection *conn) ret = cs->data_cb->wake ? cs->data_cb->wake(cs) : 0; + /* If we had early data, and we're done with the handshake + * then whe know the data are safe, and we can remove the flag. + */ + if ((conn->flags & (CO_FL_EARLY_DATA | CO_FL_EARLY_SSL_HS | CO_FL_HANDSHAKE)) == + CO_FL_EARLY_DATA) + conn->flags &= ~CO_FL_EARLY_DATA; if (ret >= 0) cs_update_mux_polling(cs); return ret; diff --git a/src/stream_interface.c b/src/stream_interface.c index c2e3fffd4..6f9f27b98 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -585,7 +585,6 @@ static int si_cs_wake_cb(struct conn_stream *cs) * the handshake. */ if ((conn->flags & (CO_FL_EARLY_DATA | CO_FL_EARLY_SSL_HS)) == CO_FL_EARLY_DATA) { - conn->flags &= ~CO_FL_EARLY_DATA; task_wakeup(si_task(si), TASK_WOKEN_MSG); }