[MEDIUM] make the http server error function a pointer in the session
It was a bit awkward to have session.c call return_srv_error() for
HTTP error messages related to servers. The function has been adapted
to be passed a pointer to the faulty stream interface, and is now a
pointer in the session. It is possible that in the future, it will
become a callback in the stream interface itself.
diff --git a/src/client.c b/src/client.c
index bc7b254..bf7f55c 100644
--- a/src/client.c
+++ b/src/client.c
@@ -212,6 +212,11 @@
else
s->do_log = tcp_sess_log;
+ if (p->mode == PR_MODE_HTTP)
+ s->srv_error = http_return_srv_error;
+ else
+ s->srv_error = NULL;
+
s->logs.accept_date = date; /* user-visible date for logging */
s->logs.tv_accept = now; /* corrected date for internal use */
tv_zero(&s->logs.tv_request);
diff --git a/src/proto_http.c b/src/proto_http.c
index 3991e41..b526076 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -696,7 +696,7 @@
s->srv->cum_sess++;
}
-/* Return the error message corresponding to err_type. It is assumed
+/* Return the error message corresponding to si->err_type. It is assumed
* that the server side is closed. Note that err_type is actually a
* bitmask, where almost only aborts may be cumulated with other
* values. We consider that aborted operations are more important
@@ -705,9 +705,9 @@
* being cumulated. It should normally not be possible to have multiple
* aborts at once, but just in case, the first one in sequence is reported.
*/
-void return_srv_error(struct session *s, int err_type)
+void http_return_srv_error(struct session *s, struct stream_interface *si)
{
- struct stream_interface *si = &s->si[1];
+ int err_type = si->err_type;
if (err_type & SI_ET_QUEUE_ABRT)
http_server_error(s, si, SN_ERR_CLICL, SN_FINST_Q,
diff --git a/src/session.c b/src/session.c
index 1eb7b69..0550de1 100644
--- a/src/session.c
+++ b/src/session.c
@@ -246,7 +246,8 @@
si->ib->flags |= BF_READ_ERROR;
si->state = SI_ST_CLO;
- return_srv_error(s, si->err_type);
+ if (s->srv_error)
+ s->srv_error(s, si);
return 0;
}
@@ -397,7 +398,8 @@
/* no session was ever accounted for this server */
si->state = SI_ST_CLO;
- return_srv_error(s, si->err_type);
+ if (s->srv_error)
+ s->srv_error(s, si);
return;
}
@@ -443,7 +445,8 @@
if (!si->err_type)
si->err_type = SI_ET_QUEUE_TO;
si->state = SI_ST_CLO;
- return_srv_error(s, si->err_type);
+ if (s->srv_error)
+ s->srv_error(s, si);
return;
}
@@ -458,7 +461,8 @@
si->shutw(si);
si->err_type |= SI_ET_QUEUE_ABRT;
si->state = SI_ST_CLO;
- return_srv_error(s, si->err_type);
+ if (s->srv_error)
+ s->srv_error(s, si);
return;
}
@@ -476,7 +480,8 @@
si->shutw(si);
si->err_type |= SI_ET_CONN_ABRT;
si->state = SI_ST_CLO;
- return_srv_error(s, si->err_type);
+ if (s->srv_error)
+ s->srv_error(s, si);
return;
}
@@ -529,7 +534,8 @@
if (!si->err_type)
si->err_type = SI_ET_CONN_OTHER;
si->state = SI_ST_CLO;
- return_srv_error(s, si->err_type);
+ if (s->srv_error)
+ s->srv_error(s, si);
return;
}