MEDIUM: servers: Add a way to keep idle connections alive.

Add a new keyword for servers, "idle-timeout". If set, unused connections are
kept alive until the timeout happens, and will be picked for reuse if no
other connection is available.
diff --git a/src/session.c b/src/session.c
index 8080c94..9c52efc 100644
--- a/src/session.c
+++ b/src/session.c
@@ -86,10 +86,28 @@
 		list_for_each_entry_safe(conn, conn_back, &sess->srv_list[i].list, session_list) {
 			count++;
 			if (conn->mux) {
+				struct server *srv;
+
 				LIST_DEL(&conn->session_list);
 				LIST_INIT(&conn->session_list);
+				srv = objt_server(conn->target);
 				conn->owner = NULL;
-				conn->mux->destroy(conn);
+				if (srv && srv->idle_timeout > 0 &&
+				    !(conn->flags & CO_FL_PRIVATE) &&
+				    conn->mux->avail_streams(conn) ==
+				    conn->mux->max_streams(conn)) {
+					LIST_DEL(&conn->list);
+
+					LIST_ADDQ(&srv->idle_orphan_conns[tid],
+					    &conn->list);
+
+					conn->idle_time = now_ms;
+					if (!(task_in_wq(srv->idle_task[tid])) &&
+					    !(task_in_rq(srv->idle_task[tid])))
+						task_schedule(srv->idle_task[tid],
+						    tick_add(now_ms, srv->idle_timeout));
+				} else
+					conn->mux->destroy(conn);
 			} else {
 				/* We have a connection, but not yet an associated mux.
 				 * So destroy it now.