From 297d3e2e0f8f02636b9d58c40d7cab56a385f512 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Fri, 22 Mar 2019 14:16:14 +0100 Subject: [PATCH] MINOR: channel: Report EOI on the input channel if it was reached in the mux The flag CF_EOI is now set on the input channel when the flag CS_FL_EOI is set on the corresponding conn_stream. In addition, if a read activity is reported when this flag is set, the stream is woken up. This patch should be backported to 1.9. --- include/types/channel.h | 2 +- src/proto_http.c | 3 +++ src/stream_interface.c | 6 +++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/include/types/channel.h b/include/types/channel.h index 7622ce8f4..2d79c11f7 100644 --- a/include/types/channel.h +++ b/include/types/channel.h @@ -117,7 +117,7 @@ #define CF_WAKE_ONCE 0x10000000 /* pretend there is activity on this channel (one-shoot) */ #define CF_FLT_ANALYZE 0x20000000 /* at least one filter is still analyzing this channel */ -/* unused: 0x40000000 */ +#define CF_EOI 0x40000000 /* end-of-input has been reached */ #define CF_ISRESP 0x80000000 /* 0 = request channel, 1 = response channel */ /* Masks which define input events for stream analysers */ diff --git a/src/proto_http.c b/src/proto_http.c index 9ba0eb594..a1bcbb923 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -5382,6 +5382,7 @@ int http_msg_forward_body(struct stream *s, struct http_msg *msg) } msg->msg_state = HTTP_MSG_ENDING; + chn->flags |= CF_EOI; ending: /* we may have some pending data starting at res->buf.p such as a last @@ -5517,6 +5518,8 @@ int http_msg_forward_chunked_body(struct stream *s, struct http_msg *msg) } msg->msg_state = HTTP_MSG_ENDING; + chn->flags |= CF_EOI; + ending: /* we may have some pending data starting at res->buf.p such as a last * chunk of data or trailers. */ diff --git a/src/stream_interface.c b/src/stream_interface.c index 8fba98187..1d216ae64 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -530,7 +530,7 @@ static void stream_int_notify(struct stream_interface *si) (si->state != SI_ST_EST && si->state != SI_ST_CON) || (si->flags & SI_FL_ERR) || ((ic->flags & CF_READ_PARTIAL) && - (!ic->to_forward || sio->state != SI_ST_EST)) || + ((ic->flags & CF_EOI) || !ic->to_forward || sio->state != SI_ST_EST)) || /* changes on the consumption side */ (oc->flags & (CF_WRITE_NULL|CF_WRITE_ERROR)) || @@ -604,6 +604,10 @@ static int si_cs_process(struct conn_stream *cs) si->flags |= SI_FL_READ_NULL; ic->flags |= CF_READ_NULL; } + /* Report EOI on the channel if it was reached from the mux point of + * view. */ + if ((cs->flags & CS_FL_EOI) && !(ic->flags & CF_EOI)) + ic->flags |= CF_EOI; /* Second step : update the stream-int and channels, try to forward any * pending data, then possibly wake the stream up based on the new