summaryrefslogtreecommitdiffstats
path: root/source/HTTPServer/HTTPConnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/HTTPServer/HTTPConnection.cpp')
-rw-r--r--source/HTTPServer/HTTPConnection.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/source/HTTPServer/HTTPConnection.cpp b/source/HTTPServer/HTTPConnection.cpp
index f7318c6ae..59fe8f878 100644
--- a/source/HTTPServer/HTTPConnection.cpp
+++ b/source/HTTPServer/HTTPConnection.cpp
@@ -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;
}