]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Show scan time in rspamc client.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 10 Sep 2015 14:38:24 +0000 (15:38 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 10 Sep 2015 14:38:24 +0000 (15:38 +0100)
src/client/rspamc.c

index 07699fdfbb1acb23d1a4542079714e89231f1e97..40d37e4836d8a714a5b5cdc63491f1fae8bf8277 100644 (file)
@@ -277,6 +277,7 @@ struct rspamc_command {
 struct rspamc_callback_data {
        struct rspamc_command *cmd;
        gchar *filename;
+       gdouble start;
 };
 
 /*
@@ -852,7 +853,8 @@ rspamd_action_from_str (const gchar *data, gint *result)
 }
 
 static void
-rspamc_mime_output (FILE *out, ucl_object_t *result, GString *input, GError *err)
+rspamc_mime_output (FILE *out, ucl_object_t *result, GString *input,
+               gdouble time, GError *err)
 {
        GMimeStream *stream;
        GByteArray ar;
@@ -914,6 +916,10 @@ rspamc_mime_output (FILE *out, ucl_object_t *result, GString *input, GError *err
                hdr_scanned = "rspamc " RVERSION;
                g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Scanner",
                                hdr_scanned);
+               rspamd_snprintf (scorebuf, sizeof (scorebuf), "%.3f", time);
+               g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam-Scan-Time",
+                               scorebuf);
+
                if (is_spam) {
                        hdr_spam = "yes";
                        g_mime_object_append_header (GMIME_OBJECT (message), "X-Spam", hdr_spam);
@@ -1004,7 +1010,7 @@ rspamc_mime_output (FILE *out, ucl_object_t *result, GString *input, GError *err
 
 static void
 rspamc_client_execute_cmd (struct rspamc_command *cmd, ucl_object_t *result,
-               GString *input, GError *err)
+               GString *input, gdouble time, GError *err)
 {
        gchar **eargv;
        gint eargc, infd, outfd, errfd;
@@ -1032,7 +1038,7 @@ rspamc_client_execute_cmd (struct rspamc_command *cmd, ucl_object_t *result,
                out = fdopen (infd, "w");
 
                if (cmd->cmd == RSPAMC_COMMAND_SYMBOLS && mime_output && input) {
-                       rspamc_mime_output (out, result, input, err);
+                       rspamc_mime_output (out, result, input, time, err);
                }
                else if (result) {
                        if (raw || cmd->command_output_func == NULL) {
@@ -1073,24 +1079,28 @@ rspamc_client_cb (struct rspamd_client_connection *conn,
        struct rspamc_callback_data *cbdata = (struct rspamc_callback_data *)ud;
        struct rspamc_command *cmd;
        FILE *out = stdout;
+       gdouble finish = rspamd_get_ticks (), diff;
 
        cmd = cbdata->cmd;
+       diff = finish - cbdata->start;
 
        if (execute) {
                /* Pass all to the external command */
-               rspamc_client_execute_cmd (cmd, result, input, err);
+               rspamc_client_execute_cmd (cmd, result, input, diff, err);
        }
        else {
 
                if (cmd->cmd == RSPAMC_COMMAND_SYMBOLS && mime_output && input) {
-                       rspamc_mime_output (out, result, input, err);
+                       rspamc_mime_output (out, result, input, diff, err);
                }
                else {
                        if (cmd->need_input) {
-                               rspamd_fprintf (out, "Results for file: %s\n", cbdata->filename);
+                               rspamd_fprintf (out, "Results for file: %s (%.3f seconds)\n",
+                                               cbdata->filename, diff);
                        }
                        else {
-                               rspamd_fprintf (out, "Results for command: %s\n", cmd->name);
+                               rspamd_fprintf (out, "Results for command: %s (%.3f seconds)\n",
+                                               cmd->name, diff);
                        }
 
                        if (result != NULL) {
@@ -1167,6 +1177,8 @@ rspamc_process_input (struct event_base *ev_base, struct rspamc_command *cmd,
                cbdata = g_slice_alloc (sizeof (struct rspamc_callback_data));
                cbdata->cmd = cmd;
                cbdata->filename = g_strdup (name);
+               cbdata->start = rspamd_get_ticks ();
+
                if (cmd->need_input) {
                        rspamd_client_command (conn, cmd->path, attrs, in, rspamc_client_cb,
                                cbdata, &err);