diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-04-02 14:15:08 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-04-02 14:15:55 +0100 |
commit | d8c6c1395df385d7321abcccc5a27c3db3f82321 (patch) | |
tree | 528e5a7b2f4156bdf155bf7b0c6ed87f92b3877f /src | |
parent | 747185e0cd527619eca9bf14ad6f72c8de79b898 (diff) | |
download | rspamd-d8c6c1395df385d7321abcccc5a27c3db3f82321.tar.gz rspamd-d8c6c1395df385d7321abcccc5a27c3db3f82321.zip |
[Feature] Add support of half-closed connection in lua_tcp
Diffstat (limited to 'src')
-rw-r--r-- | src/lua/lua_tcp.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/lua/lua_tcp.c b/src/lua/lua_tcp.c index 3ec067973..ad093cbe4 100644 --- a/src/lua/lua_tcp.c +++ b/src/lua/lua_tcp.c @@ -73,6 +73,7 @@ struct lua_tcp_cbdata { guint pos; guint total; gboolean partial; + gboolean do_shutdown; guint16 port; }; @@ -232,8 +233,18 @@ call_finish_handler: cbd->in); } + if (cbd->do_shutdown) { + /* Half close the connection */ + shutdown (cbd->fd, SHUT_WR); + } + event_del (&cbd->ev); - event_set (&cbd->ev, cbd->fd, EV_READ | EV_PERSIST, lua_tcp_handler, cbd); +#ifdef EV_CLOSED + event_set (&cbd->ev, cbd->fd, EV_READ|EV_PERSIST|EV_CLOSED, + lua_tcp_handler, cbd); +#else + event_set (&cbd->ev, cbd->fd, EV_READ|EV_PERSIST, lua_tcp_handler, cbd); +#endif event_base_set (cbd->ev_base, &cbd->ev); event_add (&cbd->ev, &cbd->tv); } @@ -300,6 +311,12 @@ lua_tcp_handler (int fd, short what, gpointer ud) else if (what == EV_WRITE) { lua_tcp_write_helper (cbd); } +#ifdef EV_CLOSED + else if (what == EV_CLOSED) { + lua_tcp_push_error (cbd, "Remote peer has closed the connection"); + lua_tcp_maybe_free (cbd); + } +#endif else { lua_tcp_push_error (cbd, "IO timeout"); lua_tcp_maybe_free (cbd); @@ -432,7 +449,7 @@ lua_tcp_request (lua_State *L) struct iovec *iov = NULL; guint niov = 0, total_out; gdouble timeout = default_tcp_timeout; - gboolean partial = FALSE; + gboolean partial = FALSE, do_shutdown = FALSE; if (lua_type (L, 1) == LUA_TTABLE) { lua_pushstring (L, "host"); @@ -529,6 +546,13 @@ lua_tcp_request (lua_State *L) } lua_pop (L, 1); + lua_pushstring (L, "shutdown"); + lua_gettable (L, -2); + if (lua_type (L, -1) == LUA_TBOOLEAN) { + do_shutdown = lua_toboolean (L, -1); + } + lua_pop (L, 1); + if (pool == NULL) { lua_pop (L, 1); msg_err ("tcp request has no memory pool associated"); @@ -598,6 +622,7 @@ lua_tcp_request (lua_State *L) cbd->fd = -1; cbd->pool = pool; cbd->partial = partial; + cbd->do_shutdown = do_shutdown; cbd->iov = iov; cbd->iovlen = niov; cbd->total = total_out; |