summaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-09-28 14:30:13 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-09-28 14:30:13 +0100
commit388c08c712c8279a52ad82caa213191352639ca9 (patch)
tree9f12bba4be9b9772044928949c920175fa89d072 /src/libserver
parent61dbbe0eca5291b1329393a5fe1903fde415a243 (diff)
downloadrspamd-388c08c712c8279a52ad82caa213191352639ca9.tar.gz
rspamd-388c08c712c8279a52ad82caa213191352639ca9.zip
[Feature] Stop using of GLists for headers, improve performance
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/dkim.c47
-rw-r--r--src/libserver/re_cache.c7
-rw-r--r--src/libserver/task.c4
3 files changed, 17 insertions, 41 deletions
diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c
index 2d968bd0f..aedcf99c9 100644
--- a/src/libserver/dkim.c
+++ b/src/libserver/dkim.c
@@ -1709,43 +1709,25 @@ rspamd_dkim_canonize_header (struct rspamd_dkim_common_ctx *ctx,
const gchar *dkim_header,
const gchar *dkim_domain)
{
- struct raw_header *rh, *rh_iter;
- guint rh_num = 0;
- guint i;
- GPtrArray *sign_headers;
+ struct raw_header *rh;
+ guint rh_num = 0, i;
+ GPtrArray *ar;
if (dkim_header == NULL) {
- rh = g_hash_table_lookup (task->raw_headers, header_name);
-
- if (rh) {
- LL_FOREACH (rh, rh_iter) {
- rh_num++;
- }
+ ar = g_hash_table_lookup (task->raw_headers, header_name);
- if (rh_num > count) {
+ if (ar) {
+ if (ar->len > count) {
/* Set skip count */
- rh_num -= count;
+ rh_num = ar->len - count;
}
else {
rh_num = 0;
}
- sign_headers = g_ptr_array_sized_new (rh_num);
- /* Skip number of headers */
- rh_iter = rh;
- while (rh_num) {
- rh_iter = rh_iter->next;
- rh_num--;
- }
- /* Now insert required headers */
- while (rh_iter) {
- g_ptr_array_add (sign_headers, rh_iter);
- rh_iter = rh_iter->next;
- }
-
- for (i = 0; i < sign_headers->len; i ++) {
- rh = g_ptr_array_index (sign_headers, i);
+ for (i = rh_num; i < ar->len; i ++) {
+ rh = g_ptr_array_index (ar, i);
if (ctx->header_canon_type == DKIM_CANON_SIMPLE) {
rspamd_dkim_hash_update (ctx->headers_hash, rh->raw_value,
@@ -1756,30 +1738,25 @@ rspamd_dkim_canonize_header (struct rspamd_dkim_common_ctx *ctx,
else {
if (!rspamd_dkim_canonize_header_relaxed (ctx, rh->value,
header_name, FALSE)) {
-
- g_ptr_array_free (sign_headers, TRUE);
return FALSE;
}
}
}
-
- g_ptr_array_free (sign_headers, TRUE);
}
}
else {
/* For signature check just use the saved dkim header */
if (ctx->header_canon_type == DKIM_CANON_SIMPLE) {
/* We need to find our own signature and use it */
- rh = g_hash_table_lookup (task->raw_headers, DKIM_SIGNHEADER);
+ ar = g_hash_table_lookup (task->raw_headers, DKIM_SIGNHEADER);
- if (rh) {
+ if (ar) {
/* We need to find our own signature */
if (!dkim_domain) {
return FALSE;
}
-
- LL_FOREACH (rh, rh_iter) {
+ PTR_ARRAY_FOREACH (ar, i, rh) {
if (rspamd_substring_search_twoway (rh->raw_value,
rh->raw_len, dkim_domain,
strlen (dkim_domain)) != -1) {
diff --git a/src/libserver/re_cache.c b/src/libserver/re_cache.c
index c2ade15c5..955aa91e0 100644
--- a/src/libserver/re_cache.c
+++ b/src/libserver/re_cache.c
@@ -742,7 +742,6 @@ rspamd_re_cache_exec_re (struct rspamd_task *task,
{
guint ret = 0, i, re_id;
GPtrArray *headerlist;
- GList *slist;
GHashTableIter it;
struct raw_header *rh;
const gchar *in, *end;
@@ -966,10 +965,10 @@ rspamd_re_cache_exec_re (struct rspamd_task *task,
* of the body content.
*/
- slist = rspamd_message_get_header (task, "Subject", FALSE);
+ headerlist = rspamd_message_get_header_array (task, "Subject", FALSE);
- if (slist) {
- rh = slist->data;
+ if (headerlist && headerlist->len > 0) {
+ rh = g_ptr_array_index (headerlist, 0);
scvec[0] = (guchar *)rh->decoded;
lenvec[0] = strlen (rh->decoded);
diff --git a/src/libserver/task.c b/src/libserver/task.c
index 950564b2d..e6cede086 100644
--- a/src/libserver/task.c
+++ b/src/libserver/task.c
@@ -88,8 +88,8 @@ rspamd_task_new (struct rspamd_worker *worker, struct rspamd_config *cfg)
(rspamd_mempool_destruct_t) g_hash_table_unref,
new_task->results);
- new_task->raw_headers = g_hash_table_new (rspamd_strcase_hash,
- rspamd_strcase_equal);
+ new_task->raw_headers = g_hash_table_new_full (rspamd_strcase_hash,
+ rspamd_strcase_equal, NULL, rspamd_ptr_array_free_hard);
new_task->request_headers = g_hash_table_new_full (rspamd_ftok_icase_hash,
rspamd_ftok_icase_equal, rspamd_fstring_mapped_ftok_free,
rspamd_request_header_dtor);