}
static void
-make_surbl_requests (struct uri* url, struct worker_task *task)
+make_surbl_requests (struct uri* url, struct worker_task *task, GTree *tree)
{
char *surbl_req;
f_str_t f;
param->task = task;
param->suffix = (struct suffix_item *)cur->data;
if ((surbl_req = format_surbl_request (task->task_pool, &f, (struct suffix_item *)cur->data)) != NULL) {
- msg_debug ("surbl_test_url: send surbl dns request %s", surbl_req);
- evdns_resolve_ipv4 (surbl_req, DNS_QUERY_NO_SEARCH, dns_callback, (void *)param);
+ if (g_tree_lookup (tree, surbl_req) == NULL) {
+ g_tree_insert (tree, surbl_req, surbl_req);
+ msg_debug ("surbl_test_url: send surbl dns request %s", surbl_req);
+ evdns_resolve_ipv4 (surbl_req, DNS_QUERY_NO_SEARCH, dns_callback, (void *)param);
+ }
+ else {
+ msg_debug ("make_surbl_requests: request %s is already sent", surbl_req);
+ }
}
else {
msg_info ("surbl_test_url: cannot format url string for surbl %s", struri (url));
msg_debug ("surbl_check: url %s is not in surbl %s", param->url->host, param->suffix->suffix);
}
*(param->url->host + param->url->hostlen) = c;
-
+
param->task->save.saved --;
if (param->task->save.saved == 0) {
/* Call other filters */
param->task->save.saved = 1;
process_filters (param->task);
}
- make_surbl_requests (param->url, param->task);
+ make_surbl_requests (param->url, param->task, param->tree);
break;
}
}
static void
-register_memcached_call (struct uri *url, struct worker_task *task)
+register_memcached_call (struct uri *url, struct worker_task *task, GTree *url_tree)
{
struct memcached_param *param;
struct memcached_server *selected;
param->url = url;
param->task = task;
+ param->tree = url_tree;
param->ctx = memory_pool_alloc0 (task->task_pool, sizeof (memcached_ctx_t));
msg_err ("redirector_callback: write failed %s", strerror (errno));
event_del (¶m->ev);
param->task->save.saved --;
- make_surbl_requests (param->url, param->task);
+ make_surbl_requests (param->url, param->task, param->tree);
if (param->task->save.saved == 0) {
/* Call other filters */
param->task->save.saved = 1;
event_del (¶m->ev);
msg_info ("redirector_callback: connection to redirector timed out while waiting for write");
param->task->save.saved --;
- make_surbl_requests (param->url, param->task);
+ make_surbl_requests (param->url, param->task, param->tree);
if (param->task->save.saved == 0) {
/* Call other filters */
}
event_del (¶m->ev);
param->task->save.saved --;
- make_surbl_requests (param->url, param->task);
+ make_surbl_requests (param->url, param->task, param->tree);
if (param->task->save.saved == 0) {
/* Call other filters */
param->task->save.saved = 1;
event_del (¶m->ev);
msg_info ("redirector_callback: reading redirector timed out, while waiting for read");
param->task->save.saved --;
- make_surbl_requests (param->url, param->task);
+ make_surbl_requests (param->url, param->task, param->tree);
if (param->task->save.saved == 0) {
/* Call other filters */
param->task->save.saved = 1;
static void
-register_redirector_call (struct uri *url, struct worker_task *task)
+register_redirector_call (struct uri *url, struct worker_task *task, GTree *url_tree)
{
int s;
struct redirector_param *param;
if (s == -1) {
msg_info ("register_redirector_call: cannot create tcp socket failed: %s", strerror (errno));
task->save.saved --;
- make_surbl_requests (url, task);
+ make_surbl_requests (url, task, url_tree);
return;
}
param->task = task;
param->state = STATE_CONNECT;
param->sock = s;
+ param->tree = url_tree;
timeout.tv_sec = surbl_module_ctx->connect_timeout / 1000;
timeout.tv_usec = surbl_module_ctx->connect_timeout - timeout.tv_sec * 1000;
event_set (¶m->ev, s, EV_WRITE, redirector_callback, (void *)param);
{
struct uri *url;
struct memcached_param *param;
+ GTree *url_tree;
+
+ url_tree = g_tree_new ((GCompareFunc)g_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);
+ register_redirector_call (url, task, url_tree);
task->save.saved++;
}
else {
if (task->worker->srv->cfg->memcached_servers_num > 0) {
- register_memcached_call (url, task);
+ register_memcached_call (url, task, url_tree);
task->save.saved++;
}
else {
- make_surbl_requests (url, task);
+ make_surbl_requests (url, task, url_tree);
}
}
}
+
+ g_tree_destroy (url_tree);
return 0;
}
if (new != NULL) {
rc = parse_uri (new, url_str, task->task_pool);
if (rc != URI_ERRNO_OK) {
- msg_info ("url_parse_html: error while parsing url %s: %s", url_str, url_strerror (rc));
+ msg_debug ("url_parse_html: error while parsing url %s: %s", url_str, url_strerror (rc));
}
if (rc != URI_ERRNO_EMPTY && rc != URI_ERRNO_NO_HOST) {
TAILQ_INSERT_TAIL (&task->urls, new, next);
if (new != NULL) {
rc = parse_uri (new, url_str, task->task_pool);
if (rc != URI_ERRNO_OK) {
- msg_info ("url_parse_html: error while parsing url %s: %s", url_str, url_strerror (rc));
+ msg_debug ("url_parse_html: error while parsing url %s: %s", url_str, url_strerror (rc));
}
if (rc != URI_ERRNO_EMPTY && rc != URI_ERRNO_NO_HOST) {
TAILQ_INSERT_TAIL (&task->urls, new, next);