mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-06 23:27:04 +02:00
MEDIUM: stream: move the listener's pointer to the session
The listener is session-specific, move it there.
This commit is contained in:
parent
feb764040d
commit
fb0afa77c9
@ -36,6 +36,7 @@
|
||||
#include <types/stick_table.h>
|
||||
|
||||
struct session {
|
||||
struct listener *listener; /* the listener by which the request arrived */
|
||||
};
|
||||
|
||||
#endif /* _TYPES_SESSION_H */
|
||||
|
@ -122,7 +122,6 @@ struct stream {
|
||||
|
||||
struct session *sess; /* the session this stream is attached to */
|
||||
|
||||
struct listener *listener; /* the listener by which the request arrived */
|
||||
struct server *srv_conn; /* stream already has a slot on a server and is not in queue */
|
||||
struct pendconn *pend_pos; /* if not NULL, points to the position in the pending queue */
|
||||
|
||||
|
@ -551,7 +551,7 @@ static int stats_dump_table_head_to_buffer(struct chunk *msg, struct stream_inte
|
||||
|
||||
/* any other information should be dumped here */
|
||||
|
||||
if (target && s->listener->bind_conf->level < ACCESS_LVL_OPER)
|
||||
if (target && strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_OPER)
|
||||
chunk_appendf(msg, "# contents not dumped due to insufficient privileges\n");
|
||||
|
||||
if (bi_putchk(si_ic(si), msg) == -1) {
|
||||
@ -705,7 +705,7 @@ static void stats_sock_table_key_request(struct stream_interface *si, char **arg
|
||||
}
|
||||
|
||||
/* check permissions */
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_OPER) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_OPER) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return;
|
||||
@ -905,7 +905,7 @@ static struct proxy *expect_frontend_admin(struct stream *s, struct stream_inter
|
||||
struct appctx *appctx = __objt_appctx(si->end);
|
||||
struct proxy *px;
|
||||
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return NULL;
|
||||
@ -938,7 +938,7 @@ static struct server *expect_server_admin(struct stream *s, struct stream_interf
|
||||
struct server *sv;
|
||||
char *line;
|
||||
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return NULL;
|
||||
@ -1111,7 +1111,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
|
||||
}
|
||||
else if (strcmp(args[1], "sess") == 0) {
|
||||
appctx->st2 = STAT_ST_INIT;
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_OPER) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_OPER) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return 1;
|
||||
@ -1127,7 +1127,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
|
||||
appctx->st0 = STAT_CLI_O_SESS; // stats_dump_sess_to_buffer
|
||||
}
|
||||
else if (strcmp(args[1], "errors") == 0) {
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_OPER) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_OPER) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return 1;
|
||||
@ -1188,8 +1188,8 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
|
||||
clrall = 1;
|
||||
|
||||
/* check permissions */
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_OPER ||
|
||||
(clrall && s->listener->bind_conf->level < ACCESS_LVL_ADMIN)) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_OPER ||
|
||||
(clrall && strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_ADMIN)) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return 1;
|
||||
@ -1519,7 +1519,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
|
||||
else if (strcmp(args[2], "global") == 0) {
|
||||
int v;
|
||||
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return 1;
|
||||
@ -1561,7 +1561,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
|
||||
if (strcmp(args[3], "global") == 0) {
|
||||
int v;
|
||||
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return 1;
|
||||
@ -1598,7 +1598,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
|
||||
if (strcmp(args[3], "global") == 0) {
|
||||
int v;
|
||||
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return 1;
|
||||
@ -1636,7 +1636,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
|
||||
if (strcmp(args[3], "global") == 0) {
|
||||
int v;
|
||||
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return 1;
|
||||
@ -1981,7 +1981,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line)
|
||||
else if (strcmp(args[1], "session") == 0) {
|
||||
struct stream *sess, *ptr;
|
||||
|
||||
if (s->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
if (strm_sess(s)->listener->bind_conf->level < ACCESS_LVL_ADMIN) {
|
||||
appctx->ctx.cli.msg = stats_permission_denied_msg;
|
||||
appctx->st0 = STAT_CLI_PRINT;
|
||||
return 1;
|
||||
@ -5020,7 +5020,7 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si, struct st
|
||||
tm.tm_mday, monthname[tm.tm_mon], tm.tm_year+1900,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec, (int)(sess->logs.accept_date.tv_usec),
|
||||
sess->uniq_id,
|
||||
sess->listener && sess->listener->proto->name ? sess->listener->proto->name : "?");
|
||||
strm_sess(sess)->listener && strm_sess(sess)->listener->proto->name ? strm_sess(sess)->listener->proto->name : "?");
|
||||
|
||||
conn = objt_conn(sess->si[0].end);
|
||||
switch (conn ? addr_to_str(&conn->addr.from, pn, sizeof(pn)) : AF_UNSPEC) {
|
||||
@ -5030,7 +5030,7 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si, struct st
|
||||
pn, get_host_port(&conn->addr.from));
|
||||
break;
|
||||
case AF_UNIX:
|
||||
chunk_appendf(&trash, " source=unix:%d\n", sess->listener->luid);
|
||||
chunk_appendf(&trash, " source=unix:%d\n", strm_sess(sess)->listener->luid);
|
||||
break;
|
||||
default:
|
||||
/* no more information to print right now */
|
||||
@ -5045,8 +5045,8 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si, struct st
|
||||
chunk_appendf(&trash,
|
||||
" frontend=%s (id=%u mode=%s), listener=%s (id=%u)",
|
||||
sess->fe->id, sess->fe->uuid, sess->fe->mode ? "http" : "tcp",
|
||||
sess->listener ? sess->listener->name ? sess->listener->name : "?" : "?",
|
||||
sess->listener ? sess->listener->luid : 0);
|
||||
strm_sess(sess)->listener ? strm_sess(sess)->listener->name ? strm_sess(sess)->listener->name : "?" : "?",
|
||||
strm_sess(sess)->listener ? strm_sess(sess)->listener->luid : 0);
|
||||
|
||||
if (conn)
|
||||
conn_get_to_addr(conn);
|
||||
@ -5058,7 +5058,7 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si, struct st
|
||||
pn, get_host_port(&conn->addr.to));
|
||||
break;
|
||||
case AF_UNIX:
|
||||
chunk_appendf(&trash, " addr=unix:%d\n", sess->listener->luid);
|
||||
chunk_appendf(&trash, " addr=unix:%d\n", strm_sess(sess)->listener->luid);
|
||||
break;
|
||||
default:
|
||||
/* no more information to print right now */
|
||||
@ -5601,7 +5601,7 @@ static int stats_dump_sess_to_buffer(struct stream_interface *si)
|
||||
chunk_appendf(&trash,
|
||||
"%p: proto=%s",
|
||||
curr_sess,
|
||||
curr_sess->listener->proto->name);
|
||||
strm_sess(curr_sess)->listener->proto->name);
|
||||
|
||||
|
||||
conn = objt_conn(curr_sess->si[0].end);
|
||||
@ -5620,7 +5620,7 @@ static int stats_dump_sess_to_buffer(struct stream_interface *si)
|
||||
case AF_UNIX:
|
||||
chunk_appendf(&trash,
|
||||
" src=unix:%d fe=%s be=%s srv=%s",
|
||||
curr_sess->listener->luid,
|
||||
strm_sess(curr_sess)->listener->luid,
|
||||
curr_sess->fe->id,
|
||||
(curr_sess->be->cap & PR_CAP_BE) ? curr_sess->be->id : "<NONE>",
|
||||
objt_server(curr_sess->target) ? objt_server(curr_sess->target)->id : "<none>"
|
||||
@ -5827,7 +5827,7 @@ static int stats_table_request(struct stream_interface *si, int action)
|
||||
return 0;
|
||||
|
||||
if (appctx->ctx.table.target &&
|
||||
s->listener->bind_conf->level >= ACCESS_LVL_OPER) {
|
||||
strm_sess(s)->listener->bind_conf->level >= ACCESS_LVL_OPER) {
|
||||
/* dump entries only if table explicitly requested */
|
||||
eb = ebmb_first(&appctx->ctx.table.proxy->table.keys);
|
||||
if (eb) {
|
||||
|
@ -55,6 +55,8 @@
|
||||
int frontend_accept(struct stream *s)
|
||||
{
|
||||
struct connection *conn = __objt_conn(s->si[0].end);
|
||||
struct listener *l = strm_sess(s)->listener;
|
||||
|
||||
int cfd = conn->t.sock.fd;
|
||||
|
||||
tv_zero(&s->logs.tv_request);
|
||||
@ -75,7 +77,7 @@ int frontend_accept(struct stream *s)
|
||||
s->srv_error = default_srv_error;
|
||||
|
||||
/* Adjust some socket options */
|
||||
if (s->listener->addr.ss_family == AF_INET || s->listener->addr.ss_family == AF_INET6) {
|
||||
if (l->addr.ss_family == AF_INET || l->addr.ss_family == AF_INET6) {
|
||||
if (setsockopt(cfd, IPPROTO_TCP, TCP_NODELAY,
|
||||
(char *) &one, sizeof(one)) == -1)
|
||||
goto out_return;
|
||||
@ -88,12 +90,12 @@ int frontend_accept(struct stream *s)
|
||||
fdtab[cfd].linger_risk = 1;
|
||||
|
||||
#if defined(TCP_MAXSEG)
|
||||
if (s->listener->maxseg < 0) {
|
||||
if (l->maxseg < 0) {
|
||||
/* we just want to reduce the current MSS by that value */
|
||||
int mss;
|
||||
socklen_t mss_len = sizeof(mss);
|
||||
if (getsockopt(cfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &mss_len) == 0) {
|
||||
mss += s->listener->maxseg; /* remember, it's < 0 */
|
||||
mss += l->maxseg; /* remember, it's < 0 */
|
||||
setsockopt(cfd, IPPROTO_TCP, TCP_MAXSEG, &mss, sizeof(mss));
|
||||
}
|
||||
}
|
||||
@ -158,7 +160,7 @@ int frontend_accept(struct stream *s)
|
||||
case AF_UNIX:
|
||||
/* UNIX socket, only the destination is known */
|
||||
send_log(s->fe, LOG_INFO, "Connect to unix:%d (%s/%s)\n",
|
||||
s->listener->luid,
|
||||
l->luid,
|
||||
s->fe->id, (s->fe->mode == PR_MODE_HTTP) ? "HTTP" : "TCP");
|
||||
break;
|
||||
}
|
||||
@ -174,14 +176,14 @@ int frontend_accept(struct stream *s)
|
||||
case AF_INET:
|
||||
case AF_INET6:
|
||||
chunk_printf(&trash, "%08x:%s.accept(%04x)=%04x from [%s:%d]\n",
|
||||
s->uniq_id, s->fe->id, (unsigned short)s->listener->fd, (unsigned short)cfd,
|
||||
s->uniq_id, s->fe->id, (unsigned short)l->fd, (unsigned short)cfd,
|
||||
pn, get_host_port(&conn->addr.from));
|
||||
break;
|
||||
case AF_UNIX:
|
||||
/* UNIX socket, only the destination is known */
|
||||
chunk_printf(&trash, "%08x:%s.accept(%04x)=%04x from [unix:%d]\n",
|
||||
s->uniq_id, s->fe->id, (unsigned short)s->listener->fd, (unsigned short)cfd,
|
||||
s->listener->luid);
|
||||
s->uniq_id, s->fe->id, (unsigned short)l->fd, (unsigned short)cfd,
|
||||
l->luid);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2133,7 +2133,7 @@ __LJMP static int hlua_socket_new(lua_State *L)
|
||||
/* The stream dont have listener. The listener is used with real
|
||||
* proxies.
|
||||
*/
|
||||
socket->s->listener = NULL;
|
||||
socket->s->sess->listener = NULL;
|
||||
|
||||
/* The flags are initialized to 0. Values are setted later. */
|
||||
socket->s->flags = 0;
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include <proto/freq_ctr.h>
|
||||
#include <proto/log.h>
|
||||
#include <proto/sample.h>
|
||||
#include <proto/stream.h>
|
||||
#include <proto/task.h>
|
||||
|
||||
/* List head of all known bind keywords */
|
||||
@ -593,7 +594,7 @@ smp_fetch_dconn(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
|
||||
const struct arg *args, struct sample *smp, const char *kw, void *private)
|
||||
{
|
||||
smp->type = SMP_T_UINT;
|
||||
smp->data.uint = l4->listener->nbconn;
|
||||
smp->data.uint = strm_sess(l4)->listener->nbconn;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -603,7 +604,7 @@ smp_fetch_so_id(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
|
||||
const struct arg *args, struct sample *smp, const char *kw, void *private)
|
||||
{
|
||||
smp->type = SMP_T_UINT;
|
||||
smp->data.uint = l4->listener->luid;
|
||||
smp->data.uint = strm_sess(l4)->listener->luid;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
12
src/log.c
12
src/log.c
@ -34,6 +34,7 @@
|
||||
#include <proto/frontend.h>
|
||||
#include <proto/log.h>
|
||||
#include <proto/sample.h>
|
||||
#include <proto/stream.h>
|
||||
#include <proto/stream_interface.h>
|
||||
#ifdef USE_OPENSSL
|
||||
#include <proto/ssl_sock.h>
|
||||
@ -918,6 +919,7 @@ const char sess_set_cookie[8] = "NPDIRU67"; /* No set-cookie, Set-cookie found a
|
||||
*/
|
||||
int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list_format)
|
||||
{
|
||||
struct session *sess = strm_sess(s);
|
||||
struct proxy *fe = s->fe;
|
||||
struct proxy *be = s->be;
|
||||
struct http_txn *txn = &s->txn;
|
||||
@ -999,7 +1001,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
|
||||
conn = objt_conn(s->si[0].end);
|
||||
if (conn) {
|
||||
if (conn->addr.from.ss_family == AF_UNIX) {
|
||||
ret = ltoa_o(s->listener->luid, tmplog, dst + maxsize - tmplog);
|
||||
ret = ltoa_o(sess->listener->luid, tmplog, dst + maxsize - tmplog);
|
||||
} else {
|
||||
ret = lf_port(tmplog, (struct sockaddr *)&conn->addr.from,
|
||||
dst + maxsize - tmplog, tmp);
|
||||
@ -1034,7 +1036,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
|
||||
if (conn) {
|
||||
conn_get_to_addr(conn);
|
||||
if (conn->addr.to.ss_family == AF_UNIX)
|
||||
ret = ltoa_o(s->listener->luid, tmplog, dst + maxsize - tmplog);
|
||||
ret = ltoa_o(sess->listener->luid, tmplog, dst + maxsize - tmplog);
|
||||
else
|
||||
ret = lf_port(tmplog, (struct sockaddr *)&conn->addr.to, dst + maxsize - tmplog, tmp);
|
||||
}
|
||||
@ -1181,7 +1183,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
|
||||
goto out;
|
||||
tmplog += iret;
|
||||
#ifdef USE_OPENSSL
|
||||
if (s->listener->xprt == &ssl_sock)
|
||||
if (sess->listener->xprt == &ssl_sock)
|
||||
LOGCHAR('~');
|
||||
#endif
|
||||
if (tmp->options & LOG_OPT_QUOTE)
|
||||
@ -1193,7 +1195,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
|
||||
src = NULL;
|
||||
conn = objt_conn(s->si[0].end);
|
||||
if (conn) {
|
||||
if (s->listener->xprt == &ssl_sock)
|
||||
if (sess->listener->xprt == &ssl_sock)
|
||||
src = ssl_sock_get_cipher_name(conn);
|
||||
}
|
||||
ret = lf_text(tmplog, src, dst + maxsize - tmplog, tmp);
|
||||
@ -1207,7 +1209,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
|
||||
src = NULL;
|
||||
conn = objt_conn(s->si[0].end);
|
||||
if (conn) {
|
||||
if (s->listener->xprt == &ssl_sock)
|
||||
if (sess->listener->xprt == &ssl_sock)
|
||||
src = ssl_sock_get_proto_version(conn);
|
||||
}
|
||||
ret = lf_text(tmplog, src, dst + maxsize - tmplog, tmp);
|
||||
|
@ -1144,13 +1144,14 @@ static struct stream *peer_session_create(struct peer *peer, struct peer_session
|
||||
t->nice = l->nice;
|
||||
|
||||
s->task = t;
|
||||
s->listener = l;
|
||||
s->sess = pool_alloc2(pool2_session);
|
||||
if (!s->sess) {
|
||||
Alert("out of memory in peer_session_create().\n");
|
||||
goto out_free_task;
|
||||
}
|
||||
|
||||
s->sess->listener = l;
|
||||
|
||||
/* Note: initially, the stream's backend points to the frontend.
|
||||
* This changes later when switching rules are executed or
|
||||
* when the default backend is assigned.
|
||||
@ -1272,7 +1273,7 @@ static struct stream *peer_session_create(struct peer *peer, struct peer_session
|
||||
l->nbconn++; /* warning! right now, it's up to the handler to decrease this */
|
||||
p->feconn++;/* beconn will be increased later */
|
||||
jobs++;
|
||||
if (!(s->listener->options & LI_O_UNLIMITED))
|
||||
if (!(s->sess->listener->options & LI_O_UNLIMITED))
|
||||
actconn++;
|
||||
totalconn++;
|
||||
|
||||
|
@ -2546,6 +2546,7 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit)
|
||||
|
||||
int cur_idx;
|
||||
int use_close_only;
|
||||
struct session *sess = s->sess;
|
||||
struct http_txn *txn = &s->txn;
|
||||
struct http_msg *msg = &txn->req;
|
||||
struct hdr_ctx ctx;
|
||||
@ -2702,8 +2703,8 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit)
|
||||
stream_inc_http_req_ctr(s);
|
||||
proxy_inc_fe_req_ctr(s->fe);
|
||||
s->fe->fe_counters.failed_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->failed_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->failed_req++;
|
||||
|
||||
if (!(s->flags & SF_FINST_MASK))
|
||||
s->flags |= SF_FINST_R;
|
||||
@ -2731,8 +2732,8 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit)
|
||||
stream_inc_http_req_ctr(s);
|
||||
proxy_inc_fe_req_ctr(s->fe);
|
||||
s->fe->fe_counters.failed_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->failed_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->failed_req++;
|
||||
|
||||
if (!(s->flags & SF_FINST_MASK))
|
||||
s->flags |= SF_FINST_R;
|
||||
@ -2758,8 +2759,8 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit)
|
||||
stream_inc_http_req_ctr(s);
|
||||
proxy_inc_fe_req_ctr(s->fe);
|
||||
s->fe->fe_counters.failed_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->failed_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->failed_req++;
|
||||
|
||||
if (!(s->flags & SF_FINST_MASK))
|
||||
s->flags |= SF_FINST_R;
|
||||
@ -2770,7 +2771,7 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit)
|
||||
req->flags |= CF_READ_DONTWAIT; /* try to get back here ASAP */
|
||||
s->res.flags &= ~CF_EXPECT_MORE; /* speed up sending a previous response */
|
||||
#ifdef TCP_QUICKACK
|
||||
if (s->listener->options & LI_O_NOQUICKACK && req->buf->i && objt_conn(s->si[0].end) && conn_ctrl_ready(__objt_conn(s->si[0].end))) {
|
||||
if (sess->listener->options & LI_O_NOQUICKACK && req->buf->i && objt_conn(s->si[0].end) && conn_ctrl_ready(__objt_conn(s->si[0].end))) {
|
||||
/* We need more data, we have to re-enable quick-ack in case we
|
||||
* previously disabled it, otherwise we might cause the client
|
||||
* to delay next data.
|
||||
@ -3071,8 +3072,8 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit)
|
||||
stream_int_retnclose(&s->si[0], http_error_message(s, HTTP_ERR_400));
|
||||
|
||||
s->fe->fe_counters.failed_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->failed_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->failed_req++;
|
||||
|
||||
return_prx_cond:
|
||||
if (!(s->flags & SF_ERR_MASK))
|
||||
@ -4065,6 +4066,7 @@ static int http_apply_redirect_rule(struct redirect_rule *rule, struct stream *s
|
||||
*/
|
||||
int http_process_req_common(struct stream *s, struct channel *req, int an_bit, struct proxy *px)
|
||||
{
|
||||
struct session *sess = s->sess;
|
||||
struct http_txn *txn = &s->txn;
|
||||
struct http_msg *msg = &txn->req;
|
||||
struct redirect_rule *rule;
|
||||
@ -4249,8 +4251,8 @@ int http_process_req_common(struct stream *s, struct channel *req, int an_bit, s
|
||||
s->fe->fe_counters.denied_req++;
|
||||
if (s->fe != s->be)
|
||||
s->be->be_counters.denied_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->denied_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->denied_req++;
|
||||
goto done_without_exp;
|
||||
|
||||
deny: /* this request was blocked (denied) */
|
||||
@ -4262,8 +4264,8 @@ int http_process_req_common(struct stream *s, struct channel *req, int an_bit, s
|
||||
s->fe->fe_counters.denied_req++;
|
||||
if (s->fe != s->be)
|
||||
s->be->be_counters.denied_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->denied_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->denied_req++;
|
||||
goto return_prx_cond;
|
||||
|
||||
return_bad_req:
|
||||
@ -4280,8 +4282,8 @@ int http_process_req_common(struct stream *s, struct channel *req, int an_bit, s
|
||||
stream_int_retnclose(&s->si[0], http_error_message(s, HTTP_ERR_400));
|
||||
|
||||
s->fe->fe_counters.failed_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->failed_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->failed_req++;
|
||||
|
||||
return_prx_cond:
|
||||
if (!(s->flags & SF_ERR_MASK))
|
||||
@ -4305,6 +4307,7 @@ int http_process_req_common(struct stream *s, struct channel *req, int an_bit, s
|
||||
*/
|
||||
int http_process_request(struct stream *s, struct channel *req, int an_bit)
|
||||
{
|
||||
struct session *sess = s->sess;
|
||||
struct http_txn *txn = &s->txn;
|
||||
struct http_msg *msg = &txn->req;
|
||||
struct connection *cli_conn = objt_conn(s->si[1].end);
|
||||
@ -4597,7 +4600,7 @@ int http_process_request(struct stream *s, struct channel *req, int an_bit)
|
||||
* in case we previously disabled it, otherwise we might cause
|
||||
* the client to delay further data.
|
||||
*/
|
||||
if ((s->listener->options & LI_O_NOQUICKACK) &&
|
||||
if ((sess->listener->options & LI_O_NOQUICKACK) &&
|
||||
cli_conn && conn_ctrl_ready(cli_conn) &&
|
||||
((msg->flags & HTTP_MSGF_TE_CHNK) ||
|
||||
(msg->body_len > req->buf->i - txn->req.eoh - 2)))
|
||||
@ -4636,8 +4639,8 @@ int http_process_request(struct stream *s, struct channel *req, int an_bit)
|
||||
stream_int_retnclose(&s->si[0], http_error_message(s, HTTP_ERR_400));
|
||||
|
||||
s->fe->fe_counters.failed_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->failed_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->failed_req++;
|
||||
|
||||
if (!(s->flags & SF_ERR_MASK))
|
||||
s->flags |= SF_ERR_PRXCOND;
|
||||
@ -4697,6 +4700,7 @@ int http_process_tarpit(struct stream *s, struct channel *req, int an_bit)
|
||||
*/
|
||||
int http_wait_for_request_body(struct stream *s, struct channel *req, int an_bit)
|
||||
{
|
||||
struct session *sess = s->sess;
|
||||
struct http_txn *txn = &s->txn;
|
||||
struct http_msg *msg = &s->txn.req;
|
||||
|
||||
@ -4828,8 +4832,8 @@ int http_wait_for_request_body(struct stream *s, struct channel *req, int an_bit
|
||||
return_err_msg:
|
||||
req->analysers = 0;
|
||||
s->fe->fe_counters.failed_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->failed_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->failed_req++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -5048,7 +5052,7 @@ void http_end_txn_clean_session(struct stream *s)
|
||||
/* we're in keep-alive with an idle connection, monitor it */
|
||||
si_idle_conn(&s->si[1]);
|
||||
|
||||
s->req.analysers = s->listener->analysers;
|
||||
s->req.analysers = strm_sess(s)->listener->analysers;
|
||||
s->res.analysers = 0;
|
||||
}
|
||||
|
||||
@ -5405,6 +5409,7 @@ int http_resync_states(struct stream *s)
|
||||
*/
|
||||
int http_request_forward_body(struct stream *s, struct channel *req, int an_bit)
|
||||
{
|
||||
struct session *sess = s->sess;
|
||||
struct http_txn *txn = &s->txn;
|
||||
struct http_msg *msg = &s->txn.req;
|
||||
|
||||
@ -5643,8 +5648,8 @@ int http_request_forward_body(struct stream *s, struct channel *req, int an_bit)
|
||||
|
||||
return_bad_req: /* let's centralize all bad requests */
|
||||
s->fe->fe_counters.failed_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->failed_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->failed_req++;
|
||||
|
||||
return_bad_req_stats_ok:
|
||||
/* we may have some pending data starting at req->buf->p */
|
||||
@ -6276,6 +6281,7 @@ int http_wait_for_response(struct stream *s, struct channel *rep, int an_bit)
|
||||
*/
|
||||
int http_process_res_common(struct stream *s, struct channel *rep, int an_bit, struct proxy *px)
|
||||
{
|
||||
struct session *sess = s->sess;
|
||||
struct http_txn *txn = &s->txn;
|
||||
struct http_msg *msg = &txn->rsp;
|
||||
struct proxy *cur_proxy;
|
||||
@ -6369,8 +6375,8 @@ int http_process_res_common(struct stream *s, struct channel *rep, int an_bit, s
|
||||
|
||||
s->be->be_counters.denied_resp++;
|
||||
s->fe->fe_counters.denied_resp++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->denied_resp++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->denied_resp++;
|
||||
|
||||
goto return_srv_prx_502;
|
||||
}
|
||||
@ -6520,8 +6526,8 @@ int http_process_res_common(struct stream *s, struct channel *rep, int an_bit, s
|
||||
|
||||
s->be->be_counters.denied_resp++;
|
||||
s->fe->fe_counters.denied_resp++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->denied_resp++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->denied_resp++;
|
||||
|
||||
Alert("Blocking cacheable cookie in response from instance %s, server %s.\n",
|
||||
s->be->id, objt_server(s->target) ? objt_server(s->target)->id : "<dispatch>");
|
||||
|
@ -1089,6 +1089,7 @@ int tcp_pause_listener(struct listener *l)
|
||||
*/
|
||||
int tcp_inspect_request(struct stream *s, struct channel *req, int an_bit)
|
||||
{
|
||||
struct session *sess = s->sess;
|
||||
struct tcp_rule *rule;
|
||||
struct stksess *ts;
|
||||
struct stktable *t;
|
||||
@ -1154,8 +1155,8 @@ int tcp_inspect_request(struct stream *s, struct channel *req, int an_bit)
|
||||
|
||||
s->be->be_counters.denied_req++;
|
||||
s->fe->fe_counters.denied_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->denied_req++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->denied_req++;
|
||||
|
||||
if (!(s->flags & SF_ERR_MASK))
|
||||
s->flags |= SF_ERR_PRXCOND;
|
||||
@ -1249,6 +1250,7 @@ int tcp_inspect_request(struct stream *s, struct channel *req, int an_bit)
|
||||
*/
|
||||
int tcp_inspect_response(struct stream *s, struct channel *rep, int an_bit)
|
||||
{
|
||||
struct session *sess = s->sess;
|
||||
struct tcp_rule *rule;
|
||||
int partial;
|
||||
|
||||
@ -1315,8 +1317,8 @@ int tcp_inspect_response(struct stream *s, struct channel *rep, int an_bit)
|
||||
|
||||
s->be->be_counters.denied_resp++;
|
||||
s->fe->fe_counters.denied_resp++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->denied_resp++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->denied_resp++;
|
||||
|
||||
if (!(s->flags & SF_ERR_MASK))
|
||||
s->flags |= SF_ERR_PRXCOND;
|
||||
@ -1360,6 +1362,7 @@ int tcp_inspect_response(struct stream *s, struct channel *rep, int an_bit)
|
||||
*/
|
||||
int tcp_exec_req_rules(struct stream *s)
|
||||
{
|
||||
struct session *sess = s->sess;
|
||||
struct tcp_rule *rule;
|
||||
struct stksess *ts;
|
||||
struct stktable *t = NULL;
|
||||
@ -1384,8 +1387,8 @@ int tcp_exec_req_rules(struct stream *s)
|
||||
/* we have a matching rule. */
|
||||
if (rule->action == TCP_ACT_REJECT) {
|
||||
s->fe->fe_counters.denied_conn++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->denied_conn++;
|
||||
if (sess->listener->counters)
|
||||
sess->listener->counters->denied_conn++;
|
||||
|
||||
if (!(s->flags & SF_ERR_MASK))
|
||||
s->flags |= SF_ERR_PRXCOND;
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include <proto/proto_http.h>
|
||||
#include <proto/proxy.h>
|
||||
#include <proto/signal.h>
|
||||
#include <proto/stream.h>
|
||||
#include <proto/task.h>
|
||||
|
||||
|
||||
@ -982,7 +983,7 @@ int stream_set_backend(struct stream *s, struct proxy *be)
|
||||
* be more reliable to store the list of analysers that have been run,
|
||||
* but what we do here is OK for now.
|
||||
*/
|
||||
s->req.analysers |= be->be_req_ana & ~(s->listener->analysers);
|
||||
s->req.analysers |= be->be_req_ana & ~strm_sess(s)->listener->analysers;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
47
src/stream.c
47
src/stream.c
@ -121,7 +121,7 @@ int stream_accept(struct listener *l, int cfd, struct sockaddr_storage *addr)
|
||||
if (!s->sess)
|
||||
goto out_free_stream;
|
||||
|
||||
s->listener = l;
|
||||
s->sess->listener = l;
|
||||
s->fe = p;
|
||||
|
||||
s->si[0].flags = SI_FL_NONE;
|
||||
@ -275,23 +275,24 @@ static void prepare_mini_sess_log_prefix(struct stream *s)
|
||||
char pn[INET6_ADDRSTRLEN];
|
||||
int ret;
|
||||
char *end;
|
||||
struct session *sess = s->sess;
|
||||
struct connection *cli_conn = __objt_conn(s->target);
|
||||
|
||||
ret = addr_to_str(&cli_conn->addr.from, pn, sizeof(pn));
|
||||
if (ret <= 0)
|
||||
chunk_printf(&trash, "unknown [");
|
||||
else if (ret == AF_UNIX)
|
||||
chunk_printf(&trash, "%s:%d [", pn, s->listener->luid);
|
||||
chunk_printf(&trash, "%s:%d [", pn, sess->listener->luid);
|
||||
else
|
||||
chunk_printf(&trash, "%s:%d [", pn, get_host_port(&cli_conn->addr.from));
|
||||
|
||||
get_localtime(s->logs.accept_date.tv_sec, &tm);
|
||||
end = date2str_log(trash.str + trash.len, &tm, &(s->logs.accept_date), trash.size - trash.len);
|
||||
trash.len = end - trash.str;
|
||||
if (s->listener->name)
|
||||
chunk_appendf(&trash, "] %s/%s", s->fe->id, s->listener->name);
|
||||
if (sess->listener->name)
|
||||
chunk_appendf(&trash, "] %s/%s", s->fe->id, sess->listener->name);
|
||||
else
|
||||
chunk_appendf(&trash, "] %s/%d", s->fe->id, s->listener->luid);
|
||||
chunk_appendf(&trash, "] %s/%d", s->fe->id, sess->listener->luid);
|
||||
}
|
||||
|
||||
/* This function kills an existing embryonic stream. It stops the connection's
|
||||
@ -302,6 +303,7 @@ static void prepare_mini_sess_log_prefix(struct stream *s)
|
||||
static void kill_mini_session(struct stream *s)
|
||||
{
|
||||
int level = LOG_INFO;
|
||||
struct session *sess = s->sess;
|
||||
struct connection *conn = __objt_conn(s->target);
|
||||
unsigned int log = s->logs.logwait;
|
||||
const char *err_msg;
|
||||
@ -341,12 +343,12 @@ static void kill_mini_session(struct stream *s)
|
||||
s->fe->feconn--;
|
||||
stream_store_counters(s);
|
||||
|
||||
if (!(s->listener->options & LI_O_UNLIMITED))
|
||||
if (!(sess->listener->options & LI_O_UNLIMITED))
|
||||
actconn--;
|
||||
jobs--;
|
||||
s->listener->nbconn--;
|
||||
if (s->listener->state == LI_FULL)
|
||||
resume_listener(s->listener);
|
||||
sess->listener->nbconn--;
|
||||
if (sess->listener->state == LI_FULL)
|
||||
resume_listener(sess->listener);
|
||||
|
||||
/* Dequeues all of the listeners waiting for a resource */
|
||||
if (!LIST_ISEMPTY(&global_listener_queue))
|
||||
@ -419,7 +421,8 @@ static struct task *expire_mini_session(struct task *t)
|
||||
*/
|
||||
int stream_complete(struct stream *s)
|
||||
{
|
||||
struct listener *l = s->listener;
|
||||
struct session *sess = s->sess;
|
||||
struct listener *l = sess->listener;
|
||||
struct proxy *p = s->fe;
|
||||
struct http_txn *txn;
|
||||
struct task *t = s->task;
|
||||
@ -804,6 +807,7 @@ int init_stream()
|
||||
|
||||
void stream_process_counters(struct stream *s)
|
||||
{
|
||||
struct session *sess = s->sess;
|
||||
unsigned long long bytes;
|
||||
void *ptr;
|
||||
int i;
|
||||
@ -818,8 +822,8 @@ void stream_process_counters(struct stream *s)
|
||||
if (objt_server(s->target))
|
||||
objt_server(s->target)->counters.bytes_in += bytes;
|
||||
|
||||
if (s->listener && s->listener->counters)
|
||||
s->listener->counters->bytes_in += bytes;
|
||||
if (sess->listener && sess->listener->counters)
|
||||
sess->listener->counters->bytes_in += bytes;
|
||||
|
||||
for (i = 0; i < MAX_SESS_STKCTR; i++) {
|
||||
if (!stkctr_entry(&s->stkctr[i]))
|
||||
@ -850,8 +854,8 @@ void stream_process_counters(struct stream *s)
|
||||
if (objt_server(s->target))
|
||||
objt_server(s->target)->counters.bytes_out += bytes;
|
||||
|
||||
if (s->listener && s->listener->counters)
|
||||
s->listener->counters->bytes_out += bytes;
|
||||
if (sess->listener && sess->listener->counters)
|
||||
sess->listener->counters->bytes_out += bytes;
|
||||
|
||||
for (i = 0; i < MAX_SESS_STKCTR; i++) {
|
||||
if (!stkctr_entry(&s->stkctr[i]))
|
||||
@ -1271,8 +1275,8 @@ static void sess_set_term_flags(struct stream *s)
|
||||
if (s->si[1].state < SI_ST_REQ) {
|
||||
|
||||
s->fe->fe_counters.failed_req++;
|
||||
if (s->listener->counters)
|
||||
s->listener->counters->failed_req++;
|
||||
if (strm_sess(s)->listener->counters)
|
||||
strm_sess(s)->listener->counters->failed_req++;
|
||||
|
||||
s->flags |= SF_FINST_R;
|
||||
}
|
||||
@ -1754,6 +1758,7 @@ struct task *process_stream(struct task *t)
|
||||
{
|
||||
struct server *srv;
|
||||
struct stream *s = t->context;
|
||||
struct session *sess = s->sess;
|
||||
unsigned int rqf_last, rpf_last;
|
||||
unsigned int rq_prod_last, rq_cons_last;
|
||||
unsigned int rp_cons_last, rp_prod_last;
|
||||
@ -2685,12 +2690,12 @@ struct task *process_stream(struct task *t)
|
||||
if (s->flags & SF_BE_ASSIGNED)
|
||||
s->be->beconn--;
|
||||
jobs--;
|
||||
if (s->listener) {
|
||||
if (!(s->listener->options & LI_O_UNLIMITED))
|
||||
if (sess->listener) {
|
||||
if (!(sess->listener->options & LI_O_UNLIMITED))
|
||||
actconn--;
|
||||
s->listener->nbconn--;
|
||||
if (s->listener->state == LI_FULL)
|
||||
resume_listener(s->listener);
|
||||
sess->listener->nbconn--;
|
||||
if (sess->listener->state == LI_FULL)
|
||||
resume_listener(sess->listener);
|
||||
|
||||
/* Dequeues all of the listeners waiting for a resource */
|
||||
if (!LIST_ISEMPTY(&global_listener_queue))
|
||||
|
Loading…
Reference in New Issue
Block a user