MINOR: applet: replace cs_applet_shut() with appctx_shut()

The former takes a conn_stream still attached to a valid appctx,
which also complicates the termination of the applet. Instead, let's
pass the appctx which already points to the endpoint, this allows us
to properly detach the conn_stream before the call, which is cleaner
and safer.
diff --git a/include/haproxy/applet.h b/include/haproxy/applet.h
index f646a05..fdfc1ee 100644
--- a/include/haproxy/applet.h
+++ b/include/haproxy/applet.h
@@ -37,6 +37,7 @@
 struct task *task_run_applet(struct task *t, void *context, unsigned int state);
 int appctx_buf_available(void *arg);
 void *applet_reserve_svcctx(struct appctx *appctx, size_t size);
+void appctx_shut(struct appctx *appctx);
 
 struct appctx *appctx_new(struct applet *applet, struct cs_endpoint *endp);
 
diff --git a/src/applet.c b/src/applet.c
index 9149af4..35fd8e1 100644
--- a/src/applet.c
+++ b/src/applet.c
@@ -93,6 +93,20 @@
 	return appctx->svcctx;
 }
 
+/* call the applet's release() function if any, and marks the endp as shut.
+ * Needs to be called upon close().
+ */
+void appctx_shut(struct appctx *appctx)
+{
+	if (appctx->endp->flags & (CS_EP_SHR|CS_EP_SHW))
+		return;
+
+	if (appctx->applet->release)
+		appctx->applet->release(appctx);
+
+	appctx->endp->flags |= CS_EP_SHRR | CS_EP_SHWN;
+}
+
 /* Callback used to wake up an applet when a buffer is available. The applet
  * <appctx> is woken up if an input buffer was requested for the associated
  * conn-stream. In this case the buffer is immediately allocated and the
diff --git a/src/conn_stream.c b/src/conn_stream.c
index 819f2cb..ff8704f 100644
--- a/src/conn_stream.c
+++ b/src/conn_stream.c
@@ -388,11 +388,11 @@
 	else if (cs->endp->flags & CS_EP_T_APPLET) {
 		struct appctx *appctx = __cs_appctx(cs);
 
-		cs_applet_shut(cs);
 		cs->endp->flags |= CS_EP_ORPHAN;
 		cs->endp->cs = NULL;
-		appctx_free(appctx);
 		cs->endp = NULL;
+		appctx_shut(appctx);
+		appctx_free(appctx);
 	}
 
 	if (cs->endp) {
@@ -514,20 +514,6 @@
 	return appctx;
 }
 
-/* call the applet's release function if any. Needs to be called upon close() */
-void cs_applet_shut(struct conn_stream *cs)
-{
-	struct appctx *appctx = __cs_appctx(cs);
-
-	if (cs->endp->flags & (CS_EP_SHR|CS_EP_SHW))
-		return;
-
-	if (appctx->applet->release)
-		appctx->applet->release(appctx);
-
-	cs->endp->flags |= CS_EP_SHRR | CS_EP_SHWN;
-}
-
 /*
  * This function performs a shutdown-read on a detached conn-stream in a
  * connected or init state (it does nothing for other states). It either shuts
@@ -922,7 +908,7 @@
 		return;
 
 	if (cs_oc(cs)->flags & CF_SHUTW) {
-		cs_applet_shut(cs);
+		appctx_shut(__cs_appctx(cs));
 		cs->state = CS_ST_DIS;
 		__cs_strm(cs)->conn_exp = TICK_ETERNITY;
 	}
@@ -980,7 +966,7 @@
 	case CS_ST_QUE:
 	case CS_ST_TAR:
 		/* Note that none of these states may happen with applets */
-		cs_applet_shut(cs);
+		appctx_shut(__cs_appctx(cs));
 		cs->state = CS_ST_DIS;
 		/* fall through */
 	default: