mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-09 18:49:03 -04:00
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
This commit is contained in:
parent
a88e285baa
commit
383caa90d5
@ -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
|
||||
*/
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user