rspamd/utils/content_type_bench.c
2016-12-23 00:05:28 +00:00

166 řádky
3.7 KiB
C

/*-
* Copyright 2016 Vsevolod Stakhov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "config.h"
#include "printf.h"
#include "message.h"
#include "util.h"
#include "content_type.h"
static gdouble total_time = 0;
static gint total_parsed = 0;
static gint total_valid = 0;
static gint total_type = 0;
static gint total_subtype = 0;
static gint total_charset = 0;
static gint total_attrs = 0;
static gint total_boundaries = 0;
static gboolean verbose = 1;
#define MODE_NORMAL 0
#define MODE_GMIME 1
#define MODE_COMPARE 2
static void
rspamd_process_file (const gchar *fname, gint mode)
{
rspamd_mempool_t *pool;
GIOChannel *f;
GError *err = NULL;
GString *buf;
struct rspamd_content_type *ct;
gdouble t1, t2;
rspamd_ftok_t t;
f = g_io_channel_new_file (fname, "r", &err);
if (!f) {
rspamd_fprintf (stderr, "cannot open %s: %e\n", fname, err);
g_error_free (err);
return;
}
g_io_channel_set_encoding (f, NULL, NULL);
buf = g_string_sized_new (8192);
pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "test");
while (g_io_channel_read_line_string (f, buf, NULL, &err)
== G_IO_STATUS_NORMAL) {
while (buf->len > 0 && g_ascii_isspace (buf->str[buf->len - 1])) {
buf->len --;
}
if (mode == MODE_NORMAL) {
t1 = rspamd_get_virtual_ticks ();
ct = rspamd_content_type_parse (buf->str, buf->len, pool);
t2 = rspamd_get_virtual_ticks ();
}
else {
rspamd_fprintf (stderr, "gmime is no longer supported\n");
exit (EXIT_FAILURE);
}
total_time += t2 - t1;
total_parsed ++;
if (mode == MODE_NORMAL) {
if (ct) {
total_valid ++;
if (ct->type.len > 0) {
total_type ++;
}
if (ct->subtype.len > 0) {
total_subtype ++;
}
if (ct->charset.len > 0) {
total_charset ++;
}
if (ct->boundary.len > 0) {
total_boundaries ++;
}
if (ct->attrs) {
total_attrs ++;
}
}
}
}
if (err) {
rspamd_fprintf (stderr, "cannot read %s: %e\n", fname, err);
g_error_free (err);
}
g_io_channel_unref (f);
g_string_free (buf, TRUE);
rspamd_mempool_delete (pool);
}
int
main (int argc, char **argv)
{
gint i, start = 1, mode = MODE_NORMAL;
if (argc > 2 && *argv[1] == '-') {
start = 2;
if (argv[1][1] == 'g') {
mode = MODE_GMIME;
}
else if (argv[1][1] == 'c') {
mode = MODE_COMPARE;
}
}
for (i = start; i < argc; i ++) {
if (argv[i]) {
rspamd_process_file (argv[i], mode);
}
}
if (mode != MODE_COMPARE) {
rspamd_printf ("Parsed %d received headers in %.3f seconds\n"
"Total valid (has type): %d\n"
"Total known type: %d\n"
"Total known subtype: %d\n"
"Total known charset: %d\n"
"Total has attrs: %d\n"
"Total has boundaries: %d\n",
total_parsed, total_time,
total_valid, total_type,
total_subtype, total_charset,
total_attrs,
total_boundaries);
}
else {
rspamd_printf ("Parsed %d received headers in %.3f seconds\n"
"Total valid (parsed by both): %d\n"
"Total same type: %d\n"
"Total same subtype: %d\n"
"Total same charset: %d\n"
"Total same boundaries: %d\n",
total_parsed, total_time,
total_valid, total_type,
total_subtype, total_charset,
total_boundaries);
}
return 0;
}