diff --git a/src/backend.c b/src/backend.c index f81b75f8d..e550d35bc 100644 --- a/src/backend.c +++ b/src/backend.c @@ -884,74 +884,46 @@ static void assign_tproxy_address(struct session *s) { #if defined(CONFIG_HAP_CTTPROXY) || defined(CONFIG_HAP_LINUX_TPROXY) struct server *srv = objt_server(s->target); + struct conn_src *src; - if (srv && srv->conn_src.opts & CO_SRC_BIND) { - switch (srv->conn_src.opts & CO_SRC_TPROXY_MASK) { - case CO_SRC_TPROXY_ADDR: - s->req->cons->conn->addr.from = srv->conn_src.tproxy_addr; - break; - case CO_SRC_TPROXY_CLI: - case CO_SRC_TPROXY_CIP: - /* FIXME: what can we do if the client connects in IPv6 or unix socket ? */ - s->req->cons->conn->addr.from = s->req->prod->conn->addr.from; - break; - case CO_SRC_TPROXY_DYN: - if (srv->conn_src.bind_hdr_occ) { - char *vptr; - int vlen; - int rewind; + if (srv && srv->conn_src.opts & CO_SRC_BIND) + src = &srv->conn_src; + else if (s->be->conn_src.opts & CO_SRC_BIND) + src = &s->be->conn_src; + else + return; - /* bind to the IP in a header */ - ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_family = AF_INET; - ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_port = 0; - ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr = 0; + switch (src->opts & CO_SRC_TPROXY_MASK) { + case CO_SRC_TPROXY_ADDR: + s->req->cons->conn->addr.from = src->tproxy_addr; + break; + case CO_SRC_TPROXY_CLI: + case CO_SRC_TPROXY_CIP: + /* FIXME: what can we do if the client connects in IPv6 or unix socket ? */ + s->req->cons->conn->addr.from = s->req->prod->conn->addr.from; + break; + case CO_SRC_TPROXY_DYN: + if (src->bind_hdr_occ) { + char *vptr; + int vlen; + int rewind; - b_rew(s->req->buf, rewind = s->req->buf->o); - if (http_get_hdr(&s->txn.req, srv->conn_src.bind_hdr_name, srv->conn_src.bind_hdr_len, - &s->txn.hdr_idx, srv->conn_src.bind_hdr_occ, NULL, &vptr, &vlen)) { - ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr = - htonl(inetaddr_host_lim(vptr, vptr + vlen)); - } - b_adv(s->req->buf, rewind); + /* bind to the IP in a header */ + ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_family = AF_INET; + ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_port = 0; + ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr = 0; + + b_rew(s->req->buf, rewind = s->req->buf->o); + if (http_get_hdr(&s->txn.req, src->bind_hdr_name, src->bind_hdr_len, + &s->txn.hdr_idx, src->bind_hdr_occ, NULL, &vptr, &vlen)) { + ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr = + htonl(inetaddr_host_lim(vptr, vptr + vlen)); } - break; - default: - memset(&s->req->cons->conn->addr.from, 0, sizeof(s->req->cons->conn->addr.from)); - } - } - else if (s->be->conn_src.opts & CO_SRC_BIND) { - switch (s->be->conn_src.opts & CO_SRC_TPROXY_MASK) { - case CO_SRC_TPROXY_ADDR: - s->req->cons->conn->addr.from = s->be->conn_src.tproxy_addr; - break; - case CO_SRC_TPROXY_CLI: - case CO_SRC_TPROXY_CIP: - /* FIXME: what can we do if the client connects in IPv6 or socket unix? */ - s->req->cons->conn->addr.from = s->req->prod->conn->addr.from; - break; - case CO_SRC_TPROXY_DYN: - if (s->be->conn_src.bind_hdr_occ) { - char *vptr; - int vlen; - int rewind; - - /* bind to the IP in a header */ - ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_family = AF_INET; - ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_port = 0; - ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr = 0; - - b_rew(s->req->buf, rewind = s->req->buf->o); - if (http_get_hdr(&s->txn.req, s->be->conn_src.bind_hdr_name, s->be->conn_src.bind_hdr_len, - &s->txn.hdr_idx, s->be->conn_src.bind_hdr_occ, NULL, &vptr, &vlen)) { - ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr = - htonl(inetaddr_host_lim(vptr, vptr + vlen)); - } - b_adv(s->req->buf, rewind); - } - break; - default: - memset(&s->req->cons->conn->addr.from, 0, sizeof(s->req->cons->conn->addr.from)); + b_adv(s->req->buf, rewind); } + break; + default: + memset(&s->req->cons->conn->addr.from, 0, sizeof(s->req->cons->conn->addr.from)); } #endif }