MEDIUM: muxes: Add an optional input buffer during mux initialization

The mux's callback init() now take a pointer to a buffer as extra argument. It
must be used by the multiplexer as its input buffer. This buffer is always NULL
when a multiplexer is initialized with a fresh connection. But if a mux upgrade
is performed, it may be filled with existing data. Note that, for now, mux
upgrades are not supported. But this commit is mandatory to do so.
diff --git a/src/mux_h1.c b/src/mux_h1.c
index a40ef3f..50afbc2 100644
--- a/src/mux_h1.c
+++ b/src/mux_h1.c
@@ -356,11 +356,15 @@
 }
 
 /*
- * Initialize the mux once it's attached. It is expected that conn->ctx
- * points to the existing conn_stream (for outgoing connections) or NULL (for
- * incoming ones). Returns < 0 on error.
+ * Initialize the mux once it's attached. It is expected that conn->ctx points
+ * to the existing conn_stream (for outgoing connections or for incoming onces
+ * during a mux upgrade) or NULL (for incoming ones during the connexion
+ * establishment). <input> is always used as Input buffer and may contain
+ * data. It is the caller responsibility to not reuse it anymore. Returns < 0 on
+ * error.
  */
-static int h1_init(struct connection *conn, struct proxy *proxy, struct session *sess)
+static int h1_init(struct connection *conn, struct proxy *proxy, struct session *sess,
+		   struct buffer *input)
 {
 	struct h1c *h1c;
 	struct task *t = NULL;
@@ -372,10 +376,10 @@
 	h1c->px   = proxy;
 
 	h1c->flags = H1C_F_NONE;
-	h1c->ibuf  = BUF_NULL;
+	h1c->ibuf  = *input;
 	h1c->obuf  = BUF_NULL;
 	h1c->h1s   = NULL;
-	h1c->task = NULL;
+	h1c->task  = NULL;
 
 	LIST_INIT(&h1c->buf_wait.list);
 	h1c->wait_event.task = tasklet_new();
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 5448ea8..e440424 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -472,10 +472,12 @@
 
 /* Initialize the mux once it's attached. For outgoing connections, the context
  * is already initialized before installing the mux, so we detect incoming
- * connections from the fact that the context is still NULL. Returns < 0 on
- * error.
+ * connections from the fact that the context is still NULL (even during mux
+ * upgrades). <input> is always used as Input buffer and may contain data. It is
+ * the caller responsibility to not reuse it anymore. Returns < 0 on error.
  */
-static int h2_init(struct connection *conn, struct proxy *prx, struct session *sess)
+static int h2_init(struct connection *conn, struct proxy *prx, struct session *sess,
+		   struct buffer *input)
 {
 	struct h2c *h2c;
 	struct task *t = NULL;
@@ -533,7 +535,7 @@
 	h2c->nb_reserved = 0;
 	h2c->stream_cnt = 0;
 
-	h2c->dbuf = BUF_NULL;
+	h2c->dbuf = *input;
 	h2c->dsi = -1;
 	h2c->msi = -1;
 
diff --git a/src/mux_pt.c b/src/mux_pt.c
index 4f53920..2086d5f 100644
--- a/src/mux_pt.c
+++ b/src/mux_pt.c
@@ -62,7 +62,8 @@
  * incoming ones, in which case one will be allocated and a new stream will be
  * instanciated). Returns < 0 on error.
  */
-static int mux_pt_init(struct connection *conn, struct proxy *prx, struct session *sess)
+static int mux_pt_init(struct connection *conn, struct proxy *prx, struct session *sess,
+		       struct buffer *input)
 {
 	struct conn_stream *cs = conn->ctx;
 	struct mux_pt_ctx *ctx = pool_alloc(pool_head_pt_ctx);