]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_httpd.cpp
Minor spelling errors in m_spanningtree.so
[user/henk/code/inspircd.git] / src / modules / m_httpd.cpp
index 6315809a9f8a6c4d4335b25a8a5551e10abc27f9..2b079c6ff9fe19d017d8347332f38d4b0a66fe95 100644 (file)
@@ -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;
 
@@ -105,7 +107,7 @@ class HttpServerSocket : public BufferedSocket
                        case 300:
                                return "MULTIPLE CHOICES";
                        case 301:
-                               return "MOVED PERMENANTLY";
+                               return "MOVED PERMANENTLY";
                        case 302:
                                return "FOUND";
                        case 303:
@@ -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, I_OnUnloadModule };
+               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,38 @@ 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;
+                       }
+               }
+       }
+
+       void OnUnloadModule(Module* mod)
+       {
+               for (std::set<HttpServerSocket*>::const_iterator i = sockets.begin(); i != sockets.end(); )
+               {
+                       HttpServerSocket* sock = *i;
+                       ++i;
+                       if (sock->GetIOHook() == mod)
+                       {
+                               sock->cull();
+                               delete sock;
+                       }
+               }
+       }
+
        CullResult cull()
        {
                std::set<HttpServerSocket*> local;