MINOR: stream: provide a new stream creation function for connections

The purpose will be to create new streams for a given connection so
that we can later abstract this from a mux.
diff --git a/include/proto/stream.h b/include/proto/stream.h
index 44fc8be..00f452c 100644
--- a/include/proto/stream.h
+++ b/include/proto/stream.h
@@ -36,6 +36,7 @@
 extern struct data_cb sess_conn_cb;
 
 struct stream *stream_new(struct session *sess, enum obj_type *origin);
+int stream_create_from_conn(struct connection *conn);
 
 /* perform minimal intializations, report 0 in case of error, 1 if OK. */
 int init_stream();
diff --git a/src/session.c b/src/session.c
index 69ca2cb..c86baff 100644
--- a/src/session.c
+++ b/src/session.c
@@ -111,7 +111,6 @@
 	struct connection *cli_conn;
 	struct proxy *p = l->bind_conf->frontend;
 	struct session *sess;
-	struct stream *strm;
 	int ret;
 
 
@@ -268,10 +267,9 @@
 		goto out_free_sess;
 
 	session_count_new(sess);
-	if ((strm = stream_new(sess, &cli_conn->obj_type)) == NULL)
+	if (stream_create_from_conn(cli_conn) < 0)
 		goto out_free_sess;
 
-	task_wakeup(strm->task, TASK_WOKEN_INIT);
 	return 1;
 
  out_free_sess:
@@ -417,7 +415,6 @@
 static int conn_complete_session(struct connection *conn)
 {
 	struct session *sess = conn->owner;
-	struct stream *strm;
 
 	conn_clear_xprt_done_cb(conn);
 
@@ -436,11 +433,9 @@
 		goto fail;
 
 	session_count_new(sess);
-	if ((strm = stream_new(sess, &conn->obj_type)) == NULL)
+	if (stream_create_from_conn(conn) < 0)
 		goto fail;
 
-	task_wakeup(strm->task, TASK_WOKEN_INIT);
-
 	/* the embryonic session's task is not needed anymore */
 	task_delete(sess->task);
 	task_free(sess->task);
diff --git a/src/stream.c b/src/stream.c
index 8527c29..1985ed9 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -65,6 +65,23 @@
 /* List of all use-service keywords. */
 static struct list service_keywords = LIST_HEAD_INIT(service_keywords);
 
+
+/* Create a new stream for connection <conn>. Return < 0 on error. This is only
+ * 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_conn(struct connection *conn)
+{
+	struct stream *strm;
+
+	strm = stream_new(conn->owner, &conn->obj_type);
+	if (strm == NULL)
+		return -1;
+
+	task_wakeup(strm->task, TASK_WOKEN_INIT);
+	return 0;
+}
+
 /* This function is called from the session handler which detects the end of
  * handshake, in order to complete initialization of a valid stream. It must be
  * called with a completley initialized session. It returns the pointer to