MEDIUM: stream-int: make SI_FL_WANT_PUT reflect CF_DONT_READ

When CF_DONT_READ is set, till now we used to set SI_FL_WAIT_ROOM, which
is not appropriate since it would lose the subscribe status. Instead let's
clear SI_FL_WANT_PUT (just like applets do), and set the flag only when
CF_DONT_READ is cleared.

We have to do this in stream_int_update(), and in si_cs_io_cb() after
returning from si_cs_recv() since it would be a bit invasive to hack
this one for now. It must not be done in stream_int_notify() otherwise
it would re-enable blocked applets.

Last, when si_chk_rcv() is called, it immediately clears the flag before
calling ->chk_rcv() so that we are not tempted to uselessly loop on the
same call until the receive function is called. This is the same principle
as what is done with the applet scheduler.
diff --git a/include/proto/stream_interface.h b/include/proto/stream_interface.h
index 1a70536..c0f7cda 100644
--- a/include/proto/stream_interface.h
+++ b/include/proto/stream_interface.h
@@ -399,6 +399,7 @@
 	if (si->state > SI_ST_EST)
 		return;
 
+	si->flags &= ~SI_FL_WANT_PUT;
 	si->ops->chk_rcv(si);
 }
 
diff --git a/src/stream_interface.c b/src/stream_interface.c
index adbdfa8..3372fc2 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -248,9 +248,6 @@
 		__FUNCTION__,
 		si, si->state, ic->flags, si_oc(si)->flags);
 
-	if (ic->flags & (CF_SHUTR|CF_DONT_READ))
-		return;
-
 	if (!channel_may_recv(ic) || ic->pipe) {
 		/* stop reading */
 		si->flags |= SI_FL_WAIT_ROOM;
@@ -728,8 +725,11 @@
 
 	if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && co_data(si_oc(si)))
 		ret = si_cs_send(cs);
-	if (!(si->wait_event.wait_reason & SUB_CAN_RECV))
+	if (!(si->wait_event.wait_reason & SUB_CAN_RECV)) {
 		ret |= si_cs_recv(cs);
+		if (!(si_ic(si)->flags & (CF_SHUTR|CF_DONT_READ)))
+			si->flags |= SI_FL_WANT_PUT;
+	}
 	if (ret != 0)
 		si_cs_process(cs);
 
@@ -750,6 +750,9 @@
 	struct channel *oc = si_oc(si);
 
 	if (!(ic->flags & CF_SHUTR)) {
+		if (!(ic->flags & CF_DONT_READ))
+			si_want_put(si);
+
 		/* Read not closed, update FD status and timeout for reads */
 		if ((ic->flags & CF_DONT_READ) || !channel_may_recv(ic)) {
 			/* stop reading */
@@ -960,10 +963,7 @@
 {
 	struct channel *ic = si_ic(si);
 
-	if (ic->flags & CF_SHUTR)
-		return;
-
-	if ((ic->flags & CF_DONT_READ) || !channel_may_recv(ic)) {
+	if (!channel_may_recv(ic)) {
 		/* stop reading */
 		si->flags |= SI_FL_WAIT_ROOM;
 	}
@@ -1498,9 +1498,6 @@
 		__FUNCTION__,
 		si, si->state, ic->flags, si_oc(si)->flags);
 
-	if (ic->flags & (CF_SHUTR|CF_DONT_READ))
-		return;
-
 	if (channel_may_recv(ic) && !ic->pipe) {
 		/* (re)start reading */
 		appctx_wakeup(si_appctx(si));