CLEANUP: session: use local variables to access channels / stream ints

In process_session, we had around 300 accesses to channels and stream-ints
from the session. Not only this inflates the code due to the large offsets
from the original pointer, but readability can be improved. Let's have 4
local variables for the channels and stream-ints.
diff --git a/src/session.c b/src/session.c
index 053e4a2..83acc4e 100644
--- a/src/session.c
+++ b/src/session.c
@@ -1731,31 +1731,39 @@
 	unsigned int rq_prod_last, rq_cons_last;
 	unsigned int rp_cons_last, rp_prod_last;
 	unsigned int req_ana_back;
+	struct channel *req, *res;
+	struct stream_interface *si_f, *si_b;
+
+	req = &s->req;
+	res = &s->res;
+
+	si_f = &s->si[0];
+	si_b = &s->si[1];
 
 	//DPRINTF(stderr, "%s:%d: cs=%d ss=%d(%d) rqf=0x%08x rpf=0x%08x\n", __FUNCTION__, __LINE__,
-	//        s->si[0].state, s->si[1].state, s->si[1].err_type, s->req.flags, s->res.flags);
+	//        si_f->state, si_b->state, si_b->err_type, req->flags, res->flags);
 
 	/* this data may be no longer valid, clear it */
 	memset(&s->txn.auth, 0, sizeof(s->txn.auth));
 
 	/* This flag must explicitly be set every time */
-	s->req.flags &= ~(CF_READ_NOEXP|CF_WAKE_WRITE);
-	s->res.flags &= ~(CF_READ_NOEXP|CF_WAKE_WRITE);
+	req->flags &= ~(CF_READ_NOEXP|CF_WAKE_WRITE);
+	res->flags &= ~(CF_READ_NOEXP|CF_WAKE_WRITE);
 
 	/* Keep a copy of req/rep flags so that we can detect shutdowns */
-	rqf_last = s->req.flags & ~CF_MASK_ANALYSER;
-	rpf_last = s->res.flags & ~CF_MASK_ANALYSER;
+	rqf_last = req->flags & ~CF_MASK_ANALYSER;
+	rpf_last = res->flags & ~CF_MASK_ANALYSER;
 
 	/* we don't want the stream interface functions to recursively wake us up */
-	s->si[0].flags |= SI_FL_DONT_WAKE;
-	s->si[1].flags |= SI_FL_DONT_WAKE;
+	si_f->flags |= SI_FL_DONT_WAKE;
+	si_b->flags |= SI_FL_DONT_WAKE;
 
 	/* 1a: Check for low level timeouts if needed. We just set a flag on
 	 * stream interfaces when their timeouts have expired.
 	 */
 	if (unlikely(t->state & TASK_WOKEN_TIMER)) {
-		stream_int_check_timeouts(&s->si[0]);
-		stream_int_check_timeouts(&s->si[1]);
+		stream_int_check_timeouts(si_f);
+		stream_int_check_timeouts(si_b);
 
 		/* check channel timeouts, and close the corresponding stream interfaces
 		 * for future reads or writes. Note: this will also concern upper layers
@@ -1763,30 +1771,30 @@
 		 * detect state changes when calling them.
 		 */
 
-		channel_check_timeouts(&s->req);
+		channel_check_timeouts(req);
 
-		if (unlikely((s->req.flags & (CF_SHUTW|CF_WRITE_TIMEOUT)) == CF_WRITE_TIMEOUT)) {
-			s->si[1].flags |= SI_FL_NOLINGER;
-			si_shutw(&s->si[1]);
+		if (unlikely((req->flags & (CF_SHUTW|CF_WRITE_TIMEOUT)) == CF_WRITE_TIMEOUT)) {
+			si_b->flags |= SI_FL_NOLINGER;
+			si_shutw(si_b);
 		}
 
-		if (unlikely((s->req.flags & (CF_SHUTR|CF_READ_TIMEOUT)) == CF_READ_TIMEOUT)) {
-			if (s->si[0].flags & SI_FL_NOHALF)
-				s->si[0].flags |= SI_FL_NOLINGER;
-			si_shutr(&s->si[0]);
+		if (unlikely((req->flags & (CF_SHUTR|CF_READ_TIMEOUT)) == CF_READ_TIMEOUT)) {
+			if (si_f->flags & SI_FL_NOHALF)
+				si_f->flags |= SI_FL_NOLINGER;
+			si_shutr(si_f);
 		}
 
-		channel_check_timeouts(&s->res);
+		channel_check_timeouts(res);
 
-		if (unlikely((s->res.flags & (CF_SHUTW|CF_WRITE_TIMEOUT)) == CF_WRITE_TIMEOUT)) {
-			s->si[0].flags |= SI_FL_NOLINGER;
-			si_shutw(&s->si[0]);
+		if (unlikely((res->flags & (CF_SHUTW|CF_WRITE_TIMEOUT)) == CF_WRITE_TIMEOUT)) {
+			si_f->flags |= SI_FL_NOLINGER;
+			si_shutw(si_f);
 		}
 
-		if (unlikely((s->res.flags & (CF_SHUTR|CF_READ_TIMEOUT)) == CF_READ_TIMEOUT)) {
-			if (s->si[1].flags & SI_FL_NOHALF)
-				s->si[1].flags |= SI_FL_NOLINGER;
-			si_shutr(&s->si[1]);
+		if (unlikely((res->flags & (CF_SHUTR|CF_READ_TIMEOUT)) == CF_READ_TIMEOUT)) {
+			if (si_b->flags & SI_FL_NOHALF)
+				si_b->flags |= SI_FL_NOLINGER;
+			si_shutr(si_b);
 		}
 
 		/* Once in a while we're woken up because the task expires. But
@@ -1794,10 +1802,10 @@
 		 * So let's not run a whole session processing if only an expiration
 		 * timeout needs to be refreshed.
 		 */
-		if (!((s->req.flags | s->res.flags) &
+		if (!((req->flags | res->flags) &
 		      (CF_SHUTR|CF_READ_ACTIVITY|CF_READ_TIMEOUT|CF_SHUTW|
 		       CF_WRITE_ACTIVITY|CF_WRITE_TIMEOUT|CF_ANA_TIMEOUT)) &&
-		    !((s->si[0].flags | s->si[1].flags) & (SI_FL_EXP|SI_FL_ERR)) &&
+		    !((si_f->flags | si_b->flags) & (SI_FL_EXP|SI_FL_ERR)) &&
 		    ((t->state & TASK_WOKEN_ANY) == TASK_WOKEN_TIMER))
 			goto update_exp_and_leave;
 	}
@@ -1820,12 +1828,12 @@
 	 * connection setup code must be able to deal with any type of abort.
 	 */
 	srv = objt_server(s->target);
-	if (unlikely(s->si[0].flags & SI_FL_ERR)) {
-		if (s->si[0].state == SI_ST_EST || s->si[0].state == SI_ST_DIS) {
-			si_shutr(&s->si[0]);
-			si_shutw(&s->si[0]);
-			stream_int_report_error(&s->si[0]);
-			if (!(s->req.analysers) && !(s->res.analysers)) {
+	if (unlikely(si_f->flags & SI_FL_ERR)) {
+		if (si_f->state == SI_ST_EST || si_f->state == SI_ST_DIS) {
+			si_shutr(si_f);
+			si_shutw(si_f);
+			stream_int_report_error(si_f);
+			if (!(req->analysers) && !(res->analysers)) {
 				s->be->be_counters.cli_aborts++;
 				s->fe->fe_counters.cli_aborts++;
 				if (srv)
@@ -1838,15 +1846,15 @@
 		}
 	}
 
-	if (unlikely(s->si[1].flags & SI_FL_ERR)) {
-		if (s->si[1].state == SI_ST_EST || s->si[1].state == SI_ST_DIS) {
-			si_shutr(&s->si[1]);
-			si_shutw(&s->si[1]);
-			stream_int_report_error(&s->si[1]);
+	if (unlikely(si_b->flags & SI_FL_ERR)) {
+		if (si_b->state == SI_ST_EST || si_b->state == SI_ST_DIS) {
+			si_shutr(si_b);
+			si_shutw(si_b);
+			stream_int_report_error(si_b);
 			s->be->be_counters.failed_resp++;
 			if (srv)
 				srv->counters.failed_resp++;
-			if (!(s->req.analysers) && !(s->res.analysers)) {
+			if (!(req->analysers) && !(res->analysers)) {
 				s->be->be_counters.srv_aborts++;
 				s->fe->fe_counters.srv_aborts++;
 				if (srv)
@@ -1860,14 +1868,14 @@
 		/* note: maybe we should process connection errors here ? */
 	}
 
-	if (s->si[1].state == SI_ST_CON) {
+	if (si_b->state == SI_ST_CON) {
 		/* we were trying to establish a connection on the server side,
 		 * maybe it succeeded, maybe it failed, maybe we timed out, ...
 		 */
-		if (unlikely(!sess_update_st_con_tcp(s, &s->si[1])))
-			sess_update_st_cer(s, &s->si[1]);
-		else if (s->si[1].state == SI_ST_EST)
-			sess_establish(s, &s->si[1]);
+		if (unlikely(!sess_update_st_con_tcp(s, si_b)))
+			sess_update_st_cer(s, si_b);
+		else if (si_b->state == SI_ST_EST)
+			sess_establish(s, si_b);
 
 		/* state is now one of SI_ST_CON (still in progress), SI_ST_EST
 		 * (established), SI_ST_DIS (abort), SI_ST_CLO (last error),
@@ -1875,10 +1883,10 @@
 		 */
 	}
 
-	rq_prod_last = s->si[0].state;
-	rq_cons_last = s->si[1].state;
-	rp_cons_last = s->si[0].state;
-	rp_prod_last = s->si[1].state;
+	rq_prod_last = si_f->state;
+	rq_cons_last = si_b->state;
+	rp_cons_last = si_f->state;
+	rp_prod_last = si_b->state;
 
  resync_stream_interface:
 	/* Check for connection closure */
@@ -1888,22 +1896,22 @@
 		now_ms, __FUNCTION__, __LINE__,
 		t,
 		s, s->flags,
-		s->req, s->rep,
-		s->req.rex, s->res.wex,
-		s->req.flags, s->res.flags,
-		s->req.buf->i, s->req.buf->o, s->res.buf->i, s->res.buf->o, s->si[0].state, s->si[1].state,
-		s->si[0].err_type, s->si[1].err_type,
-		s->si[1].conn_retries);
+		req, res,
+		req->rex, res->wex,
+		req->flags, res->flags,
+		req->buf->i, req->buf->o, res->buf->i, res->buf->o, si_f->state, si_b->state,
+		si_f->err_type, si_b->err_type,
+		si_b->conn_retries);
 
 	/* nothing special to be done on client side */
-	if (unlikely(s->si[0].state == SI_ST_DIS))
-		s->si[0].state = SI_ST_CLO;
+	if (unlikely(si_f->state == SI_ST_DIS))
+		si_f->state = SI_ST_CLO;
 
 	/* When a server-side connection is released, we have to count it and
 	 * check for pending connections on this server.
 	 */
-	if (unlikely(s->si[1].state == SI_ST_DIS)) {
-		s->si[1].state = SI_ST_CLO;
+	if (unlikely(si_b->state == SI_ST_DIS)) {
+		si_b->state = SI_ST_CLO;
 		srv = objt_server(s->target);
 		if (srv) {
 			if (s->flags & SN_CURR_SESS) {
@@ -1923,14 +1931,14 @@
 
  resync_request:
 	/* Analyse request */
-	if (((s->req.flags & ~rqf_last) & CF_MASK_ANALYSER) ||
-	    ((s->req.flags ^ rqf_last) & CF_MASK_STATIC) ||
-	    s->si[0].state != rq_prod_last ||
-	    s->si[1].state != rq_cons_last ||
+	if (((req->flags & ~rqf_last) & CF_MASK_ANALYSER) ||
+	    ((req->flags ^ rqf_last) & CF_MASK_STATIC) ||
+	    si_f->state != rq_prod_last ||
+	    si_b->state != rq_cons_last ||
 	    s->task->state & TASK_WOKEN_MSG) {
-		unsigned int flags = s->req.flags;
+		unsigned int flags = req->flags;
 
-		if (s->si[0].state >= SI_ST_EST) {
+		if (si_f->state >= SI_ST_EST) {
 			int max_loops = global.tune.maxpollevents;
 			unsigned int ana_list;
 			unsigned int ana_back;
@@ -1941,12 +1949,12 @@
 			 * enabling them again when it disables itself, so
 			 * that other analysers are called in similar conditions.
 			 */
-			channel_auto_read(&s->req);
-			channel_auto_connect(&s->req);
-			channel_auto_close(&s->req);
+			channel_auto_read(req);
+			channel_auto_connect(req);
+			channel_auto_close(req);
 
 			/* We will call all analysers for which a bit is set in
-			 * s->req.analysers, following the bit order from LSB
+			 * req->analysers, following the bit order from LSB
 			 * to MSB. The analysers must remove themselves from
 			 * the list when not needed. Any analyser may return 0
 			 * to break out of the loop, either because of missing
@@ -1979,97 +1987,97 @@
 			 * analyser and must immediately loop again.
 			 */
 
-			ana_list = ana_back = s->req.analysers;
+			ana_list = ana_back = req->analysers;
 			while (ana_list && max_loops--) {
 				/* Warning! ensure that analysers are always placed in ascending order! */
 
 				if (ana_list & AN_REQ_INSPECT_FE) {
-					if (!tcp_inspect_request(s, &s->req, AN_REQ_INSPECT_FE))
+					if (!tcp_inspect_request(s, req, AN_REQ_INSPECT_FE))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_INSPECT_FE);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_INSPECT_FE);
 				}
 
 				if (ana_list & AN_REQ_WAIT_HTTP) {
-					if (!http_wait_for_request(s, &s->req, AN_REQ_WAIT_HTTP))
+					if (!http_wait_for_request(s, req, AN_REQ_WAIT_HTTP))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_WAIT_HTTP);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_WAIT_HTTP);
 				}
 
 				if (ana_list & AN_REQ_HTTP_PROCESS_FE) {
-					if (!http_process_req_common(s, &s->req, AN_REQ_HTTP_PROCESS_FE, s->fe))
+					if (!http_process_req_common(s, req, AN_REQ_HTTP_PROCESS_FE, s->fe))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_HTTP_PROCESS_FE);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_HTTP_PROCESS_FE);
 				}
 
 				if (ana_list & AN_REQ_SWITCHING_RULES) {
-					if (!process_switching_rules(s, &s->req, AN_REQ_SWITCHING_RULES))
+					if (!process_switching_rules(s, req, AN_REQ_SWITCHING_RULES))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_SWITCHING_RULES);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_SWITCHING_RULES);
 				}
 
 				if (ana_list & AN_REQ_INSPECT_BE) {
-					if (!tcp_inspect_request(s, &s->req, AN_REQ_INSPECT_BE))
+					if (!tcp_inspect_request(s, req, AN_REQ_INSPECT_BE))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_INSPECT_BE);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_INSPECT_BE);
 				}
 
 				if (ana_list & AN_REQ_HTTP_PROCESS_BE) {
-					if (!http_process_req_common(s, &s->req, AN_REQ_HTTP_PROCESS_BE, s->be))
+					if (!http_process_req_common(s, req, AN_REQ_HTTP_PROCESS_BE, s->be))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_HTTP_PROCESS_BE);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_HTTP_PROCESS_BE);
 				}
 
 				if (ana_list & AN_REQ_HTTP_TARPIT) {
-					if (!http_process_tarpit(s, &s->req, AN_REQ_HTTP_TARPIT))
+					if (!http_process_tarpit(s, req, AN_REQ_HTTP_TARPIT))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_HTTP_TARPIT);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_HTTP_TARPIT);
 				}
 
 				if (ana_list & AN_REQ_SRV_RULES) {
-					if (!process_server_rules(s, &s->req, AN_REQ_SRV_RULES))
+					if (!process_server_rules(s, req, AN_REQ_SRV_RULES))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_SRV_RULES);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_SRV_RULES);
 				}
 
 				if (ana_list & AN_REQ_HTTP_INNER) {
-					if (!http_process_request(s, &s->req, AN_REQ_HTTP_INNER))
+					if (!http_process_request(s, req, AN_REQ_HTTP_INNER))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_HTTP_INNER);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_HTTP_INNER);
 				}
 
 				if (ana_list & AN_REQ_HTTP_BODY) {
-					if (!http_wait_for_request_body(s, &s->req, AN_REQ_HTTP_BODY))
+					if (!http_wait_for_request_body(s, req, AN_REQ_HTTP_BODY))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_HTTP_BODY);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_HTTP_BODY);
 				}
 
 				if (ana_list & AN_REQ_PRST_RDP_COOKIE) {
-					if (!tcp_persist_rdp_cookie(s, &s->req, AN_REQ_PRST_RDP_COOKIE))
+					if (!tcp_persist_rdp_cookie(s, req, AN_REQ_PRST_RDP_COOKIE))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_PRST_RDP_COOKIE);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_PRST_RDP_COOKIE);
 				}
 
 				if (ana_list & AN_REQ_STICKING_RULES) {
-					if (!process_sticking_rules(s, &s->req, AN_REQ_STICKING_RULES))
+					if (!process_sticking_rules(s, req, AN_REQ_STICKING_RULES))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_STICKING_RULES);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_STICKING_RULES);
 				}
 
 				if (ana_list & AN_REQ_HTTP_XFER_BODY) {
-					if (!http_request_forward_body(s, &s->req, AN_REQ_HTTP_XFER_BODY))
+					if (!http_request_forward_body(s, req, AN_REQ_HTTP_XFER_BODY))
 						break;
-					UPDATE_ANALYSERS(s->req.analysers, ana_list, ana_back, AN_REQ_HTTP_XFER_BODY);
+					UPDATE_ANALYSERS(req->analysers, ana_list, ana_back, AN_REQ_HTTP_XFER_BODY);
 				}
 				break;
 			}
 		}
 
-		rq_prod_last = s->si[0].state;
-		rq_cons_last = s->si[1].state;
-		s->req.flags &= ~CF_WAKE_ONCE;
-		rqf_last = s->req.flags;
+		rq_prod_last = si_f->state;
+		rq_cons_last = si_b->state;
+		req->flags &= ~CF_WAKE_ONCE;
+		rqf_last = req->flags;
 
-		if ((s->req.flags ^ flags) & CF_MASK_STATIC)
+		if ((req->flags ^ flags) & CF_MASK_STATIC)
 			goto resync_request;
 	}
 
@@ -2077,31 +2085,31 @@
 	 * because some response analysers may indirectly enable new request
 	 * analysers (eg: HTTP keep-alive).
 	 */
-	req_ana_back = s->req.analysers;
+	req_ana_back = req->analysers;
 
  resync_response:
 	/* Analyse response */
 
-	if (((s->res.flags & ~rpf_last) & CF_MASK_ANALYSER) ||
-		 (s->res.flags ^ rpf_last) & CF_MASK_STATIC ||
-		 s->si[0].state != rp_cons_last ||
-		 s->si[1].state != rp_prod_last ||
+	if (((res->flags & ~rpf_last) & CF_MASK_ANALYSER) ||
+		 (res->flags ^ rpf_last) & CF_MASK_STATIC ||
+		 si_f->state != rp_cons_last ||
+		 si_b->state != rp_prod_last ||
 		 s->task->state & TASK_WOKEN_MSG) {
-		unsigned int flags = s->res.flags;
+		unsigned int flags = res->flags;
 
-		if ((s->res.flags & CF_MASK_ANALYSER) &&
-		    (s->res.analysers & AN_REQ_ALL)) {
+		if ((res->flags & CF_MASK_ANALYSER) &&
+		    (res->analysers & AN_REQ_ALL)) {
 			/* Due to HTTP pipelining, the HTTP request analyser might be waiting
 			 * for some free space in the response buffer, so we might need to call
 			 * it when something changes in the response buffer, but still we pass
 			 * it the request buffer. Note that the SI state might very well still
 			 * be zero due to us returning a flow of redirects!
 			 */
-			s->res.analysers &= ~AN_REQ_ALL;
-			s->req.flags |= CF_WAKE_ONCE;
+			res->analysers &= ~AN_REQ_ALL;
+			req->flags |= CF_WAKE_ONCE;
 		}
 
-		if (s->si[1].state >= SI_ST_EST) {
+		if (si_b->state >= SI_ST_EST) {
 			int max_loops = global.tune.maxpollevents;
 			unsigned int ana_list;
 			unsigned int ana_back;
@@ -2112,11 +2120,11 @@
 			 * it disables itself, so that other analysers are called
 			 * in similar conditions.
 			 */
-			channel_auto_read(&s->res);
-			channel_auto_close(&s->res);
+			channel_auto_read(res);
+			channel_auto_close(res);
 
 			/* We will call all analysers for which a bit is set in
-			 * s->res.analysers, following the bit order from LSB
+			 * res->analysers, following the bit order from LSB
 			 * to MSB. The analysers must remove themselves from
 			 * the list when not needed. Any analyser may return 0
 			 * to break out of the loop, either because of missing
@@ -2126,56 +2134,56 @@
 			 * are added in the middle.
 			 */
 
-			ana_list = ana_back = s->res.analysers;
+			ana_list = ana_back = res->analysers;
 			while (ana_list && max_loops--) {
 				/* Warning! ensure that analysers are always placed in ascending order! */
 
 				if (ana_list & AN_RES_INSPECT) {
-					if (!tcp_inspect_response(s, &s->res, AN_RES_INSPECT))
+					if (!tcp_inspect_response(s, res, AN_RES_INSPECT))
 						break;
-					UPDATE_ANALYSERS(s->res.analysers, ana_list, ana_back, AN_RES_INSPECT);
+					UPDATE_ANALYSERS(res->analysers, ana_list, ana_back, AN_RES_INSPECT);
 				}
 
 				if (ana_list & AN_RES_WAIT_HTTP) {
-					if (!http_wait_for_response(s, &s->res, AN_RES_WAIT_HTTP))
+					if (!http_wait_for_response(s, res, AN_RES_WAIT_HTTP))
 						break;
-					UPDATE_ANALYSERS(s->res.analysers, ana_list, ana_back, AN_RES_WAIT_HTTP);
+					UPDATE_ANALYSERS(res->analysers, ana_list, ana_back, AN_RES_WAIT_HTTP);
 				}
 
 				if (ana_list & AN_RES_STORE_RULES) {
-					if (!process_store_rules(s, &s->res, AN_RES_STORE_RULES))
+					if (!process_store_rules(s, res, AN_RES_STORE_RULES))
 						break;
-					UPDATE_ANALYSERS(s->res.analysers, ana_list, ana_back, AN_RES_STORE_RULES);
+					UPDATE_ANALYSERS(res->analysers, ana_list, ana_back, AN_RES_STORE_RULES);
 				}
 
 				if (ana_list & AN_RES_HTTP_PROCESS_BE) {
-					if (!http_process_res_common(s, &s->res, AN_RES_HTTP_PROCESS_BE, s->be))
+					if (!http_process_res_common(s, res, AN_RES_HTTP_PROCESS_BE, s->be))
 						break;
-					UPDATE_ANALYSERS(s->res.analysers, ana_list, ana_back, AN_RES_HTTP_PROCESS_BE);
+					UPDATE_ANALYSERS(res->analysers, ana_list, ana_back, AN_RES_HTTP_PROCESS_BE);
 				}
 
 				if (ana_list & AN_RES_HTTP_XFER_BODY) {
-					if (!http_response_forward_body(s, &s->res, AN_RES_HTTP_XFER_BODY))
+					if (!http_response_forward_body(s, res, AN_RES_HTTP_XFER_BODY))
 						break;
-					UPDATE_ANALYSERS(s->res.analysers, ana_list, ana_back, AN_RES_HTTP_XFER_BODY);
+					UPDATE_ANALYSERS(res->analysers, ana_list, ana_back, AN_RES_HTTP_XFER_BODY);
 				}
 				break;
 			}
 		}
 
-		rp_cons_last = s->si[0].state;
-		rp_prod_last = s->si[1].state;
-		rpf_last = s->res.flags;
+		rp_cons_last = si_f->state;
+		rp_prod_last = si_b->state;
+		rpf_last = res->flags;
 
-		if ((s->res.flags ^ flags) & CF_MASK_STATIC)
+		if ((res->flags ^ flags) & CF_MASK_STATIC)
 			goto resync_response;
 	}
 
 	/* maybe someone has added some request analysers, so we must check and loop */
-	if (s->req.analysers & ~req_ana_back)
+	if (req->analysers & ~req_ana_back)
 		goto resync_request;
 
-	if ((s->req.flags & ~rqf_last) & CF_MASK_ANALYSER)
+	if ((req->flags & ~rqf_last) & CF_MASK_ANALYSER)
 		goto resync_request;
 
 	/* FIXME: here we should call protocol handlers which rely on
@@ -2190,24 +2198,24 @@
 	 */
 	srv = objt_server(s->target);
 	if (unlikely(!(s->flags & SN_ERR_MASK))) {
-		if (s->req.flags & (CF_READ_ERROR|CF_READ_TIMEOUT|CF_WRITE_ERROR|CF_WRITE_TIMEOUT)) {
+		if (req->flags & (CF_READ_ERROR|CF_READ_TIMEOUT|CF_WRITE_ERROR|CF_WRITE_TIMEOUT)) {
 			/* Report it if the client got an error or a read timeout expired */
-			s->req.analysers = 0;
-			if (s->req.flags & CF_READ_ERROR) {
+			req->analysers = 0;
+			if (req->flags & CF_READ_ERROR) {
 				s->be->be_counters.cli_aborts++;
 				s->fe->fe_counters.cli_aborts++;
 				if (srv)
 					srv->counters.cli_aborts++;
 				s->flags |= SN_ERR_CLICL;
 			}
-			else if (s->req.flags & CF_READ_TIMEOUT) {
+			else if (req->flags & CF_READ_TIMEOUT) {
 				s->be->be_counters.cli_aborts++;
 				s->fe->fe_counters.cli_aborts++;
 				if (srv)
 					srv->counters.cli_aborts++;
 				s->flags |= SN_ERR_CLITO;
 			}
-			else if (s->req.flags & CF_WRITE_ERROR) {
+			else if (req->flags & CF_WRITE_ERROR) {
 				s->be->be_counters.srv_aborts++;
 				s->fe->fe_counters.srv_aborts++;
 				if (srv)
@@ -2223,24 +2231,24 @@
 			}
 			sess_set_term_flags(s);
 		}
-		else if (s->res.flags & (CF_READ_ERROR|CF_READ_TIMEOUT|CF_WRITE_ERROR|CF_WRITE_TIMEOUT)) {
+		else if (res->flags & (CF_READ_ERROR|CF_READ_TIMEOUT|CF_WRITE_ERROR|CF_WRITE_TIMEOUT)) {
 			/* Report it if the server got an error or a read timeout expired */
-			s->res.analysers = 0;
-			if (s->res.flags & CF_READ_ERROR) {
+			res->analysers = 0;
+			if (res->flags & CF_READ_ERROR) {
 				s->be->be_counters.srv_aborts++;
 				s->fe->fe_counters.srv_aborts++;
 				if (srv)
 					srv->counters.srv_aborts++;
 				s->flags |= SN_ERR_SRVCL;
 			}
-			else if (s->res.flags & CF_READ_TIMEOUT) {
+			else if (res->flags & CF_READ_TIMEOUT) {
 				s->be->be_counters.srv_aborts++;
 				s->fe->fe_counters.srv_aborts++;
 				if (srv)
 					srv->counters.srv_aborts++;
 				s->flags |= SN_ERR_SRVTO;
 			}
-			else if (s->res.flags & CF_WRITE_ERROR) {
+			else if (res->flags & CF_WRITE_ERROR) {
 				s->be->be_counters.cli_aborts++;
 				s->fe->fe_counters.cli_aborts++;
 				if (srv)
@@ -2269,41 +2277,41 @@
 	 * Note that we're checking CF_SHUTR_NOW as an indication of a possible
 	 * recent call to channel_abort().
 	 */
-	if (unlikely(!s->req.analysers &&
-	    !(s->req.flags & (CF_SHUTW|CF_SHUTR_NOW)) &&
-	    (s->si[0].state >= SI_ST_EST) &&
-	    (s->req.to_forward != CHN_INFINITE_FORWARD))) {
+	if (unlikely(!req->analysers &&
+	    !(req->flags & (CF_SHUTW|CF_SHUTR_NOW)) &&
+	    (si_f->state >= SI_ST_EST) &&
+	    (req->to_forward != CHN_INFINITE_FORWARD))) {
 		/* This buffer is freewheeling, there's no analyser
 		 * attached to it. If any data are left in, we'll permit them to
 		 * move.
 		 */
-		channel_auto_read(&s->req);
-		channel_auto_connect(&s->req);
-		channel_auto_close(&s->req);
-		buffer_flush(s->req.buf);
+		channel_auto_read(req);
+		channel_auto_connect(req);
+		channel_auto_close(req);
+		buffer_flush(req->buf);
 
 		/* We'll let data flow between the producer (if still connected)
 		 * to the consumer (which might possibly not be connected yet).
 		 */
-		if (!(s->req.flags & (CF_SHUTR|CF_SHUTW_NOW)))
-			channel_forward(&s->req, CHN_INFINITE_FORWARD);
+		if (!(req->flags & (CF_SHUTR|CF_SHUTW_NOW)))
+			channel_forward(req, CHN_INFINITE_FORWARD);
 	}
 
 	/* check if it is wise to enable kernel splicing to forward request data */
-	if (!(s->req.flags & (CF_KERN_SPLICING|CF_SHUTR)) &&
-	    s->req.to_forward &&
+	if (!(req->flags & (CF_KERN_SPLICING|CF_SHUTR)) &&
+	    req->to_forward &&
 	    (global.tune.options & GTUNE_USE_SPLICE) &&
-	    (objt_conn(s->si[0].end) && __objt_conn(s->si[0].end)->xprt && __objt_conn(s->si[0].end)->xprt->rcv_pipe) &&
-	    (objt_conn(s->si[1].end) && __objt_conn(s->si[1].end)->xprt && __objt_conn(s->si[1].end)->xprt->snd_pipe) &&
+	    (objt_conn(si_f->end) && __objt_conn(si_f->end)->xprt && __objt_conn(si_f->end)->xprt->rcv_pipe) &&
+	    (objt_conn(si_b->end) && __objt_conn(si_b->end)->xprt && __objt_conn(si_b->end)->xprt->snd_pipe) &&
 	    (pipes_used < global.maxpipes) &&
 	    (((s->fe->options2|s->be->options2) & PR_O2_SPLIC_REQ) ||
 	     (((s->fe->options2|s->be->options2) & PR_O2_SPLIC_AUT) &&
-	      (s->req.flags & CF_STREAMER_FAST)))) {
-		s->req.flags |= CF_KERN_SPLICING;
+	      (req->flags & CF_STREAMER_FAST)))) {
+		req->flags |= CF_KERN_SPLICING;
 	}
 
 	/* reflect what the L7 analysers have seen last */
-	rqf_last = s->req.flags;
+	rqf_last = req->flags;
 
 	/*
 	 * Now forward all shutdown requests between both sides of the buffer
@@ -2314,40 +2322,40 @@
 	 * once the server has begun to respond. If a half-closed timeout is set, we adjust
 	 * the other side's timeout as well.
 	 */
-	if (unlikely((s->req.flags & (CF_SHUTW|CF_SHUTW_NOW|CF_AUTO_CLOSE|CF_SHUTR)) ==
+	if (unlikely((req->flags & (CF_SHUTW|CF_SHUTW_NOW|CF_AUTO_CLOSE|CF_SHUTR)) ==
 		     (CF_AUTO_CLOSE|CF_SHUTR))) {
-		channel_shutw_now(&s->req);
+		channel_shutw_now(req);
 		if (tick_isset(s->fe->timeout.clientfin)) {
-			s->res.wto = s->fe->timeout.clientfin;
-			s->res.wex = tick_add(now_ms, s->res.wto);
+			res->wto = s->fe->timeout.clientfin;
+			res->wex = tick_add(now_ms, res->wto);
 		}
 	}
 
 	/* shutdown(write) pending */
-	if (unlikely((s->req.flags & (CF_SHUTW|CF_SHUTW_NOW)) == CF_SHUTW_NOW &&
-		     channel_is_empty(&s->req))) {
-		if (s->req.flags & CF_READ_ERROR)
-			s->si[1].flags |= SI_FL_NOLINGER;
-		si_shutw(&s->si[1]);
+	if (unlikely((req->flags & (CF_SHUTW|CF_SHUTW_NOW)) == CF_SHUTW_NOW &&
+		     channel_is_empty(req))) {
+		if (req->flags & CF_READ_ERROR)
+			si_b->flags |= SI_FL_NOLINGER;
+		si_shutw(si_b);
 		if (tick_isset(s->be->timeout.serverfin)) {
-			s->res.rto = s->be->timeout.serverfin;
-			s->res.rex = tick_add(now_ms, s->res.rto);
+			res->rto = s->be->timeout.serverfin;
+			res->rex = tick_add(now_ms, res->rto);
 		}
 	}
 
 	/* shutdown(write) done on server side, we must stop the client too */
-	if (unlikely((s->req.flags & (CF_SHUTW|CF_SHUTR|CF_SHUTR_NOW)) == CF_SHUTW &&
-		     !s->req.analysers))
-		channel_shutr_now(&s->req);
+	if (unlikely((req->flags & (CF_SHUTW|CF_SHUTR|CF_SHUTR_NOW)) == CF_SHUTW &&
+		     !req->analysers))
+		channel_shutr_now(req);
 
 	/* shutdown(read) pending */
-	if (unlikely((s->req.flags & (CF_SHUTR|CF_SHUTR_NOW)) == CF_SHUTR_NOW)) {
-		if (s->si[0].flags & SI_FL_NOHALF)
-			s->si[0].flags |= SI_FL_NOLINGER;
-		si_shutr(&s->si[0]);
+	if (unlikely((req->flags & (CF_SHUTR|CF_SHUTR_NOW)) == CF_SHUTR_NOW)) {
+		if (si_f->flags & SI_FL_NOHALF)
+			si_f->flags |= SI_FL_NOLINGER;
+		si_shutr(si_f);
 		if (tick_isset(s->fe->timeout.clientfin)) {
-			s->res.wto = s->fe->timeout.clientfin;
-			s->res.wex = tick_add(now_ms, s->res.wto);
+			res->wto = s->fe->timeout.clientfin;
+			res->wex = tick_add(now_ms, res->wto);
 		}
 	}
 
@@ -2356,21 +2364,21 @@
 	 *  - there are data scheduled for emission in the buffer
 	 *  - the CF_AUTO_CONNECT flag is set (active connection)
 	 */
-	if (s->si[1].state == SI_ST_INI) {
-		if (!(s->req.flags & CF_SHUTW)) {
-			if ((s->req.flags & CF_AUTO_CONNECT) || !channel_is_empty(&s->req)) {
+	if (si_b->state == SI_ST_INI) {
+		if (!(req->flags & CF_SHUTW)) {
+			if ((req->flags & CF_AUTO_CONNECT) || !channel_is_empty(req)) {
 				/* If we have an appctx, there is no connect method, so we
 				 * immediately switch to the connected state, otherwise we
 				 * perform a connection request.
 				 */
-				s->si[1].state = SI_ST_REQ; /* new connection requested */
-				s->si[1].conn_retries = s->be->conn_retries;
+				si_b->state = SI_ST_REQ; /* new connection requested */
+				si_b->conn_retries = s->be->conn_retries;
 			}
 		}
 		else {
-			s->si[1].state = SI_ST_CLO; /* shutw+ini = abort */
-			channel_shutw_now(&s->req);        /* fix buffer flags upon abort */
-			channel_shutr_now(&s->res);
+			si_b->state = SI_ST_CLO; /* shutw+ini = abort */
+			channel_shutw_now(req);        /* fix buffer flags upon abort */
+			channel_shutr_now(res);
 		}
 	}
 
@@ -2378,26 +2386,26 @@
 	/* we may have a pending connection request, or a connection waiting
 	 * for completion.
 	 */
-	if (s->si[1].state >= SI_ST_REQ && s->si[1].state < SI_ST_CON) {
+	if (si_b->state >= SI_ST_REQ && si_b->state < SI_ST_CON) {
 		do {
 			/* nb: step 1 might switch from QUE to ASS, but we first want
 			 * to give a chance to step 2 to perform a redirect if needed.
 			 */
-			if (s->si[1].state != SI_ST_REQ)
-				sess_update_stream_int(s, &s->si[1]);
-			if (s->si[1].state == SI_ST_REQ)
-				sess_prepare_conn_req(s, &s->si[1]);
+			if (si_b->state != SI_ST_REQ)
+				sess_update_stream_int(s, si_b);
+			if (si_b->state == SI_ST_REQ)
+				sess_prepare_conn_req(s, si_b);
 
 			/* applets directly go to the ESTABLISHED state. Similarly,
 			 * servers experience the same fate when their connection
 			 * is reused.
 			 */
-			if (unlikely(s->si[1].state == SI_ST_EST))
-				sess_establish(s, &s->si[1]);
+			if (unlikely(si_b->state == SI_ST_EST))
+				sess_establish(s, si_b);
 
 			/* 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) &&
+			if ((si_b->state >= SI_ST_CON) &&
 			    (s->be->server_id_hdr_name != NULL) &&
 			    (s->be->mode == PR_MODE_HTTP) &&
 			    objt_server(s->target)) {
@@ -2405,17 +2413,17 @@
 			}
 
 			srv = objt_server(s->target);
-			if (s->si[1].state == SI_ST_ASS && srv && srv->rdr_len && (s->flags & SN_REDIRECTABLE))
-				http_perform_server_redirect(s, &s->si[1]);
-		} while (s->si[1].state == SI_ST_ASS);
+			if (si_b->state == SI_ST_ASS && srv && srv->rdr_len && (s->flags & SN_REDIRECTABLE))
+				http_perform_server_redirect(s, si_b);
+		} while (si_b->state == SI_ST_ASS);
 	}
 
 	/* Benchmarks have shown that it's optimal to do a full resync now */
-	if (s->si[0].state == SI_ST_DIS || s->si[1].state == SI_ST_DIS)
+	if (si_f->state == SI_ST_DIS || si_b->state == SI_ST_DIS)
 		goto resync_stream_interface;
 
 	/* otherwise we want to check if we need to resync the req buffer or not */
-	if ((s->req.flags ^ rqf_last) & CF_MASK_STATIC)
+	if ((req->flags ^ rqf_last) & CF_MASK_STATIC)
 		goto resync_request;
 
 	/* perform output updates to the response buffer */
@@ -2425,63 +2433,63 @@
 	 * Note that we're checking CF_SHUTR_NOW as an indication of a possible
 	 * recent call to channel_abort().
 	 */
-	if (unlikely(!s->res.analysers &&
-	    !(s->res.flags & (CF_SHUTW|CF_SHUTR_NOW)) &&
-	    (s->si[1].state >= SI_ST_EST) &&
-	    (s->res.to_forward != CHN_INFINITE_FORWARD))) {
+	if (unlikely(!res->analysers &&
+	    !(res->flags & (CF_SHUTW|CF_SHUTR_NOW)) &&
+	    (si_b->state >= SI_ST_EST) &&
+	    (res->to_forward != CHN_INFINITE_FORWARD))) {
 		/* This buffer is freewheeling, there's no analyser
 		 * attached to it. If any data are left in, we'll permit them to
 		 * move.
 		 */
-		channel_auto_read(&s->res);
-		channel_auto_close(&s->res);
-		buffer_flush(s->res.buf);
+		channel_auto_read(res);
+		channel_auto_close(res);
+		buffer_flush(res->buf);
 
 		/* We'll let data flow between the producer (if still connected)
 		 * to the consumer.
 		 */
-		if (!(s->res.flags & (CF_SHUTR|CF_SHUTW_NOW)))
-			channel_forward(&s->res, CHN_INFINITE_FORWARD);
+		if (!(res->flags & (CF_SHUTR|CF_SHUTW_NOW)))
+			channel_forward(res, CHN_INFINITE_FORWARD);
 
 		/* if we have no analyser anymore in any direction and have a
 		 * tunnel timeout set, use it now. Note that we must respect
 		 * the half-closed timeouts as well.
 		 */
-		if (!s->req.analysers && s->be->timeout.tunnel) {
-			s->req.rto = s->req.wto = s->res.rto = s->res.wto =
+		if (!req->analysers && s->be->timeout.tunnel) {
+			req->rto = req->wto = res->rto = res->wto =
 				s->be->timeout.tunnel;
 
-			if ((s->req.flags & CF_SHUTR) && tick_isset(s->fe->timeout.clientfin))
-				s->res.wto = s->fe->timeout.clientfin;
-			if ((s->req.flags & CF_SHUTW) && tick_isset(s->be->timeout.serverfin))
-				s->res.rto = s->be->timeout.serverfin;
-			if ((s->res.flags & CF_SHUTR) && tick_isset(s->be->timeout.serverfin))
-				s->req.wto = s->be->timeout.serverfin;
-			if ((s->res.flags & CF_SHUTW) && tick_isset(s->fe->timeout.clientfin))
-				s->req.rto = s->fe->timeout.clientfin;
+			if ((req->flags & CF_SHUTR) && tick_isset(s->fe->timeout.clientfin))
+				res->wto = s->fe->timeout.clientfin;
+			if ((req->flags & CF_SHUTW) && tick_isset(s->be->timeout.serverfin))
+				res->rto = s->be->timeout.serverfin;
+			if ((res->flags & CF_SHUTR) && tick_isset(s->be->timeout.serverfin))
+				req->wto = s->be->timeout.serverfin;
+			if ((res->flags & CF_SHUTW) && tick_isset(s->fe->timeout.clientfin))
+				req->rto = s->fe->timeout.clientfin;
 
-			s->req.rex = tick_add(now_ms, s->req.rto);
-			s->req.wex = tick_add(now_ms, s->req.wto);
-			s->res.rex = tick_add(now_ms, s->res.rto);
-			s->res.wex = tick_add(now_ms, s->res.wto);
+			req->rex = tick_add(now_ms, req->rto);
+			req->wex = tick_add(now_ms, req->wto);
+			res->rex = tick_add(now_ms, res->rto);
+			res->wex = tick_add(now_ms, res->wto);
 		}
 	}
 
 	/* check if it is wise to enable kernel splicing to forward response data */
-	if (!(s->res.flags & (CF_KERN_SPLICING|CF_SHUTR)) &&
-	    s->res.to_forward &&
+	if (!(res->flags & (CF_KERN_SPLICING|CF_SHUTR)) &&
+	    res->to_forward &&
 	    (global.tune.options & GTUNE_USE_SPLICE) &&
-	    (objt_conn(s->si[0].end) && __objt_conn(s->si[0].end)->xprt && __objt_conn(s->si[0].end)->xprt->snd_pipe) &&
-	    (objt_conn(s->si[1].end) && __objt_conn(s->si[1].end)->xprt && __objt_conn(s->si[1].end)->xprt->rcv_pipe) &&
+	    (objt_conn(si_f->end) && __objt_conn(si_f->end)->xprt && __objt_conn(si_f->end)->xprt->snd_pipe) &&
+	    (objt_conn(si_b->end) && __objt_conn(si_b->end)->xprt && __objt_conn(si_b->end)->xprt->rcv_pipe) &&
 	    (pipes_used < global.maxpipes) &&
 	    (((s->fe->options2|s->be->options2) & PR_O2_SPLIC_RTR) ||
 	     (((s->fe->options2|s->be->options2) & PR_O2_SPLIC_AUT) &&
-	      (s->res.flags & CF_STREAMER_FAST)))) {
-		s->res.flags |= CF_KERN_SPLICING;
+	      (res->flags & CF_STREAMER_FAST)))) {
+		res->flags |= CF_KERN_SPLICING;
 	}
 
 	/* reflect what the L7 analysers have seen last */
-	rpf_last = s->res.flags;
+	rpf_last = res->flags;
 
 	/*
 	 * Now forward all shutdown requests between both sides of the buffer
@@ -2492,53 +2500,53 @@
 	 */
 
 	/* first, let's check if the response buffer needs to shutdown(write) */
-	if (unlikely((s->res.flags & (CF_SHUTW|CF_SHUTW_NOW|CF_AUTO_CLOSE|CF_SHUTR)) ==
+	if (unlikely((res->flags & (CF_SHUTW|CF_SHUTW_NOW|CF_AUTO_CLOSE|CF_SHUTR)) ==
 		     (CF_AUTO_CLOSE|CF_SHUTR))) {
-		channel_shutw_now(&s->res);
+		channel_shutw_now(res);
 		if (tick_isset(s->be->timeout.serverfin)) {
-			s->req.wto = s->be->timeout.serverfin;
-			s->req.wex = tick_add(now_ms, s->req.wto);
+			req->wto = s->be->timeout.serverfin;
+			req->wex = tick_add(now_ms, req->wto);
 		}
 	}
 
 	/* shutdown(write) pending */
-	if (unlikely((s->res.flags & (CF_SHUTW|CF_SHUTW_NOW)) == CF_SHUTW_NOW &&
-		     channel_is_empty(&s->res))) {
-		si_shutw(&s->si[0]);
+	if (unlikely((res->flags & (CF_SHUTW|CF_SHUTW_NOW)) == CF_SHUTW_NOW &&
+		     channel_is_empty(res))) {
+		si_shutw(si_f);
 		if (tick_isset(s->fe->timeout.clientfin)) {
-			s->req.rto = s->fe->timeout.clientfin;
-			s->req.rex = tick_add(now_ms, s->req.rto);
+			req->rto = s->fe->timeout.clientfin;
+			req->rex = tick_add(now_ms, req->rto);
 		}
 	}
 
 	/* shutdown(write) done on the client side, we must stop the server too */
-	if (unlikely((s->res.flags & (CF_SHUTW|CF_SHUTR|CF_SHUTR_NOW)) == CF_SHUTW) &&
-	    !s->res.analysers)
-		channel_shutr_now(&s->res);
+	if (unlikely((res->flags & (CF_SHUTW|CF_SHUTR|CF_SHUTR_NOW)) == CF_SHUTW) &&
+	    !res->analysers)
+		channel_shutr_now(res);
 
 	/* shutdown(read) pending */
-	if (unlikely((s->res.flags & (CF_SHUTR|CF_SHUTR_NOW)) == CF_SHUTR_NOW)) {
-		if (s->si[1].flags & SI_FL_NOHALF)
-			s->si[1].flags |= SI_FL_NOLINGER;
-		si_shutr(&s->si[1]);
+	if (unlikely((res->flags & (CF_SHUTR|CF_SHUTR_NOW)) == CF_SHUTR_NOW)) {
+		if (si_b->flags & SI_FL_NOHALF)
+			si_b->flags |= SI_FL_NOLINGER;
+		si_shutr(si_b);
 		if (tick_isset(s->be->timeout.serverfin)) {
-			s->req.wto = s->be->timeout.serverfin;
-			s->req.wex = tick_add(now_ms, s->req.wto);
+			req->wto = s->be->timeout.serverfin;
+			req->wex = tick_add(now_ms, req->wto);
 		}
 	}
 
-	if (s->si[0].state == SI_ST_DIS || s->si[1].state == SI_ST_DIS)
+	if (si_f->state == SI_ST_DIS || si_b->state == SI_ST_DIS)
 		goto resync_stream_interface;
 
-	if (s->req.flags != rqf_last)
+	if (req->flags != rqf_last)
 		goto resync_request;
 
-	if ((s->res.flags ^ rpf_last) & CF_MASK_STATIC)
+	if ((res->flags ^ rpf_last) & CF_MASK_STATIC)
 		goto resync_response;
 
 	/* we're interested in getting wakeups again */
-	s->si[0].flags &= ~SI_FL_DONT_WAKE;
-	s->si[1].flags &= ~SI_FL_DONT_WAKE;
+	si_f->flags &= ~SI_FL_DONT_WAKE;
+	si_b->flags &= ~SI_FL_DONT_WAKE;
 
 	/* This is needed only when debugging is enabled, to indicate
 	 * client-side or server-side close. Please note that in the unlikely
@@ -2548,43 +2556,43 @@
 	if (unlikely((global.mode & MODE_DEBUG) &&
 		     (!(global.mode & MODE_QUIET) ||
 		      (global.mode & MODE_VERBOSE)))) {
-		if (s->si[1].state == SI_ST_CLO &&
-		    s->si[1].prev_state == SI_ST_EST) {
+		if (si_b->state == SI_ST_CLO &&
+		    si_b->prev_state == SI_ST_EST) {
 			chunk_printf(&trash, "%08x:%s.srvcls[%04x:%04x]\n",
 				      s->uniq_id, s->be->id,
-			              objt_conn(s->si[0].end) ? (unsigned short)objt_conn(s->si[0].end)->t.sock.fd : -1,
-			              objt_conn(s->si[1].end) ? (unsigned short)objt_conn(s->si[1].end)->t.sock.fd : -1);
+			              objt_conn(si_f->end) ? (unsigned short)objt_conn(si_f->end)->t.sock.fd : -1,
+			              objt_conn(si_b->end) ? (unsigned short)objt_conn(si_b->end)->t.sock.fd : -1);
 			shut_your_big_mouth_gcc(write(1, trash.str, trash.len));
 		}
 
-		if (s->si[0].state == SI_ST_CLO &&
-		    s->si[0].prev_state == SI_ST_EST) {
+		if (si_f->state == SI_ST_CLO &&
+		    si_f->prev_state == SI_ST_EST) {
 			chunk_printf(&trash, "%08x:%s.clicls[%04x:%04x]\n",
 				      s->uniq_id, s->be->id,
-			              objt_conn(s->si[0].end) ? (unsigned short)objt_conn(s->si[0].end)->t.sock.fd : -1,
-			              objt_conn(s->si[1].end) ? (unsigned short)objt_conn(s->si[1].end)->t.sock.fd : -1);
+			              objt_conn(si_f->end) ? (unsigned short)objt_conn(si_f->end)->t.sock.fd : -1,
+			              objt_conn(si_b->end) ? (unsigned short)objt_conn(si_b->end)->t.sock.fd : -1);
 			shut_your_big_mouth_gcc(write(1, trash.str, trash.len));
 		}
 	}
 
-	if (likely((s->si[0].state != SI_ST_CLO) ||
-		   (s->si[1].state > SI_ST_INI && s->si[1].state < SI_ST_CLO))) {
+	if (likely((si_f->state != SI_ST_CLO) ||
+		   (si_b->state > SI_ST_INI && si_b->state < SI_ST_CLO))) {
 
 		if ((s->fe->options & PR_O_CONTSTATS) && (s->flags & SN_BE_ASSIGNED))
 			session_process_counters(s);
 
-		if (s->si[0].state == SI_ST_EST && obj_type(s->si[0].end) != OBJ_TYPE_APPCTX)
-			si_update(&s->si[0]);
+		if (si_f->state == SI_ST_EST && obj_type(si_f->end) != OBJ_TYPE_APPCTX)
+			si_update(si_f);
 
-		if (s->si[1].state == SI_ST_EST && obj_type(s->si[1].end) != OBJ_TYPE_APPCTX)
-			si_update(&s->si[1]);
+		if (si_b->state == SI_ST_EST && obj_type(si_b->end) != OBJ_TYPE_APPCTX)
+			si_update(si_b);
 
-		s->req.flags &= ~(CF_READ_NULL|CF_READ_PARTIAL|CF_WRITE_NULL|CF_WRITE_PARTIAL|CF_READ_ATTACHED);
-		s->res.flags &= ~(CF_READ_NULL|CF_READ_PARTIAL|CF_WRITE_NULL|CF_WRITE_PARTIAL|CF_READ_ATTACHED);
-		s->si[0].prev_state = s->si[0].state;
-		s->si[1].prev_state = s->si[1].state;
-		s->si[0].flags &= ~(SI_FL_ERR|SI_FL_EXP);
-		s->si[1].flags &= ~(SI_FL_ERR|SI_FL_EXP);
+		req->flags &= ~(CF_READ_NULL|CF_READ_PARTIAL|CF_WRITE_NULL|CF_WRITE_PARTIAL|CF_READ_ATTACHED);
+		res->flags &= ~(CF_READ_NULL|CF_READ_PARTIAL|CF_WRITE_NULL|CF_WRITE_PARTIAL|CF_READ_ATTACHED);
+		si_f->prev_state = si_f->state;
+		si_b->prev_state = si_b->state;
+		si_f->flags &= ~(SI_FL_ERR|SI_FL_EXP);
+		si_b->flags &= ~(SI_FL_ERR|SI_FL_EXP);
 
 		/* Trick: if a request is being waiting for the server to respond,
 		 * and if we know the server can timeout, we don't want the timeout
@@ -2594,10 +2602,10 @@
 		 * request timeout is set and the server has not yet sent a response.
 		 */
 
-		if ((s->res.flags & (CF_AUTO_CLOSE|CF_SHUTR)) == 0 &&
-		    (tick_isset(s->req.wex) || tick_isset(s->res.rex))) {
-			s->req.flags |= CF_READ_NOEXP;
-			s->req.rex = TICK_ETERNITY;
+		if ((res->flags & (CF_AUTO_CLOSE|CF_SHUTR)) == 0 &&
+		    (tick_isset(req->wex) || tick_isset(res->rex))) {
+			req->flags |= CF_READ_NOEXP;
+			req->rex = TICK_ETERNITY;
 		}
 
 		/* When any of the stream interfaces is attached to an applet,
@@ -2609,7 +2617,7 @@
 		 * both functions are always called and that we wake up if at
 		 * least one did something.
 		 */
-		if ((si_applet_call(&s->si[1]) | si_applet_call(&s->si[0])) != 0) {
+		if ((si_applet_call(si_b) | si_applet_call(si_f)) != 0) {
 			if (task_in_rq(t)) {
 				t->expire = TICK_ETERNITY;
 				session_release_buffers(s);
@@ -2618,23 +2626,23 @@
 		}
 
 	update_exp_and_leave:
-		t->expire = tick_first(tick_first(s->req.rex, s->req.wex),
-				       tick_first(s->res.rex, s->res.wex));
-		if (s->req.analysers)
-			t->expire = tick_first(t->expire, s->req.analyse_exp);
+		t->expire = tick_first(tick_first(req->rex, req->wex),
+				       tick_first(res->rex, res->wex));
+		if (req->analysers)
+			t->expire = tick_first(t->expire, req->analyse_exp);
 
-		if (s->si[0].exp)
-			t->expire = tick_first(t->expire, s->si[0].exp);
+		if (si_f->exp)
+			t->expire = tick_first(t->expire, si_f->exp);
 
-		if (s->si[1].exp)
-			t->expire = tick_first(t->expire, s->si[1].exp);
+		if (si_b->exp)
+			t->expire = tick_first(t->expire, si_b->exp);
 
 #ifdef DEBUG_FULL
 		fprintf(stderr,
 			"[%u] queuing with exp=%u req->rex=%u req->wex=%u req->ana_exp=%u"
 			" rep->rex=%u rep->wex=%u, si[0].exp=%u, si[1].exp=%u, cs=%d, ss=%d\n",
-			now_ms, t->expire, s->req.rex, s->req.wex, s->req.analyse_exp,
-			s->res.rex, s->res.wex, s->si[0].exp, s->si[1].exp, s->si[0].state, s->si[1].state);
+			now_ms, t->expire, req->rex, req->wex, req->analyse_exp,
+			res->rex, res->wex, si_f->exp, si_b->exp, si_f->state, si_b->state);
 #endif
 
 #ifdef DEBUG_DEV
@@ -2670,8 +2678,8 @@
 		     (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) {
 		chunk_printf(&trash, "%08x:%s.closed[%04x:%04x]\n",
 			      s->uniq_id, s->be->id,
-		              objt_conn(s->si[0].end) ? (unsigned short)objt_conn(s->si[0].end)->t.sock.fd : -1,
-		              objt_conn(s->si[1].end) ? (unsigned short)objt_conn(s->si[1].end)->t.sock.fd : -1);
+		              objt_conn(si_f->end) ? (unsigned short)objt_conn(si_f->end)->t.sock.fd : -1,
+		              objt_conn(si_b->end) ? (unsigned short)objt_conn(si_b->end)->t.sock.fd : -1);
 		shut_your_big_mouth_gcc(write(1, trash.str, trash.len));
 	}
 
@@ -2702,7 +2710,7 @@
 	/* let's do a final log if we need it */
 	if (!LIST_ISEMPTY(&s->fe->logformat) && s->logs.logwait &&
 	    !(s->flags & SN_MONITOR) &&
-	    (!(s->fe->options & PR_O_NULLNOLOG) || s->req.total)) {
+	    (!(s->fe->options & PR_O_NULLNOLOG) || req->total)) {
 		s->do_log(s);
 	}