BUG/MINOR: stream-int: avoid calling rcv_buf() when splicing is still possible

In si_cs_recv(), we can end up with a partial splice() call that will be
followed by an attempt to us rcv_buf(). Sometimes this works and places
data into the buffer, which then prevent splicing from being used, and
this causes splice() and recvfrom() calls to alternate. Better simply
refrain from calling rcv_buf() when there are data in the pipe and still
data to be forwarded. Usually this indicates that we've ate everything
available and that we still want to use splice() on subsequent calls.

This should be backported to 2.1 and 2.0.

(cherry picked from commit c640ef1a7de5d13504599f85ca3cf3c282128a05)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit dd2efd48d5c408ebc66e195c867378444acb4f4a)
Signed-off-by: Willy Tarreau <w@1wt.eu>
diff --git a/src/stream_interface.c b/src/stream_interface.c
index 0669546..91b2d1a 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -1332,6 +1332,13 @@
 		ic->pipe = NULL;
 	}
 
+	if (ic->pipe && ic->to_forward && !(flags & CO_RFL_BUF_FLUSH)) {
+		/* don't break splicing by reading, but still call rcv_buf()
+		 * to pass the flag.
+		 */
+		goto done_recv;
+	}
+
 	/* now we'll need a input buffer for the stream */
 	if (!si_alloc_ibuf(si, &(si_strm(si)->buffer_wait)))
 		goto end_recv;