MEDIUM: session: prepare to support earlier transitions to the established state

At the moment it is possible in sess_prepare_conn_req() to switch to the
established state when the target is an applet. But sess_update_stream_int()
will soon also have the ability to set the established state via
connect_server() when a connection is reused, leading to a synchronous
connect.

So prepare the code to handle this SI_ST_ASS -> SI_ST_EST transition, which
really matches what's done in the lower layers.
This commit is contained in:
Willy Tarreau 2013-12-31 23:16:50 +01:00
parent 0e37f1c40e
commit b44c873d61

View File

@ -2222,20 +2222,20 @@ struct task *process_session(struct task *t)
*/
if (s->si[1].state != SI_ST_REQ)
sess_update_stream_int(s, &s->si[1]);
if (s->si[1].state == SI_ST_REQ) {
if (s->si[1].state == SI_ST_REQ)
sess_prepare_conn_req(s, &s->si[1]);
/* applets directly go to the ESTABLISHED state */
if (unlikely(s->si[1].state == SI_ST_EST))
sess_establish(s, &s->si[1]);
/* applets directly go to the ESTABLISHED state */
if (unlikely(s->si[1].state == SI_ST_EST))
sess_establish(s, &s->si[1]);
/* Now we can add the server name to a header (if requested) */
/* 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 && objt_server(s->target))) {
http_send_name_header(&s->txn, s->be, objt_server(s->target)->id);
}
/* Now we can add the server name to a header (if requested) */
/* check for HTTP mode and proxy server_name_hdr_name != NULL */
if ((s->si[1].state >= SI_ST_CON) &&
(s->be->server_id_hdr_name != NULL) &&
(s->be->mode == PR_MODE_HTTP) &&
objt_server(s->target)) {
http_send_name_header(&s->txn, s->be, objt_server(s->target)->id);
}
srv = objt_server(s->target);