summaryrefslogtreecommitdiffstats
path: root/src/libserver/url.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-01-12 19:10:28 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-01-12 19:10:28 +0000
commit66da8cd82b10a94a2422b27be23bdd6c7bbebb53 (patch)
tree89532b51afaa1ec9255ebf20b5d341054bdf441e /src/libserver/url.c
parentbdaea3c54a03f6665f8490a01d13c1c869706f65 (diff)
downloadrspamd-66da8cd82b10a94a2422b27be23bdd6c7bbebb53.tar.gz
rspamd-66da8cd82b10a94a2422b27be23bdd6c7bbebb53.zip
[Minor] Improve URL tags
Diffstat (limited to 'src/libserver/url.c')
-rw-r--r--src/libserver/url.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/libserver/url.c b/src/libserver/url.c
index 7df4cb98a..4252d5ac1 100644
--- a/src/libserver/url.c
+++ b/src/libserver/url.c
@@ -48,6 +48,7 @@
#include "http.h"
#include "multipattern.h"
#include "http_parser.h"
+#include "contrib/uthash/utlist.h"
typedef struct url_match_s {
const gchar *m_begin;
@@ -2543,15 +2544,28 @@ rspamd_url_task_callback (struct rspamd_url *url, gsize start_offset,
void
rspamd_url_add_tag (struct rspamd_url *url, const gchar *tag,
+ const gchar *value,
rspamd_mempool_t *pool)
{
- g_assert (url != NULL && tag != NULL);
+ struct rspamd_url_tag *found, *ntag;
+
+ g_assert (url != NULL && tag != NULL && value != NULL);
if (url->tags == NULL) {
- url->tags = g_ptr_array_sized_new (2);
- rspamd_mempool_add_destructor (pool, rspamd_ptr_array_free_hard, url->tags);
+ url->tags = g_hash_table_new (rspamd_strcase_hash, rspamd_strcase_equal);
+ rspamd_mempool_add_destructor (pool,
+ (rspamd_mempool_destruct_t)g_hash_table_unref, url->tags);
}
- g_ptr_array_add (url->tags, rspamd_mempool_strdup (pool, tag));
+ found = g_hash_table_lookup (url->tags, tag);
+
+ ntag = rspamd_mempool_alloc0 (pool, sizeof (*ntag));
+ ntag->data = rspamd_mempool_strdup (pool, value);
+
+ if (found == NULL) {
+ g_hash_table_insert (url->tags, rspamd_mempool_strdup (pool, tag),
+ ntag);
+ }
+ DL_APPEND (found, ntag);
}