*/
LUA_FUNCTION_DEF (config, add_composite);
/***
- * @method rspamd_config:register_pre_filter(callback)
+ * @method rspamd_config:register_pre_filter(callback[, order])
* Register function to be called prior to symbols processing.
* @param {function} callback callback function
+ * @param {number} order filters are called from lower orders to higher orders, order is equal to 0 by default
* @example
local function check_function(task)
-- It is possible to manipulate the task object here: set settings, set pre-action and so on
*/
LUA_FUNCTION_DEF (config, register_pre_filter);
/***
- * @method rspamd_config:register_post_filter(callback)
+ * @method rspamd_config:register_post_filter(callback[, order])
* Register function to be called after symbols are processed.
+ *
* @param {function} callback callback function
+ * @param {number} order filters are called from lower orders to higher orders, order is equal to 0 by default
*/
LUA_FUNCTION_DEF (config, register_post_filter);
/* XXX: obsoleted */
gint ref;
} callback;
gboolean cb_is_ref;
+ gint order;
};
/*
return 0;
}
+static gint
+rspamd_compare_order_func (gconstpointer a, gconstpointer b)
+{
+ const struct lua_callback_data *cb1 = a, *cb2 = b;
+
+ /* order of call goes from lower to higher */
+ return cb2->order - cb1->order;
+}
+
void
rspamd_lua_call_post_filters (struct rspamd_task *task)
{
{
struct rspamd_config *cfg = lua_check_config (L, 1);
struct lua_callback_data *cd;
+ gint order = 0;
if (cfg) {
cd =
sizeof (struct lua_callback_data));
cd->magic = rspamd_lua_callback_magic;
+ if (lua_type (L, 3) == LUA_TNUMBER) {
+ order = lua_tonumber (L, 3);
+ }
+
if (lua_type (L, 2) == LUA_TSTRING) {
cd->callback.name = rspamd_mempool_strdup (cfg->cfg_pool,
luaL_checkstring (L, 2));
}
cd->L = L;
- cfg->post_filters = g_list_prepend (cfg->post_filters, cd);
+ cd->order = order;
+ cfg->post_filters = g_list_insert_sorted (cfg->post_filters, cd,
+ rspamd_compare_order_func);
rspamd_mempool_add_destructor (cfg->cfg_pool,
(rspamd_mempool_destruct_t)lua_destroy_cfg_symbol,
cd);
{
struct rspamd_config *cfg = lua_check_config (L, 1);
struct lua_callback_data *cd;
+ gint order = 0;
if (cfg) {
cd =
sizeof (struct lua_callback_data));
cd->magic = rspamd_lua_callback_magic;
+ if (lua_type (L, 3) == LUA_TNUMBER) {
+ order = lua_tonumber (L, 3);
+ }
+
if (lua_type (L, 2) == LUA_TSTRING) {
cd->callback.name = rspamd_mempool_strdup (cfg->cfg_pool,
luaL_checkstring (L, 2));
}
cd->L = L;
- cfg->pre_filters = g_list_prepend (cfg->pre_filters, cd);
+ cd->order = order;
+ cfg->pre_filters = g_list_insert_sorted (cfg->pre_filters, cd,
+ rspamd_compare_order_func);
rspamd_mempool_add_destructor (cfg->cfg_pool,
(rspamd_mempool_destruct_t)lua_destroy_cfg_symbol,
cd);