diff options
-rw-r--r-- | include/timer.h | 4 | ||||
-rw-r--r-- | src/modules/m_httpd.cpp | 40 | ||||
-rw-r--r-- | src/timer.cpp | 22 |
3 files changed, 66 insertions, 0 deletions
diff --git a/include/timer.h b/include/timer.h index ef9427abf..1f6da4521 100644 --- a/include/timer.h +++ b/include/timer.h @@ -84,6 +84,10 @@ class TimerManager : public Extensible * @param T an InspTimer derived class to add */ void AddTimer(InspTimer* T); + /** Delete and InspTImer + * @param T an InspTimer derived class to delete + */ + void DelTimer(InspTimer* T); /** Tick any timers that have been missed due to lag * @param TIME the current system time */ diff --git a/src/modules/m_httpd.cpp b/src/modules/m_httpd.cpp index 96fdfc8f2..ba8990afb 100644 --- a/src/modules/m_httpd.cpp +++ b/src/modules/m_httpd.cpp @@ -41,6 +41,18 @@ enum HttpState HTTP_SERVE_SEND_DATA = 3 }; +class HttpSocket; + +class HTTPTimeout : public InspTimer +{ + private: + HttpSocket* s; + SocketEngine* SE; + public: + HTTPTimeout(HttpSocket* sock, SocketEngine* engine); + void Tick(time_t TIME); +}; + /** A socket used for HTTP transport */ class HttpSocket : public InspSocket @@ -54,6 +66,7 @@ class HttpSocket : public InspSocket std::string http_version; unsigned int postsize; unsigned int amount; + HTTPTimeout* Timeout; public: @@ -61,11 +74,21 @@ class HttpSocket : public InspSocket { SI->Log(DEBUG,"HttpSocket constructor"); InternalState = HTTP_LISTEN; + Timeout = NULL; } HttpSocket(InspIRCd* SI, int newfd, char* ip, FileReader* ind) : InspSocket(SI, newfd, ip), index(ind), postsize(0) { InternalState = HTTP_SERVE_WAIT_REQUEST; + Timeout = new HTTPTimeout(this, Instance->SE); + Instance->Timers->AddTimer(Timeout); + } + + ~HttpSocket() + { + if (Timeout) + Instance->Timers->DelTimer(Timeout); + Timeout = NULL; } virtual int OnIncomingConnection(int newsock, char* ip) @@ -228,6 +251,8 @@ class HttpSocket : public InspSocket { InternalState = HTTP_SERVE_SEND_DATA; SendHeaders(0, 400, ""); + Timeout = new HTTPTimeout(this, Instance->SE); + Instance->Timers->AddTimer(Timeout); } else { @@ -266,6 +291,9 @@ class HttpSocket : public InspSocket { /* Headers are complete */ InternalState = HTTP_SERVE_SEND_DATA; + + Instance->Timers->DelTimer(Timeout); + Timeout = NULL; if ((http_version != "HTTP/1.1") && (http_version != "HTTP/1.0")) { @@ -291,6 +319,8 @@ class HttpSocket : public InspSocket } } } + Timeout = new HTTPTimeout(this, Instance->SE); + Instance->Timers->AddTimer(Timeout); } void Page(std::stringstream* n, int response, std::string& extraheaders) @@ -301,6 +331,16 @@ class HttpSocket : public InspSocket } }; +HTTPTimeout::HTTPTimeout(HttpSocket* sock, SocketEngine* engine) : InspTimer(60, time(NULL)), s(sock), SE(engine) +{ +} + +void HTTPTimeout::Tick(time_t TIME) +{ + SE->DelFd(s); + s->Close(); +} + class ModuleHttp : public Module { int port; diff --git a/src/timer.cpp b/src/timer.cpp index 9157c1521..bc08ae1d0 100644 --- a/src/timer.cpp +++ b/src/timer.cpp @@ -39,6 +39,28 @@ void TimerManager::TickTimers(time_t TIME) } } +void TimerManager::DelTimer(InspTimer* T) +{ + timerlist::iterator found = Timers.find(T->GetTimer()); + + if (found != Timers.end()) + { + timergroup* x = found->second; + for (timergroup::iterator y = x->begin(); y != x->end(); y++) + { + InspTimer* n = *y; + if (n == T) + { + DELETE(n); + x->erase(y); + if (!x->size()) + Timers.erase(found); + return; + } + } + } +} + /* * Because some muppets may do odd things, and their ircd may lock up due * to crappy 3rd party modules, or they may change their system time a bit, |