Fixed memory leaks in the HTTP framework
This commit is contained in:
parent
4bf596a586
commit
f55b77a98a
@ -17,11 +17,22 @@ cHTTPConnection::cHTTPConnection(cHTTPServer & a_HTTPServer) :
|
||||
m_State(wcsRecvHeaders),
|
||||
m_CurrentRequest(NULL)
|
||||
{
|
||||
// LOGD("HTTP: New connection at %p", this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
cHTTPConnection::~cHTTPConnection()
|
||||
{
|
||||
// LOGD("HTTP: Del connection at %p", this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cHTTPConnection::SendStatusAndReason(int a_StatusCode, const AString & a_Response)
|
||||
{
|
||||
AppendPrintf(m_OutgoingData, "%d %s\r\nContent-Length: 0\r\n\r\n", a_StatusCode, a_Response.c_str());
|
||||
@ -120,6 +131,19 @@ void cHTTPConnection::AwaitNextRequest(void)
|
||||
|
||||
|
||||
|
||||
void cHTTPConnection::Terminate(void)
|
||||
{
|
||||
if (m_CurrentRequest != NULL)
|
||||
{
|
||||
m_HTTPServer.RequestFinished(*this, *m_CurrentRequest);
|
||||
}
|
||||
m_HTTPServer.CloseConnection(*this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cHTTPConnection::DataReceived(const char * a_Data, int a_Size)
|
||||
{
|
||||
switch (m_State)
|
||||
@ -214,6 +238,7 @@ void cHTTPConnection::SocketClosed(void)
|
||||
{
|
||||
m_HTTPServer.RequestFinished(*this, *m_CurrentRequest);
|
||||
}
|
||||
m_HTTPServer.CloseConnection(*this);
|
||||
}
|
||||
|
||||
|
||||
|
@ -39,6 +39,7 @@ public:
|
||||
} ;
|
||||
|
||||
cHTTPConnection(cHTTPServer & a_HTTPServer);
|
||||
~cHTTPConnection();
|
||||
|
||||
/// Sends HTTP status code together with a_Reason (used for HTTP errors)
|
||||
void SendStatusAndReason(int a_StatusCode, const AString & a_Reason);
|
||||
@ -61,6 +62,9 @@ public:
|
||||
/// Resets the connection for a new request. Depending on the state, this will send an "InternalServerError" status or a "ResponseEnd"
|
||||
void AwaitNextRequest(void);
|
||||
|
||||
/// Terminates the connection; finishes any request being currently processed
|
||||
void Terminate(void);
|
||||
|
||||
protected:
|
||||
typedef std::map<AString, AString> cNameValueMap;
|
||||
|
||||
|
@ -179,9 +179,9 @@ void cHTTPServer::Stop(void)
|
||||
|
||||
// Drop all current connections:
|
||||
cCSLock Lock(m_CSConnections);
|
||||
for (cHTTPConnections::iterator itr = m_Connections.begin(), end = m_Connections.end(); itr != end; ++itr)
|
||||
while (!m_Connections.empty())
|
||||
{
|
||||
m_SocketThreads.RemoveClient(*itr);
|
||||
m_Connections.front()->Terminate();
|
||||
} // for itr - m_Connections[]
|
||||
}
|
||||
|
||||
@ -213,6 +213,7 @@ void cHTTPServer::CloseConnection(cHTTPConnection & a_Connection)
|
||||
break;
|
||||
}
|
||||
}
|
||||
delete &a_Connection;
|
||||
}
|
||||
|
||||
|
||||
|
@ -488,15 +488,20 @@ void cWebAdmin::OnRequestFinished(cHTTPConnection & a_Connection, cHTTPRequest &
|
||||
)
|
||||
{
|
||||
HandleWebadminRequest(a_Connection, a_Request);
|
||||
return;
|
||||
}
|
||||
if (URL == "/")
|
||||
else if (URL == "/")
|
||||
{
|
||||
// The root needs no body handler and is fully handled in the OnRequestFinished() call
|
||||
HandleRootRequest(a_Connection, a_Request);
|
||||
return;
|
||||
}
|
||||
// TODO: Handle other requests
|
||||
else
|
||||
{
|
||||
// TODO: Handle other requests
|
||||
}
|
||||
|
||||
// Delete any request data assigned to the request:
|
||||
cRequestData * Data = (cRequestData *)(a_Request.GetUserData());
|
||||
delete Data;
|
||||
}
|
||||
|
||||
|
||||
|
@ -134,6 +134,8 @@ protected:
|
||||
class cRequestData
|
||||
{
|
||||
public:
|
||||
virtual ~cRequestData() {} // Force a virtual destructor in all descendants
|
||||
|
||||
/// Called when a new chunk of body data is received
|
||||
virtual void OnBody(const char * a_Data, int a_Size) = 0;
|
||||
} ;
|
||||
|
Loading…
Reference in New Issue
Block a user