MINOR: stream: Pass an optional input buffer when a stream is created

It is now possible to set the buffer used by the channel request buffer when
a stream is created. It may be useful if input data are already received,
instead of waiting the first call to the mux rcv_buf() callback. This change
is mandatory to support H1 connection with no stream attached.

For now, the multiplexers don't pass any buffer. BUF_NULL is thus used to
call stream_create_from_cs().
diff --git a/src/flt_spoe.c b/src/flt_spoe.c
index 58a7e79..2de26b4 100644
--- a/src/flt_spoe.c
+++ b/src/flt_spoe.c
@@ -1983,7 +1983,7 @@
 	if (!sess)
 		goto out_free_spoe;
 
-	if ((strm = stream_new(sess, &appctx->obj_type)) == NULL)
+	if ((strm = stream_new(sess, &appctx->obj_type, &BUF_NULL)) == NULL)
 		goto out_free_sess;
 
 	stream_set_backend(strm, conf->agent->b.be);
diff --git a/src/hlua.c b/src/hlua.c
index fbccaaa..b613825 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -2843,7 +2843,7 @@
 		goto out_fail_sess;
 	}
 
-	strm = stream_new(sess, &appctx->obj_type);
+	strm = stream_new(sess, &appctx->obj_type, &BUF_NULL);
 	if (!strm) {
 		hlua_pusherror(L, "socket: out of memory");
 		goto out_fail_stream;
diff --git a/src/mux_h1.c b/src/mux_h1.c
index fc4fde7..e2c9693 100644
--- a/src/mux_h1.c
+++ b/src/mux_h1.c
@@ -508,7 +508,7 @@
 	return b_data(&h1s->h1c->ibuf);
 }
 
-static struct conn_stream *h1s_new_cs(struct h1s *h1s)
+static struct conn_stream *h1s_new_cs(struct h1s *h1s, struct buffer *input)
 {
 	struct conn_stream *cs;
 
@@ -529,10 +529,11 @@
 		cs->flags |= CS_FL_MAY_SPLICE;
 	}
 
-	if (stream_create_from_cs(cs) < 0) {
+	if (stream_create_from_cs(cs, input) < 0) {
 		TRACE_DEVEL("leaving on stream creation failure", H1_EV_STRM_NEW|H1_EV_STRM_END|H1_EV_STRM_ERR, h1s->h1c->conn, h1s);
 		goto err;
 	}
+	*input = BUF_NULL;
 
 	TRACE_LEAVE(H1_EV_STRM_NEW, h1s->h1c->conn, h1s);
 	return cs;
@@ -597,7 +598,7 @@
 		h1s->cs = cs;
 	}
 	else {
-		cs = h1s_new_cs(h1s);
+		cs = h1s_new_cs(h1s, &BUF_NULL);
 		if (!cs)
 			goto fail;
 	}
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 741708d..75874a3 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -1483,7 +1483,7 @@
 	cs->ctx = h2s;
 	h2c->nb_cs++;
 
-	if (stream_create_from_cs(cs) < 0)
+	if (stream_create_from_cs(cs, &BUF_NULL) < 0)
 		goto out_free_cs;
 
 	/* We want the accept date presented to the next stream to be the one
diff --git a/src/mux_pt.c b/src/mux_pt.c
index 57c1b9e..3161d16 100644
--- a/src/mux_pt.c
+++ b/src/mux_pt.c
@@ -112,7 +112,7 @@
 		if (!cs)
 			goto fail_free_ctx;
 
-		if (stream_create_from_cs(cs) < 0)
+		if (stream_create_from_cs(cs, &BUF_NULL) < 0)
 			goto fail_free;
 
 	}
diff --git a/src/peers.c b/src/peers.c
index abc2c59..b5c1d42 100644
--- a/src/peers.c
+++ b/src/peers.c
@@ -2675,7 +2675,7 @@
 		goto out_free_appctx;
 	}
 
-	if ((s = stream_new(sess, &appctx->obj_type)) == NULL) {
+	if ((s = stream_new(sess, &appctx->obj_type, &BUF_NULL)) == NULL) {
 		ha_alert("Failed to initialize stream in peer_session_create().\n");
 		goto out_free_sess;
 	}
diff --git a/src/sink.c b/src/sink.c
index a7f6897..35bf770 100644
--- a/src/sink.c
+++ b/src/sink.c
@@ -640,7 +640,7 @@
 		goto out_free_appctx;
 	}
 
-	if ((s = stream_new(sess, &appctx->obj_type)) == NULL) {
+	if ((s = stream_new(sess, &appctx->obj_type, &BUF_NULL)) == NULL) {
 		ha_alert("Failed to initialize stream in peer_session_create().\n");
 		goto out_free_sess;
 	}
diff --git a/src/stream.c b/src/stream.c
index abef210..0ca54af 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -269,11 +269,11 @@
  * valid right after the handshake, before the connection's data layer is
  * initialized, because it relies on the session to be in conn->owner.
  */
-int stream_create_from_cs(struct conn_stream *cs)
+int stream_create_from_cs(struct conn_stream *cs, struct buffer *input)
 {
 	struct stream *strm;
 
-	strm = stream_new(cs->conn->owner, &cs->obj_type);
+	strm = stream_new(cs->conn->owner, &cs->obj_type, input);
 	if (strm == NULL)
 		return -1;
 
@@ -313,9 +313,11 @@
  * end point is assigned to <origin>, which must be valid. The stream's task
  * is configured with a nice value inherited from the listener's nice if any.
  * The task's context is set to the new stream, and its function is set to
- * process_stream(). Target and analysers are null.
+ * process_stream(). Target and analysers are null. <input> is always used as
+ * Input buffer and may contain data. It is the caller responsibility to not
+ * reuse it anymore. <input> may point on BUF_NULL.
  */
-struct stream *stream_new(struct session *sess, enum obj_type *origin)
+struct stream *stream_new(struct session *sess, enum obj_type *origin, struct buffer *input)
 {
 	struct stream *s;
 	struct task *t;
@@ -405,8 +407,6 @@
 	 * when the default backend is assigned.
 	 */
 	s->be  = sess->fe;
-	s->req.buf = BUF_NULL;
-	s->res.buf = BUF_NULL;
 	s->req_cap = NULL;
 	s->res_cap = NULL;
 
@@ -462,7 +462,7 @@
 	/* init store persistence */
 	s->store_count = 0;
 
-	channel_init(&s->req);
+	channel_init(&s->req, input);
 	s->req.flags |= CF_READ_ATTACHED; /* the producer is already connected */
 	s->req.analysers = sess->listener ? sess->listener->analysers : 0;
 
@@ -477,7 +477,7 @@
 	s->req.wex = TICK_ETERNITY;
 	s->req.analyse_exp = TICK_ETERNITY;
 
-	channel_init(&s->res);
+	channel_init(&s->res, &BUF_NULL);
 	s->res.flags |= CF_ISRESP;
 	s->res.analysers = 0;