diff options
Diffstat (limited to 'src/plugins/surbl.c')
-rw-r--r-- | src/plugins/surbl.c | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/src/plugins/surbl.c b/src/plugins/surbl.c index d44c7fbe7..1514cae1c 100644 --- a/src/plugins/surbl.c +++ b/src/plugins/surbl.c @@ -28,6 +28,7 @@ #include "../config.h" #include "../util.h" +#include "../message.h" #include <evdns.h> #include "surbl.h" @@ -647,29 +648,53 @@ register_redirector_call (struct uri *url, struct worker_task *task, GTree *url_ event_add (¶m->ev, &timeout); } +static gboolean +tree_url_callback (gpointer key, gpointer value, void *data) +{ + struct redirector_param *param = data; + struct uri *url = value; + + msg_debug ("surbl_test_url: check url %s", struri (url)); + if (surbl_module_ctx->use_redirector) { + register_redirector_call (url, param->task, param->tree); + param->task->save.saved++; + } + else { + if (param->task->worker->srv->cfg->memcached_servers_num > 0) { + register_memcached_call (url, param->task, param->tree); + param->task->save.saved++; + } + else { + make_surbl_requests (url, param->task, param->tree); + } + } + + return FALSE; +} + static int surbl_test_url (struct worker_task *task) { - struct uri *url; GTree *url_tree; + GList *cur; + struct mime_text_part *part; + struct redirector_param param; url_tree = g_tree_new ((GCompareFunc)g_ascii_strcasecmp); - - TAILQ_FOREACH (url, &task->urls, next) { - msg_debug ("surbl_test_url: check url %s", struri (url)); - if (surbl_module_ctx->use_redirector) { - register_redirector_call (url, task, url_tree); - task->save.saved++; + + param.tree = url_tree; + param.task = task; + cur = task->text_parts; + while (cur) { + part = cur->data; + if (part->urls) { + g_tree_foreach (part->urls, tree_url_callback, ¶m); } - else { - if (task->worker->srv->cfg->memcached_servers_num > 0) { - register_memcached_call (url, task, url_tree); - task->save.saved++; - } - else { - make_surbl_requests (url, task, url_tree); - } + if (part->html_urls) { + g_tree_foreach (part->html_urls, tree_url_callback, ¶m); } + + cur = g_list_next (cur); } memory_pool_add_destructor (task->task_pool, (pool_destruct_func)g_tree_destroy, url_tree); |