BUG/MEDIUM: connections: Reuse an already attached conn_stream.
In connect_server(), if we already have a conn_stream, reuse it
instead of trying to create a new one. http_proxy and LUA both
manually create a conn_stream and a connection, and we want
to use it.
diff --git a/src/backend.c b/src/backend.c
index e62a3b8..9276fa6 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -1123,7 +1123,16 @@
int i;
- if (!(s->be->options & PR_O_HTTP_PROXY)) {
+ /* Some, such as http_proxy and the LUA, create their connection and
+ * conn_stream manually, so if we already have a conn_stream, try
+ * to use it.
+ */
+ srv_cs = objt_cs(s->si[1].end);
+ if (srv_cs) {
+ old_conn = srv_conn = cs_conn(srv_cs);
+ if (old_conn)
+ reuse = 1;
+ } else {
for (i = 0; i < MAX_SRV_LIST; i++) {
if (s->sess->srv_list[i].target == s->target) {
list_for_each_entry(srv_conn, &s->sess->srv_list[i].list,
@@ -1145,16 +1154,6 @@
}
}
}
- } else {
- /* http_proxy is special, we can't just reuse any connection,
- * as the destination may be different. We should have created
- * a connection and a conn_stream earlier, so get the
- * connection from the conn_stream.
- */
- srv_cs = objt_cs(s->si[1].end);
- old_conn = srv_conn = cs_conn(srv_cs);
- if (old_conn)
- reuse = 1;
}
old_conn = srv_conn;
@@ -1313,7 +1312,9 @@
srv->mux_proto))
#endif
{
- srv_cs = si_alloc_cs(&s->si[1], srv_conn);
+ srv_cs = objt_cs(s->si[1].end);
+ if (!srv_cs || srv_cs->conn != srv_conn)
+ srv_cs = si_alloc_cs(&s->si[1], srv_conn);
if (!srv_cs) {
conn_free(srv_conn);
return SF_ERR_RESOURCE;