diff --git a/include/haproxy/stconn-t.h b/include/haproxy/stconn-t.h index ce06a5cce..30f468ad7 100644 --- a/include/haproxy/stconn-t.h +++ b/include/haproxy/stconn-t.h @@ -37,6 +37,7 @@ enum iobuf_flags { IOBUF_FL_INTERIM_FF = 0x00000008, /* Producer side warn it will immediately retry a fast-forward. * .done_fastfwd() on consumer side must take care of this flag */ + IOBUF_FL_EOI = 0x00000010, /* A EOI was encountered on producer side */ }; struct iobuf { diff --git a/src/mux_h1.c b/src/mux_h1.c index b022c0d01..51854f28a 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -4720,6 +4720,11 @@ static int h1_fastfwd(struct stconn *sc, unsigned int count, unsigned int flags) sdo->iobuf.flags &= ~IOBUF_FL_INTERIM_FF; + if (se_fl_test(h1s->sd, SE_FL_EOI)) { + sdo->iobuf.flags |= IOBUF_FL_EOI; /* TODO: it may be good to have a flag to be sure we can + * forward the EOI the to consumer side + */ + } se_done_ff(sdo); ret = total; diff --git a/src/mux_h2.c b/src/mux_h2.c index ab5e3cf60..024f379ea 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -7041,21 +7041,8 @@ static size_t h2_done_ff(struct stconn *sc) goto end; head = b_peek(mbuf, b_data(mbuf) - sd->iobuf.data); - /* FIXME: Must be handled with a flag. It is just a temporary hack */ - { - struct xref *peer; - struct sedesc *sdo; - - peer = xref_get_peer_and_lock(&h2s->sd->xref); - if (!peer) - goto end; - - sdo = container_of(peer, struct sedesc, xref); - xref_unlock(&h2s->sd->xref, peer); - - if (se_fl_test(sdo, SE_FL_EOI)) - h2s->flags &= ~H2_SF_MORE_HTX_DATA; - } + if (sd->iobuf.flags & IOBUF_FL_EOI) + h2s->flags &= ~H2_SF_MORE_HTX_DATA; if (!(sd->iobuf.flags & IOBUF_FL_FF_BLOCKED) && !(h2s->flags & H2_SF_BLK_SFCTL) &&