MINOR: conn-stream: Release a CS when both app and endp are detached

cs_detach_app() function is added to detach an app from a conn-stream. And
now, both cs_detach_app() and cs_detach_endp() release the conn-stream when
both the app and the endpoint are detached.
diff --git a/include/haproxy/conn_stream.h b/include/haproxy/conn_stream.h
index 5be833d..fa0959c 100644
--- a/include/haproxy/conn_stream.h
+++ b/include/haproxy/conn_stream.h
@@ -39,6 +39,7 @@
 void cs_attach_endp(struct conn_stream *cs, enum obj_type *endp, void *ctx);
 int cs_attach_app(struct conn_stream *cs, enum obj_type *app);
 void cs_detach_endp(struct conn_stream *cs);
+void cs_detach_app(struct conn_stream *cs);
 
 /*
  * Initializes all required fields for a new conn_strema.
diff --git a/src/conn_stream.c b/src/conn_stream.c
index 0c7bf9b..f0b06c6 100644
--- a/src/conn_stream.c
+++ b/src/conn_stream.c
@@ -133,11 +133,27 @@
 		appctx_free(appctx);
 	}
 
-	/* Rest CS */
+	/* FIXME: Rest CS for now but must be reviewed. CS flags are only
+	 *        connection related for now but this will evolved
+	 */
 	cs->flags = CS_FL_NONE;
 	cs->end = NULL;
 	cs->ctx = NULL;
 	if (cs->si)
 		cs->si->ops = &si_embedded_ops;
 	cs->data_cb = NULL;
+
+	if (cs->app == NULL)
+		cs_free(cs);
+}
+
+void cs_detach_app(struct conn_stream *cs)
+{
+	si_free(cs->si);
+	cs->app = NULL;
+	cs->si  = NULL;
+	cs->data_cb = NULL;
+
+	if (cs->end == NULL)
+		cs_free(cs);
 }