aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/m_httpd.cpp
diff options
context:
space:
mode:
authorGravatar brain2006-09-15 18:36:38 +0000
committerGravatar brain2006-09-15 18:36:38 +0000
commit383caa90d568d8d997a9624a9e6174ddc1a9a3da (patch)
treee6243903268aec07f158a2a527b51bd1ad1cf4bb /src/modules/m_httpd.cpp
parentImprove notices, so that if SAJOIN fails it can tell the oper who issued it (diff)
downloadinspircd++-383caa90d568d8d997a9624a9e6174ddc1a9a3da.tar.gz
inspircd++-383caa90d568d8d997a9624a9e6174ddc1a9a3da.tar.bz2
inspircd++-383caa90d568d8d997a9624a9e6174ddc1a9a3da.zip
Add timeouts to the http module. Two seperate timeouts, 60 seconds to receive headers, and 60 seconds after receipt of headers and sending of page, in which to time out the connection if the client doesnt close() as it should
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5260 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/m_httpd.cpp')
-rw-r--r--src/modules/m_httpd.cpp40
1 files changed, 40 insertions, 0 deletions
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;