summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/timer.h4
-rw-r--r--src/modules/m_httpd.cpp40
-rw-r--r--src/timer.cpp22
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,