aboutsummaryrefslogtreecommitdiffstats
path: root/src/lua/lua_url.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-04-14 14:57:51 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-04-14 14:57:51 +0100
commit80b45e8b6d0d7696e11927102706dee19d18ae46 (patch)
treec859523f5fcdeab6db258722ac2f45e41229b1dd /src/lua/lua_url.c
parent31343b0f0a4b02d792e0bbc0ca8934fc6a3b49b5 (diff)
downloadrspamd-80b45e8b6d0d7696e11927102706dee19d18ae46.tar.gz
rspamd-80b45e8b6d0d7696e11927102706dee19d18ae46.zip
[Fix] Fix lua url
Diffstat (limited to 'src/lua/lua_url.c')
-rw-r--r--src/lua/lua_url.c77
1 files changed, 39 insertions, 38 deletions
diff --git a/src/lua/lua_url.c b/src/lua/lua_url.c
index 8c43c2dcc..3e97bbd11 100644
--- a/src/lua/lua_url.c
+++ b/src/lua/lua_url.c
@@ -454,6 +454,19 @@ lua_url_to_table (lua_State *L)
return 1;
}
+static void
+lua_url_single_inserter (struct rspamd_url *url, gsize start_offset,
+ gsize end_offset, gpointer ud)
+{
+ lua_State *L = ud;
+ struct rspamd_lua_url *lua_url;
+
+ lua_url = lua_newuserdata (L, sizeof (struct rspamd_lua_url));
+ rspamd_lua_setclass (L, "rspamd{url}", -1);
+ lua_url->url = url;
+}
+
+
/***
* @function url.create(mempool, str)
* @param {rspamd_mempool} memory pool for URL, e.g. `task:get_mempool()`
@@ -463,48 +476,54 @@ lua_url_to_table (lua_State *L)
static gint
lua_url_create (lua_State *L)
{
- struct rspamd_url *url;
- struct rspamd_lua_url *lua_url;
rspamd_mempool_t *pool = rspamd_lua_check_mempool (L, 1);
const gchar *text;
+ size_t length;
if (pool == NULL) {
lua_pushnil (L);
}
else {
- text = luaL_checkstring (L, 2);
+ text = luaL_checklstring (L, 2, &length);
if (text != NULL) {
- url = rspamd_url_get_next (pool, text, NULL, NULL);
+ lua_newtable (L);
+ rspamd_url_find_single (pool, text, length, FALSE,
+ lua_url_single_inserter, L);
- if (url == NULL) {
- lua_pushnil (L);
- }
- else {
- lua_url = lua_newuserdata (L, sizeof (struct rspamd_lua_url));
- rspamd_lua_setclass (L, "rspamd{url}", -1);
- lua_url->url = url;
- }
}
else {
lua_pushnil (L);
}
}
-
return 1;
}
+static void
+lua_url_table_inserter (struct rspamd_url *url, gsize start_offset,
+ gsize end_offset, gpointer ud)
+{
+ lua_State *L = ud;
+ struct rspamd_lua_url *lua_url;
+ gint n;
+
+ n = rspamd_lua_table_size (L, -1);
+ lua_url = lua_newuserdata (L, sizeof (struct rspamd_lua_url));
+ rspamd_lua_setclass (L, "rspamd{url}", -1);
+ lua_url->url = url;
+ lua_pushinteger (L, n + 1);
+ lua_pushlstring (L, url->string, url->urllen);
+ lua_settable (L, -3);
+}
+
+
static gint
lua_url_all (lua_State *L)
{
- struct rspamd_url *url;
- struct rspamd_lua_url *lua_url;
rspamd_mempool_t *pool = rspamd_lua_check_mempool (L, 1);
- const gchar *text,*end;
- gint i = 1;
+ const gchar *text;
size_t length;
- const gchar *pos;
if (pool == NULL) {
lua_pushnil (L);
@@ -513,25 +532,9 @@ lua_url_all (lua_State *L)
text = luaL_checklstring (L, 2, &length);
if (text != NULL) {
- pos = text;
- end = text + length;
lua_newtable (L);
-
- while (pos <= end) {
- url = rspamd_url_get_next (pool, text, &pos, NULL);
-
- if (url != NULL) {
- lua_url = lua_newuserdata (L, sizeof (struct rspamd_lua_url));
- rspamd_lua_setclass (L, "rspamd{url}", -1);
- lua_url->url = url;
- lua_pushinteger (L, i++);
- lua_pushlstring (L, url->string, url->urllen);
- lua_settable (L, -3);
- }
- else{
- break;
- }
- }
+ rspamd_url_find_multiple (pool, text, length, FALSE,
+ lua_url_table_inserter, L);
}
else {
@@ -539,9 +542,7 @@ lua_url_all (lua_State *L)
}
}
-
return 1;
-
}