]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Adopt lua http
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 20 Oct 2018 15:52:44 +0000 (16:52 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 20 Oct 2018 18:43:32 +0000 (19:43 +0100)
src/lua/lua_http.c

index 3f3ee72e0cb5093cf7e8a79ca713ae47b0315e80..1b78446a17b5a52876c59e058724fec9f853a9f6 100644 (file)
@@ -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);
+                       }
                }
        }