MAJOR: session: check for a connection to an applet in sess_prepare_conn_req()
Instead of having applets bypass the whole connection process, we now
follow the common path through sess_prepare_conn_req(). It is this
function which detects an applet an sets the output state so SI_ST_EST
instead of initiating a connection to a server. It is made possible
because we now have s->target pointing to the applet.
diff --git a/src/session.c b/src/session.c
index 8dd6d05..5274971 100644
--- a/src/session.c
+++ b/src/session.c
@@ -1151,9 +1151,10 @@
}
/* This function initiates a server connection request on a stream interface
- * already in SI_ST_REQ state. Upon success, the state goes to SI_ST_ASS,
- * indicating that a server has been assigned. It may also return SI_ST_QUE,
- * or SI_ST_CLO upon error.
+ * already in SI_ST_REQ state. Upon success, the state goes to SI_ST_ASS for
+ * a real connection to a server, indicating that a server has been assigned,
+ * or SI_ST_EST for a successful connection to an applet. It may also return
+ * SI_ST_QUE, or SI_ST_CLO upon error.
*/
static void sess_prepare_conn_req(struct session *s, struct stream_interface *si)
{
@@ -1168,6 +1169,18 @@
if (si->state != SI_ST_REQ)
return;
+ if (unlikely(obj_type(s->target) == OBJ_TYPE_APPLET)) {
+ /* the applet directly goes to the EST state */
+ s->logs.t_queue = tv_ms_elapsed(&s->logs.tv_accept, &now);
+ s->logs.t_connect = tv_ms_elapsed(&s->logs.tv_accept, &now);
+ si->state = SI_ST_EST;
+ si->err_type = SI_ET_NONE;
+ si->exp = TICK_ETERNITY;
+ s->req->wex = TICK_ETERNITY;
+ s->rep->flags |= CF_READ_ATTACHED; /* producer is now attached */
+ return;
+ }
+
/* Try to assign a server */
if (srv_redispatch_connect(s) != 0) {
/* We did not get a server. Either we queued the
@@ -2175,11 +2188,6 @@
*/
s->req->cons->state = SI_ST_REQ; /* new connection requested */
s->req->cons->conn_retries = s->be->conn_retries;
- if (unlikely(obj_type(s->target) == OBJ_TYPE_APPLET)) {
- s->req->cons->state = SI_ST_EST; /* connection established */
- s->rep->flags |= CF_READ_ATTACHED; /* producer is now attached */
- s->req->wex = TICK_ETERNITY;
- }
}
}
else {
@@ -2207,7 +2215,7 @@
/* check for HTTP mode and proxy server_name_hdr_name != NULL */
if ((s->flags & SN_BE_ASSIGNED) &&
(s->be->mode == PR_MODE_HTTP) &&
- (s->be->server_id_hdr_name != NULL && s->target)) {
+ (s->be->server_id_hdr_name != NULL && objt_server(s->target))) {
http_send_name_header(&s->txn, s->be, objt_server(s->target)->id);
}
}