[OPTIM] do not re-check req buffer when only response has changed

In process_session(), we used to re-run through all the evaluation
loop when only the response had changed. Now we carefully check in
this order :
  - changes to the stream interfaces (only SI_ST_DIS)
  - changes to the request buffer flags
  - changes to the response buffer flags

And we branch to the appropriate section. This saves significant
CPU cycles, which is important since process_session() is one of
the major CPU eaters.

The same changes have been applied to uxst_process_session().
diff --git a/src/proto_uxst.c b/src/proto_uxst.c
index 6351ef1..8891149 100644
--- a/src/proto_uxst.c
+++ b/src/proto_uxst.c
@@ -770,6 +770,7 @@
 	 * at this point.
 	 */
 
+ resync_request:
 	/**** Process layer 7 below ****/
 
 	resync = 0;
@@ -855,9 +856,14 @@
 	s->req->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT;
 
 	/* according to benchmarks, it makes sense to resync now */
-	if (resync)
+	if (s->req->prod->state == SI_ST_DIS)
 		goto resync_stream_interface;
 
+	if (resync)
+		goto resync_request;
+
+ resync_response:
+	resync = 0;
 
 	/* Analyse response */
 	if (unlikely(s->rep->flags & BF_HIJACK)) {
@@ -935,9 +941,15 @@
 
 	s->rep->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT;
 
-	if (resync)
+	if (s->req->prod->state == SI_ST_DIS)
 		goto resync_stream_interface;
 
+	if (s->req->flags != rqf_last)
+		goto resync_request;
+
+	if (resync)
+		goto resync_response;
+
 	if (likely(s->rep->cons->state != SI_ST_CLO)) {
 		if (s->rep->cons->state == SI_ST_EST)
 			stream_sock_data_finish(s->rep->cons);
diff --git a/src/session.c b/src/session.c
index 34ed663..aa29591 100644
--- a/src/session.c
+++ b/src/session.c
@@ -714,6 +714,7 @@
 	 * at this point.
 	 */
 
+ resync_request:
 	/**** Process layer 7 below ****/
 
 	resync = 0;
@@ -855,9 +856,14 @@
 	s->req->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT;
 
 	/* according to benchmarks, it makes sense to resync now */
-	if (resync)
+	if (s->req->prod->state == SI_ST_DIS || s->req->cons->state == SI_ST_DIS)
 		goto resync_stream_interface;
 
+	if (resync)
+		goto resync_request;
+
+ resync_response:
+	resync = 0;
 
 	/* Analyse response */
 
@@ -948,9 +954,14 @@
 
 	s->rep->flags &= BF_CLEAR_READ & BF_CLEAR_WRITE & BF_CLEAR_TIMEOUT;
 
-	if (resync)
+	if (s->req->prod->state == SI_ST_DIS || s->req->cons->state == SI_ST_DIS)
 		goto resync_stream_interface;
 
+	if (s->req->flags != rqf_last)
+		goto resync_request;
+
+	if (resync)
+		goto resync_response;
 
 	/* This is needed only when debugging is enabled, to indicate
 	 * client-side or server-side close. Please note that in the unlikely