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.
diff --git a/include/types/channel.h b/include/types/channel.h
index 7622ce8..2d79c11 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 9ba0eb5..a1bcbb9 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -5382,6 +5382,7 @@
}
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 @@
}
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 8fba981..1d216ae 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -530,7 +530,7 @@
(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 @@
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