diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-06-10 17:28:19 +0400 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2011-06-10 17:28:19 +0400 |
commit | 2b5a8d60da266be61d35b285bc14a8c5d71798e7 (patch) | |
tree | c0319c35813e6060d358b3f929e6b4422053caa7 /src/lua | |
parent | 8535693674a5e6d6b8a01c9fee43ef4d836c0909 (diff) | |
download | rspamd-2b5a8d60da266be61d35b285bc14a8c5d71798e7.tar.gz rspamd-2b5a8d60da266be61d35b285bc14a8c5d71798e7.zip |
* Add LRU caching structure
* Add SPF records cache
* Add ability to parse doubles to xmlrpc
Several fixes to dns interface.
Trie plugin now checks urls as well.
Diffstat (limited to 'src/lua')
-rw-r--r-- | src/lua/lua_http.c | 23 | ||||
-rw-r--r-- | src/lua/lua_task.c | 16 | ||||
-rw-r--r-- | src/lua/lua_xmlrpc.c | 65 |
3 files changed, 93 insertions, 11 deletions
diff --git a/src/lua/lua_http.c b/src/lua/lua_http.c index 25cfa6948..89bd024bf 100644 --- a/src/lua/lua_http.c +++ b/src/lua/lua_http.c @@ -67,6 +67,15 @@ lua_check_task (lua_State * L) } static void +lua_http_fin (void *arg) +{ + struct lua_http_ud *ud = arg; + + rspamd_remove_dispatcher (ud->io_dispatcher); + close (ud->fd); +} + +static void lua_http_push_error (gint code, struct lua_http_ud *ud) { struct worker_task **ptask; @@ -93,6 +102,7 @@ lua_http_push_error (gint code, struct lua_http_ud *ud) } ud->parser_state = 3; + remove_normal_event (ud->task->s, lua_http_fin, ud); ud->task->save.saved--; if (ud->task->save.saved == 0) { @@ -140,6 +150,7 @@ lua_http_push_reply (f_str_t *in, struct lua_http_ud *ud) ud->headers = NULL; } + remove_normal_event (ud->task->s, lua_http_fin, ud); ud->task->save.saved--; if (ud->task->save.saved == 0) { /* Call other filters */ @@ -148,7 +159,6 @@ lua_http_push_reply (f_str_t *in, struct lua_http_ud *ud) } } - /* * Parsing utils */ @@ -246,8 +256,6 @@ lua_http_read_cb (f_str_t * in, void *arg) case 2: /* Get reply */ lua_http_push_reply (in, ud); - rspamd_remove_dispatcher (ud->io_dispatcher); - close (ud->fd); return FALSE; } @@ -264,10 +272,13 @@ lua_http_err_cb (GError * err, void *arg) if (ud->parser_state != 3) { lua_http_push_error (500, ud); } - rspamd_remove_dispatcher (ud->io_dispatcher); - close (ud->fd); + else { + remove_normal_event (ud->task->s, lua_http_fin, ud); + } } + + static void lua_http_dns_callback (struct rspamd_dns_reply *reply, gpointer arg) { @@ -304,6 +315,8 @@ lua_http_dns_callback (struct rspamd_dns_reply *reply, gpointer arg) close (ud->fd); return; } + + register_async_event (ud->task->s, lua_http_fin, ud, FALSE); } /** diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c index 2ab56b29c..0931eb13c 100644 --- a/src/lua/lua_task.c +++ b/src/lua/lua_task.c @@ -57,6 +57,7 @@ LUA_FUNCTION_DEF (task, resolve_dns_txt); LUA_FUNCTION_DEF (task, call_rspamd_function); LUA_FUNCTION_DEF (task, get_recipients); LUA_FUNCTION_DEF (task, get_from); +LUA_FUNCTION_DEF (task, get_user); LUA_FUNCTION_DEF (task, get_recipients_headers); LUA_FUNCTION_DEF (task, get_from_headers); LUA_FUNCTION_DEF (task, get_from_ip); @@ -86,6 +87,7 @@ static const struct luaL_reg tasklib_m[] = { LUA_INTERFACE_DEF (task, call_rspamd_function), LUA_INTERFACE_DEF (task, get_recipients), LUA_INTERFACE_DEF (task, get_from), + LUA_INTERFACE_DEF (task, get_user), LUA_INTERFACE_DEF (task, get_recipients_headers), LUA_INTERFACE_DEF (task, get_from_headers), LUA_INTERFACE_DEF (task, get_from_ip), @@ -833,6 +835,20 @@ lua_task_get_from (lua_State *L) return 1; } +static gint +lua_task_get_user (lua_State *L) +{ + struct worker_task *task = lua_check_task (L); + + if (task && task->user != NULL) { + lua_pushstring (L, task->user); + return 1; + } + + lua_pushnil (L); + return 1; +} + /* * Headers versions */ diff --git a/src/lua/lua_xmlrpc.c b/src/lua/lua_xmlrpc.c index f0ba2d6c0..4589405cc 100644 --- a/src/lua/lua_xmlrpc.c +++ b/src/lua/lua_xmlrpc.c @@ -38,6 +38,7 @@ struct lua_xmlrpc_ud { gint parser_state; gint depth; gint param_count; + gboolean got_text; lua_State *L; }; @@ -126,9 +127,15 @@ xmlrpc_start_element (GMarkupParseContext *context, const gchar *name, const gch } else if (g_ascii_strcasecmp (name, "string") == 0) { ud->parser_state = 11; + ud->got_text = FALSE; } else if (g_ascii_strcasecmp (name, "int") == 0) { ud->parser_state = 12; + ud->got_text = FALSE; + } + else if (g_ascii_strcasecmp (name, "double") == 0) { + ud->parser_state = 13; + ud->got_text = FALSE; } else { /* Error state */ @@ -171,9 +178,15 @@ xmlrpc_start_element (GMarkupParseContext *context, const gchar *name, const gch /* Primitives */ if (g_ascii_strcasecmp (name, "string") == 0) { ud->parser_state = 11; + ud->got_text = FALSE; } else if (g_ascii_strcasecmp (name, "int") == 0) { ud->parser_state = 12; + ud->got_text = FALSE; + } + else if (g_ascii_strcasecmp (name, "double") == 0) { + ud->parser_state = 13; + ud->got_text = FALSE; } /* Structure */ else if (g_ascii_strcasecmp (name, "struct") == 0) { @@ -300,7 +313,15 @@ xmlrpc_end_element (GMarkupParseContext *context, const gchar *name, gpointer us break; case 11: case 12: + case 13: /* Parse any values */ + /* Handle empty tags */ + if (!ud->got_text) { + lua_pushnil (ud->L); + } + else { + ud->got_text = FALSE; + } /* Primitives */ if (g_ascii_strcasecmp (name, "string") == 0) { ud->parser_state = 8; @@ -308,6 +329,9 @@ xmlrpc_end_element (GMarkupParseContext *context, const gchar *name, gpointer us else if (g_ascii_strcasecmp (name, "int") == 0) { ud->parser_state = 8; } + else if (g_ascii_strcasecmp (name, "double") == 0) { + ud->parser_state = 8; + } else { /* Error state */ ud->parser_state = 99; @@ -326,6 +350,7 @@ xmlrpc_text (GMarkupParseContext *context, const gchar *text, gsize text_len, gp { struct lua_xmlrpc_ud *ud = user_data; gint num; + gdouble dnum; /* Strip line */ while (g_ascii_isspace (*text) && text_len > 0) { @@ -352,7 +377,13 @@ xmlrpc_text (GMarkupParseContext *context, const gchar *text, gsize text_len, gp num = strtoul (text, NULL, 10); lua_pushinteger (ud->L, num); break; + case 13: + /* Push integer value */ + dnum = strtod (text, NULL); + lua_pushnumber (ud->L, dnum); + break; } + ud->got_text = TRUE; } } @@ -400,7 +431,8 @@ lua_xmlrpc_parse_reply (lua_State *L) static gint lua_xmlrpc_parse_table (lua_State *L, gint pos, gchar *databuf, gint pr, gsize size) { - gint r = pr; + gint r = pr, num; + double dnum; r += rspamd_snprintf (databuf + r, size - r, "<struct>"); lua_pushnil (L); /* first key */ @@ -415,8 +447,18 @@ lua_xmlrpc_parse_table (lua_State *L, gint pos, gchar *databuf, gint pr, gsize s lua_tostring (L, -2)); switch (lua_type (L, -1)) { case LUA_TNUMBER: - r += rspamd_snprintf (databuf + r, size - r, "<int>%d</int>", - lua_tointeger (L, -1)); + num = lua_tointeger (L, -1); + dnum = lua_tonumber (L, -1); + + /* Try to avoid conversion errors */ + if (dnum != (double)num) { + r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<double>%f</double>", + dnum); + } + else { + r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<int>%d</int>", + num); + } break; case LUA_TBOOLEAN: r += rspamd_snprintf (databuf + r, size - r, "<boolean>%d</boolean>", @@ -449,7 +491,8 @@ lua_xmlrpc_make_request (lua_State *L) { gchar databuf[BUFSIZ * 2]; const gchar *func; - gint r, top, i; + gint r, top, i, num; + double dnum; func = luaL_checkstring (L, 1); @@ -465,8 +508,18 @@ lua_xmlrpc_make_request (lua_State *L) r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<param><value>"); switch (lua_type (L, i)) { case LUA_TNUMBER: - r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<int>%d</int>", - lua_tointeger (L, i)); + num = lua_tointeger (L, i); + dnum = lua_tonumber (L, i); + + /* Try to avoid conversion errors */ + if (dnum != (double)num) { + r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<double>%f</double>", + dnum); + } + else { + r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<int>%d</int>", + num); + } break; case LUA_TBOOLEAN: r += rspamd_snprintf (databuf + r, sizeof (databuf) - r, "<boolean>%d</boolean>", |