]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: channel: Report EOI on the input channel if it was reached in the mux
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 22 Mar 2019 13:16:14 +0000 (14:16 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 25 Mar 2019 05:24:43 +0000 (06:24 +0100)
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
src/proto_http.c
src/stream_interface.c

index 7622ce8f44bfe333549a4df0c94217e00c585926..2d79c11f7542756cb0092c91afc6acaa8283a565 100644 (file)
 
 #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 */
index 9ba0eb594d8b28e677c4f1a13557ed3fd484d83b..a1bcbb923a95c2ccc548a0b2a11885087efb6dec 100644 (file)
@@ -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. */
index 8fba981876e679646e6210bca8237b4d8753682a..1d216ae647ff33c175dd44680bd165b2f4d0663d 100644 (file)
@@ -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