1
0

Fixed parsing and implemented write nofitication.

The web connection finally works with a browser.
This commit is contained in:
madmaxoft
2013-09-27 20:33:18 +02:00
parent d0b9e81795
commit 0c3fd5e77d
6 changed files with 51 additions and 13 deletions

View File

@@ -25,6 +25,7 @@ cHTTPConnection::cHTTPConnection(cHTTPServer & a_HTTPServer) :
void cHTTPConnection::SendStatusAndReason(int a_StatusCode, const AString & a_Response)
{
AppendPrintf(m_OutgoingData, "%d %s\r\n\r\n", a_StatusCode, a_Response.c_str());
m_HTTPServer.NotifyConnectionWrite(*this);
}
@@ -36,6 +37,7 @@ void cHTTPConnection::Send(const cHTTPResponse & a_Response)
ASSERT(m_State = wcsRecvIdle);
a_Response.AppendToData(m_OutgoingData);
m_State = wcsSendingResp;
m_HTTPServer.NotifyConnectionWrite(*this);
}
@@ -47,6 +49,8 @@ void cHTTPConnection::Send(const void * a_Data, int a_Size)
ASSERT(m_State == wcsSendingResp);
AppendPrintf(m_OutgoingData, "%x\r\n", a_Size);
m_OutgoingData.append((const char *)a_Data, a_Size);
m_OutgoingData.append("\r\n");
m_HTTPServer.NotifyConnectionWrite(*this);
}
@@ -56,8 +60,9 @@ void cHTTPConnection::Send(const void * a_Data, int a_Size)
void cHTTPConnection::FinishResponse(void)
{
ASSERT(m_State == wcsSendingResp);
m_OutgoingData.append("0\r\n");
m_OutgoingData.append("0\r\n\r\n");
m_State = wcsRecvHeaders;
m_HTTPServer.NotifyConnectionWrite(*this);
}
@@ -95,12 +100,19 @@ void cHTTPConnection::DataReceived(const char * a_Data, int a_Size)
}
m_State = wcsRecvBody;
m_HTTPServer.NewRequest(*this, *m_CurrentRequest);
m_CurrentRequestBodyRemaining = m_CurrentRequest->GetContentLength();
// Process the rest of the incoming data into the request body:
if (m_IncomingHeaderData.size() > idxEnd + 4)
{
m_IncomingHeaderData.erase(0, idxEnd + 4);
DataReceived(m_IncomingHeaderData.c_str(), m_IncomingHeaderData.size());
m_IncomingHeaderData.clear();
}
else
{
m_IncomingHeaderData.clear();
DataReceived("", 0); // If the request has zero body length, let it be processed right-away
}
break;
}
@@ -108,7 +120,17 @@ void cHTTPConnection::DataReceived(const char * a_Data, int a_Size)
case wcsRecvBody:
{
ASSERT(m_CurrentRequest != NULL);
// TODO: Receive the body, and the next request (If HTTP/1.1 keepalive)
if (m_CurrentRequestBodyRemaining > 0)
{
int BytesToConsume = std::min(m_CurrentRequestBodyRemaining, a_Size);
m_HTTPServer.RequestBody(*this, *m_CurrentRequest, a_Data, BytesToConsume);
m_CurrentRequestBodyRemaining -= BytesToConsume;
}
if (m_CurrentRequestBodyRemaining == 0)
{
m_HTTPServer.RequestFinished(*this, *m_CurrentRequest);
m_State = wcsRecvIdle;
}
break;
}