Browse Source

[Minor] Allow to reinit URLs library

tags/1.7.7
Vsevolod Stakhov 6 years ago
parent
commit
b9902dde2b
3 changed files with 49 additions and 27 deletions
  1. 8
    0
      src/libserver/cfg_utils.c
  2. 40
    26
      src/libserver/url.c
  3. 1
    1
      src/libserver/url.h

+ 8
- 0
src/libserver/cfg_utils.c View File

@@ -653,6 +653,11 @@ rspamd_config_parse_log_format (struct rspamd_config *cfg)
return TRUE;
}

static void
rspamd_urls_config_dtor (gpointer _unused)
{
rspamd_url_deinit ();
}

/*
* Perform post load actions
@@ -751,6 +756,9 @@ rspamd_config_post_load (struct rspamd_config *cfg,
else {
rspamd_url_init (cfg->tld_file);
}

rspamd_mempool_add_destructor (cfg->cfg_pool, rspamd_urls_config_dtor,
NULL);
}

init_dynamic_config (cfg);

+ 40
- 26
src/libserver/url.c View File

@@ -474,43 +474,57 @@ rspamd_url_add_static_matchers (struct url_match_scanner *sc)
g_array_append_vals (sc->matchers, static_matchers, n);
}

void
rspamd_url_deinit (void)
{
if (url_scanner != NULL) {
rspamd_multipattern_destroy (url_scanner->search_trie);
g_array_free (url_scanner->matchers, TRUE);
g_free (url_scanner);

url_scanner = NULL;
}
}

void
rspamd_url_init (const gchar *tld_file)
{
GError *err = NULL;

if (url_scanner == NULL) {
url_scanner = g_malloc (sizeof (struct url_match_scanner));
if (url_scanner != NULL) {
rspamd_url_deinit ();
}

if (tld_file) {
/* Reserve larger multipattern */
url_scanner->matchers = g_array_sized_new (FALSE, TRUE,
sizeof (struct url_matcher), 13000);
url_scanner->search_trie = rspamd_multipattern_create_sized (13000,
RSPAMD_MULTIPATTERN_TLD | RSPAMD_MULTIPATTERN_ICASE);
}
else {
url_scanner->matchers = g_array_sized_new (FALSE, TRUE,
sizeof (struct url_matcher), 128);
url_scanner->search_trie = rspamd_multipattern_create_sized (128,
RSPAMD_MULTIPATTERN_TLD | RSPAMD_MULTIPATTERN_ICASE);
}
url_scanner = g_malloc (sizeof (struct url_match_scanner));

rspamd_url_add_static_matchers (url_scanner);
if (tld_file) {
/* Reserve larger multipattern */
url_scanner->matchers = g_array_sized_new (FALSE, TRUE,
sizeof (struct url_matcher), 13000);
url_scanner->search_trie = rspamd_multipattern_create_sized (13000,
RSPAMD_MULTIPATTERN_TLD | RSPAMD_MULTIPATTERN_ICASE);
}
else {
url_scanner->matchers = g_array_sized_new (FALSE, TRUE,
sizeof (struct url_matcher), 128);
url_scanner->search_trie = rspamd_multipattern_create_sized (128,
RSPAMD_MULTIPATTERN_TLD | RSPAMD_MULTIPATTERN_ICASE);
}

if (tld_file != NULL) {
rspamd_url_parse_tld_file (tld_file, url_scanner);
}
rspamd_url_add_static_matchers (url_scanner);

if (!rspamd_multipattern_compile (url_scanner->search_trie, &err)) {
msg_err ("cannot compile tld patterns, url matching will be "
"broken completely: %e", err);
g_error_free (err);
}
if (tld_file != NULL) {
rspamd_url_parse_tld_file (tld_file, url_scanner);
}

msg_debug ("initialized trie of %ud elements",
url_scanner->matchers->len);
if (!rspamd_multipattern_compile (url_scanner->search_trie, &err)) {
msg_err ("cannot compile tld patterns, url matching will be "
"broken completely: %e", err);
g_error_free (err);
}

msg_debug ("initialized trie of %ud elements",
url_scanner->matchers->len);
}

#define SET_U(u, field) do { \

+ 1
- 1
src/libserver/url.h View File

@@ -91,7 +91,7 @@ enum rspamd_url_protocol {
* @param cfg
*/
void rspamd_url_init (const gchar *tld_file);
void rspamd_url_deinit (void);
/*
* Parse urls inside text
* @param pool memory pool

Loading…
Cancel
Save