]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: log: t_idle (%Ti) is not set for some requests
authorRian McGuire <rian.mcguire@stileeducation.com>
Tue, 24 Apr 2018 14:19:21 +0000 (11:19 -0300)
committerWilly Tarreau <w@1wt.eu>
Wed, 25 Apr 2018 06:59:23 +0000 (08:59 +0200)
If TCP content inspection is used, msg_state can be >= HTTP_MSG_ERROR
the first time http_wait_for_request is called. t_idle was being left
unset in that case.

In the example below :
     stick-table type string len 64 size 100k expire 60s
     tcp-request inspect-delay 1s
     tcp-request content track-sc1 hdr(X-Session)

%Ti will always be -1, because the msg_state is already at HTTP_MSG_BODY
when http_wait_for_request is called for the first time.

This patch should backported to 1.8 and 1.7.

src/proto_http.c

index 8370889b417c798496c8f48fa5ab5a5aaf73ee0d..6730375ef91e88ca50f63e9f61c30a696c7bd793 100644 (file)
@@ -1619,18 +1619,16 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit)
        /* we're speaking HTTP here, so let's speak HTTP to the client */
        s->srv_error = http_return_srv_error;
 
+       /* If there is data available for analysis, log the end of the idle time. */
+       if (buffer_not_empty(req->buf) && s->logs.t_idle == -1)
+               s->logs.t_idle = tv_ms_elapsed(&s->logs.tv_accept, &now) - s->logs.t_handshake;
+
        /* There's a protected area at the end of the buffer for rewriting
         * purposes. We don't want to start to parse the request if the
         * protected area is affected, because we may have to move processed
         * data later, which is much more complicated.
         */
        if (buffer_not_empty(req->buf) && msg->msg_state < HTTP_MSG_ERROR) {
-
-               /* This point is executed when some data is avalaible for analysis,
-                * so we log the end of the idle time. */
-               if (s->logs.t_idle == -1)
-                       s->logs.t_idle = tv_ms_elapsed(&s->logs.tv_accept, &now) - s->logs.t_handshake;
-
                if (txn->flags & TX_NOT_FIRST) {
                        if (unlikely(!channel_is_rewritable(req))) {
                                if (req->flags & (CF_SHUTW|CF_SHUTW_NOW|CF_WRITE_ERROR|CF_WRITE_TIMEOUT))