]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: log: pass date strings to lf_rawtext()
authorAurelien DARRAGON <adarragon@haproxy.com>
Wed, 3 Apr 2024 09:08:15 +0000 (11:08 +0200)
committerAurelien DARRAGON <adarragon@haproxy.com>
Fri, 26 Apr 2024 16:39:31 +0000 (18:39 +0200)
Don't directly call functions that take date as argument and output the
string representation to the log output buffer under sess_build_logline(),
and instead build the strings in temporary buffers of fixed size
(hopefully such functions, such as date2str_log() and gmt2str_log()
procuce strings of known size), and then print the result using
lf_rawtext() helper function. This way, we will be able to encode them
automatically as regular string/text when new encoding methods are added.

Because of this patch, we add a little overhead because we first generate
the text into a temporary variable and then use lf_rawtext() to print it.
Thus we have a double-copy, and this could have some performance
implications that were not yet evaluated. Due to the small number of bytes
that can end up being copied twice (< 30), we could be lucky and have no
visible performance impact, but if we happen to see a significant impact,
it could be useful to add a passthrough mechanism (to keep historical
behavior) when no encoding is involved.

src/log.c

index 7debd27759ed4ac1fe1f77799c663e68778e5d76..2ac3128a6672005760df19ea4a208e8a59eccf5e 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -3243,56 +3243,92 @@ int sess_build_logline(struct session *sess, struct stream *s, char *dst, size_t
                                break;
 
                        case LOG_FMT_DATE: // %t = accept date
+                       {
+                               char date_str[25]; // "26/Apr/2024:09:39:58.774"
+
                                get_localtime(logs->accept_date.tv_sec, &tm);
-                               ret = date2str_log(tmplog, &tm, &logs->accept_date, dst + maxsize - tmplog);
+                               if (!date2str_log(date_str, &tm, &logs->accept_date, sizeof(date_str)))
+                                       goto out;
+                               ret = lf_rawtext(tmplog, date_str, dst + maxsize - tmplog, tmp);
                                if (ret == NULL)
                                        goto out;
                                tmplog = ret;
                                break;
+                       }
 
                        case LOG_FMT_tr: // %tr = start of request date
+                       {
+                               char date_str[25]; // "26/Apr/2024:09:39:58.774"
+
                                /* Note that the timers are valid if we get here */
                                tv_ms_add(&tv, &logs->accept_date, logs->t_idle >= 0 ? logs->t_idle + logs->t_handshake : 0);
                                get_localtime(tv.tv_sec, &tm);
-                               ret = date2str_log(tmplog, &tm, &tv, dst + maxsize - tmplog);
+                               if (!date2str_log(date_str, &tm, &tv, sizeof(date_str)))
+                                       goto out;
+                               ret = lf_rawtext(tmplog, date_str, dst + maxsize - tmplog, tmp);
                                if (ret == NULL)
                                        goto out;
                                tmplog = ret;
                                break;
+                       }
 
                        case LOG_FMT_DATEGMT: // %T = accept date, GMT
+                       {
+                               char gmt_str[27]; // "26/Apr/2024:07:41:11 +0000"
+
                                get_gmtime(logs->accept_date.tv_sec, &tm);
-                               ret = gmt2str_log(tmplog, &tm, dst + maxsize - tmplog);
+                               if (!gmt2str_log(gmt_str, &tm, sizeof(gmt_str)))
+                                       goto out;
+                               ret = lf_rawtext(tmplog, gmt_str, dst + maxsize - tmplog, tmp);
                                if (ret == NULL)
                                        goto out;
                                tmplog = ret;
                                break;
+                       }
 
                        case LOG_FMT_trg: // %trg = start of request date, GMT
+                       {
+                               char gmt_str[27]; // "26/Apr/2024:07:41:11 +0000"
+
                                tv_ms_add(&tv, &logs->accept_date, logs->t_idle >= 0 ? logs->t_idle + logs->t_handshake : 0);
                                get_gmtime(tv.tv_sec, &tm);
-                               ret = gmt2str_log(tmplog, &tm, dst + maxsize - tmplog);
+                               if (!gmt2str_log(gmt_str, &tm, sizeof(gmt_str)))
+                                       goto out;
+                               ret = lf_rawtext(tmplog, gmt_str, dst + maxsize - tmplog, tmp);
                                if (ret == NULL)
                                        goto out;
                                tmplog = ret;
                                break;
+                       }
 
                        case LOG_FMT_DATELOCAL: // %Tl = accept date, local
+                       {
+                               char localdate_str[27]; // "26/Apr/2024:09:42:32 +0200"
+
                                get_localtime(logs->accept_date.tv_sec, &tm);
-                               ret = localdate2str_log(tmplog, logs->accept_date.tv_sec, &tm, dst + maxsize - tmplog);
+                               if (!localdate2str_log(localdate_str, logs->accept_date.tv_sec, &tm, sizeof(localdate_str)))
+                                       goto out;
+                               ret = lf_rawtext(tmplog, localdate_str, dst + maxsize - tmplog, tmp);
                                if (ret == NULL)
                                        goto out;
                                tmplog = ret;
                                break;
+                       }
 
                        case LOG_FMT_trl: // %trl = start of request date, local
+                       {
+                               char localdate_str[27]; // "26/Apr/2024:09:42:32 +0200"
+
                                tv_ms_add(&tv, &logs->accept_date, logs->t_idle >= 0 ? logs->t_idle + logs->t_handshake : 0);
                                get_localtime(tv.tv_sec, &tm);
-                               ret = localdate2str_log(tmplog, tv.tv_sec, &tm, dst + maxsize - tmplog);
+                               if (!localdate2str_log(localdate_str, tv.tv_sec, &tm, sizeof(localdate_str)))
+                                       goto out;
+                               ret = lf_rawtext(tmplog, localdate_str, dst + maxsize - tmplog, tmp);
                                if (ret == NULL)
                                        goto out;
                                tmplog = ret;
                                break;
+                       }
 
                        case LOG_FMT_TS: // %Ts
                        {