BUG/MEDIUM: h2: restart demuxing after releasing buffer space

Since the connection changes in 1.9, some breakage happened to the H2 mux
whose initial design was heavily relying on the fact that connection-level
functions were woken up after data were transferred to the stream layer.

We need to wake the demux up after receiving such data if the demux is
blocked. This at least allows to receive POSTs again. One issue remains,
it looks like the end of the uploaded data is silently discarded if the
server responds before the end of the transfer (H2 in half-closed(local)
state), which doesn't happen with 1.8.14 and nghttp as the client.

No backport is needed.
This commit is contained in:
Willy Tarreau 2018-11-25 08:03:32 +01:00
parent 1ed87b77b4
commit 082f559d36
1 changed files with 10 additions and 0 deletions

View File

@ -3582,6 +3582,7 @@ static int h2_unsubscribe(struct conn_stream *cs, int event_type, void *param)
static size_t h2_rcv_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags) static size_t h2_rcv_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags)
{ {
struct h2s *h2s = cs->ctx; struct h2s *h2s = cs->ctx;
struct h2c *h2c = h2s->h2c;
size_t ret = 0; size_t ret = 0;
/* transfer possibly pending data to the upper layer */ /* transfer possibly pending data to the upper layer */
@ -3599,6 +3600,15 @@ static size_t h2_rcv_buf(struct conn_stream *cs, struct buffer *buf, size_t coun
} }
} }
if (ret && h2c->dsi == h2s->id) {
/* demux is blocking on this stream's buffer */
h2c->flags &= ~H2_CF_DEM_SFULL;
if (!(h2c->wait_event.wait_reason & SUB_CAN_RECV)) {
if (h2_recv_allowed(h2c))
tasklet_wakeup(h2c->wait_event.task);
}
}
return ret; return ret;
} }