summaryrefslogtreecommitdiffstats
path: root/src/lua
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-10-20 16:52:44 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-10-20 19:43:32 +0100
commitf4086b26c873e291ff7bbfab08b7059344c22bce (patch)
tree2ec8cfe8c3685539fdfff0391a67cef5711c6951 /src/lua
parentaef4587ce0fa4692fa9a590972ff820b408cdc13 (diff)
downloadrspamd-f4086b26c873e291ff7bbfab08b7059344c22bce.tar.gz
rspamd-f4086b26c873e291ff7bbfab08b7059344c22bce.zip
[Project] Adopt lua http
Diffstat (limited to 'src/lua')
-rw-r--r--src/lua/lua_http.c73
1 files changed, 34 insertions, 39 deletions
diff --git a/src/lua/lua_http.c b/src/lua/lua_http.c
index 3f3ee72e0..1b78446a1 100644
--- a/src/lua/lua_http.c
+++ b/src/lua/lua_http.c
@@ -60,10 +60,11 @@ static const struct luaL_reg httplib_m[] = {
struct lua_http_cbdata {
struct rspamd_http_connection *conn;
struct rspamd_async_session *session;
- struct rspamd_async_watcher *w;
+ struct rspamd_symcache_item *item;
struct rspamd_http_message *msg;
struct event_base *ev_base;
struct rspamd_config *cfg;
+ struct rspamd_task *task;
struct timeval tv;
struct rspamd_cryptobox_keypair *local_kp;
struct rspamd_cryptobox_pubkey *peer_pk;
@@ -146,15 +147,15 @@ static void
lua_http_maybe_free (struct lua_http_cbdata *cbd)
{
if (cbd->session) {
- if (cbd->w) {
- /* We still need to clear watcher */
- rspamd_session_watcher_pop (cbd->session, cbd->w);
- }
if (cbd->flags & RSPAMD_LUA_HTTP_FLAG_RESOLVED) {
/* Event is added merely for resolved events */
rspamd_session_remove_event (cbd->session, lua_http_fin, cbd);
}
+
+ if (cbd->item) {
+ rspamd_symcache_item_async_dec_check (cbd->task, cbd->item);
+ }
}
else {
lua_http_fin (cbd);
@@ -204,7 +205,6 @@ lua_http_finish_handler (struct rspamd_http_connection *conn,
{
struct lua_http_cbdata *cbd = (struct lua_http_cbdata *)conn->ud;
struct rspamd_http_header *h, *htmp;
- struct rspamd_async_watcher *existing_watcher = NULL;
const gchar *body;
gsize body_len;
@@ -258,9 +258,9 @@ lua_http_finish_handler (struct rspamd_http_connection *conn,
lua_settable (L, -3);
}
- if (cbd->w) {
+ if (cbd->item) {
/* Replace watcher to deal with nested calls */
- existing_watcher = rspamd_session_replace_watcher (cbd->session, cbd->w);
+ rspamd_symbols_cache_set_cur_item (cbd->task, cbd->item);
}
if (lua_pcall (L, 4, 0, 0) != 0) {
@@ -268,11 +268,6 @@ lua_http_finish_handler (struct rspamd_http_connection *conn,
lua_pop (L, 1);
}
- if (cbd->w) {
- /* Restore existing watcher */
- rspamd_session_replace_watcher (cbd->session, existing_watcher);
- }
-
lua_http_maybe_free (cbd);
lua_thread_pool_restore_callback (&lcbd);
@@ -292,7 +287,6 @@ lua_http_resume_handler (struct rspamd_http_connection *conn,
const gchar *body;
gsize body_len;
struct rspamd_http_header *h, *htmp;
- struct rspamd_async_watcher *existing_watcher = NULL;
if (err) {
lua_pushstring (L, err);
@@ -355,17 +349,12 @@ lua_http_resume_handler (struct rspamd_http_connection *conn,
lua_settable (L, -3);
}
- if (cbd->w) {
+ if (cbd->item) {
/* Replace watcher to deal with nested calls */
- existing_watcher = rspamd_session_replace_watcher (cbd->session, cbd->w);
+ rspamd_symbols_cache_set_cur_item (cbd->task, cbd->item);
}
lua_thread_resume (cbd->thread, 2);
-
- if (cbd->w) {
- /* Restore existing watcher */
- rspamd_session_replace_watcher (cbd->session, existing_watcher);
- }
}
static gboolean
@@ -431,12 +420,16 @@ lua_http_make_connection (struct lua_http_cbdata *cbd)
cbd->msg = NULL;
if (cbd->session) {
- rspamd_session_add_event (cbd->session, cbd->w,
+ rspamd_session_add_event (cbd->session,
(event_finalizer_t) lua_http_fin, cbd,
g_quark_from_static_string ("lua http"));
cbd->flags |= RSPAMD_LUA_HTTP_FLAG_RESOLVED;
}
+ if (cbd->item) {
+ rspamd_symcache_item_async_inc (cbd->task, cbd->item);
+ }
+
return TRUE;
}
@@ -465,8 +458,14 @@ lua_http_dns_handler (struct rdns_reply *reply, gpointer ud)
if (!lua_http_make_connection (cbd)) {
lua_http_push_error (cbd, "unable to make connection to the host");
lua_http_maybe_free (cbd);
+
+ return;
}
}
+
+ if (cbd->item) {
+ rspamd_symcache_item_async_dec_check (cbd->task, cbd->item);
+ }
}
static void
@@ -863,10 +862,13 @@ lua_http_request (lua_State *L)
return 1;
}
if (task == NULL && cfg == NULL) {
- return luaL_error (L, "Bad params to rspamd_http:request(): either task or config should be set");
+ return luaL_error (L,
+ "Bad params to rspamd_http:request(): either task or config should be set");
}
+
if (ev_base == NULL) {
- return luaL_error (L, "Bad params to rspamd_http:request(): ev_base isn't passed");
+ return luaL_error (L,
+ "Bad params to rspamd_http:request(): ev_base isn't passed");
}
cbd = g_malloc0 (sizeof (*cbd));
@@ -883,6 +885,11 @@ lua_http_request (lua_State *L)
cbd->max_size = max_size;
cbd->url = url;
cbd->auth = auth;
+ cbd->task = task;
+
+ if (task) {
+ cbd->item = rspamd_symbols_cache_get_cur_item (task);
+ }
if (msg->host) {
cbd->host = rspamd_fstring_cstr (msg->host);
@@ -900,9 +907,6 @@ lua_http_request (lua_State *L)
if (session) {
cbd->session = session;
-
- cbd->w = rspamd_session_get_watcher (cbd->session);
- rspamd_session_watcher_push_specific (cbd->session, cbd->w);
}
if (rspamd_parse_inet_address (&cbd->addr, msg->host->str, msg->host->len)) {
@@ -911,10 +915,6 @@ lua_http_request (lua_State *L)
lua_http_maybe_free (cbd);
lua_pushboolean (L, FALSE);
- if (cbd->w) {
- rspamd_session_watcher_pop (cbd->session, cbd->w);
- }
-
return 1;
}
}
@@ -930,10 +930,6 @@ lua_http_request (lua_State *L)
lua_pushboolean (L, FALSE);
g_free (to_resolve);
- if (cbd->w) {
- rspamd_session_watcher_pop (cbd->session, cbd->w);
- }
-
return 1;
}
@@ -948,12 +944,11 @@ lua_http_request (lua_State *L)
lua_http_maybe_free (cbd);
lua_pushboolean (L, FALSE);
- if (cbd->w) {
- rspamd_session_watcher_pop (cbd->session, cbd->w);
- }
-
return 1;
}
+ else {
+ rspamd_symcache_item_async_inc (cbd->task, cbd->item);
+ }
}
}