diff options
author | Attila Molnar <attilamolnar@hush.com> | 2014-01-20 16:57:30 +0100 |
---|---|---|
committer | Attila Molnar <attilamolnar@hush.com> | 2014-01-20 16:57:30 +0100 |
commit | ef264e2dca03126e1ea38ee05594bd015384622b (patch) | |
tree | 5757e15a81d74ae2b2dfe79715ac94bb687ed24a /src/modules | |
parent | 659530cbab286a2fbb38eee16d290cd202704452 (diff) |
m_httpd Add timeout option; remove timed out connections
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/m_httpd.cpp | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/modules/m_httpd.cpp b/src/modules/m_httpd.cpp index 6315809a9..a853e12c2 100644 --- a/src/modules/m_httpd.cpp +++ b/src/modules/m_httpd.cpp @@ -59,9 +59,11 @@ class HttpServerSocket : public BufferedSocket std::string http_version; public: + const time_t createtime; HttpServerSocket(int newfd, const std::string& IP, ListenSocket* via, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server) : BufferedSocket(newfd), ip(IP), postsize(0) + , createtime(ServerInstance->Time()) { InternalState = HTTP_SERVE_WAIT_REQUEST; @@ -339,12 +341,22 @@ class HttpServerSocket : public BufferedSocket class ModuleHttpServer : public Module { + unsigned int timeoutsec; + public: void init() { HttpModule = this; - ServerInstance->Modules->Attach(I_OnAcceptConnection, this); + Implementation eventlist[] = { I_OnAcceptConnection, I_OnBackgroundTimer, I_OnRehash }; + ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); + OnRehash(NULL); + } + + void OnRehash(User* user) + { + ConfigTag* tag = ServerInstance->Config->ConfValue("httpd"); + timeoutsec = tag->getInt("timeout"); } void OnRequest(Request& request) @@ -367,6 +379,24 @@ class ModuleHttpServer : public Module return MOD_RES_ALLOW; } + void OnBackgroundTimer(time_t curtime) + { + if (!timeoutsec) + return; + + time_t oldest_allowed = curtime - timeoutsec; + for (std::set<HttpServerSocket*>::const_iterator i = sockets.begin(); i != sockets.end(); ) + { + HttpServerSocket* sock = *i; + ++i; + if (sock->createtime < oldest_allowed) + { + sock->cull(); + delete sock; + } + } + } + CullResult cull() { std::set<HttpServerSocket*> local; |