summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/conf/modules.conf.example3
-rw-r--r--src/modules/m_httpd.cpp32
2 files changed, 34 insertions, 1 deletions
diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example
index b65a0ca02..09a8514a4 100644
--- a/docs/conf/modules.conf.example
+++ b/docs/conf/modules.conf.example
@@ -870,6 +870,9 @@
# a <bind> tag with type "httpd", and load at least one of the other
# m_httpd_* modules to provide pages to display.
#
+# You can adjust the timeout for HTTP connections below. All HTTP
+# connections will be closed after (roughly) this many seconds.
+#<httpd timeout="20">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# http ACL module: Provides access control lists for m_httpd dependent
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;