Refactor HttpRequest::parseBuffer: extract parsing logic into separate methods for request line, headers, and body

This commit is contained in:
whaffman 2025-09-22 22:33:27 +02:00
parent 799cf250b7
commit 2924440e0d

View File

@ -64,60 +64,91 @@ void HttpRequest::parseBuffer()
{ {
while (true) while (true)
{ {
if (state_ == State::RequestLine) switch (state_)
{ {
size_t pos = buffer_.find("\r\n"); case State::RequestLine:
if (pos == std::string::npos) if (!parseBufferforRequestLine())
{ {
Log::debug("HttpRequest::parseBuffer() in state RequestLine waiting for more data");
return; // Wait for more data return; // Wait for more data
} }
requestLine_ = buffer_.substr(0, pos); break;
buffer_.erase(0, pos + 2); case State::Headers:
state_ = State::Headers; if (!parseBufferforHeaders())
}
else if (state_ == State::Headers)
{
size_t pos = buffer_.find("\r\n\r\n");
if (pos == std::string::npos)
{ {
Log::debug("HttpRequest::parseBuffer() in state Headers waiting for more data");
return; // Wait for more data return; // Wait for more data
} }
headers_ = buffer_.substr(0, pos + 2); // Include the last \r\n break;
buffer_.erase(0, pos + 4); case State::Body:
parseContentLength(); if (!parseBufferforBody())
if (contentLength_ > 0)
{ {
state_ = State::Body;
}
else
{
Log::debug("HttpRequest::parseBuffer() in state Headers no body to read");
state_ = State::Complete;
return; // No body to read
}
}
else if (state_ == State::Body)
{
if (buffer_.size() < contentLength_)
{
Log::debug("HttpRequest::parseBuffer() in state Body waiting for more data");
return; // Wait for more data return; // Wait for more data
} }
body_ = buffer_.substr(0, contentLength_); break;
buffer_.erase(0, contentLength_); case State::Complete:
state_ = State::Complete;
}
else if (state_ == State::Complete)
{
Log::debug("HttpRequest::parseBuffer() request is complete"); Log::debug("HttpRequest::parseBuffer() request is complete");
return; // Request is complete return; // Request is complete
} }
} }
} }
bool HttpRequest::parseBufferforRequestLine()
{
Log::trace("HttpRequest::parseBufferforRequestLine() called");
size_t pos = buffer_.find("\r\n");
if (pos == std::string::npos)
{
Log::debug("HttpRequest::parseBuffer() in state RequestLine waiting for more data");
return false; // Wait for more data
}
requestLine_ = buffer_.substr(0, pos);
buffer_.erase(0, pos + 2);
state_ = State::Headers;
return true;
}
bool HttpRequest::parseBufferforHeaders()
{
Log::trace("HttpRequest::parseBufferforHeaders() called");
size_t pos = buffer_.find("\r\n\r\n");
if (pos == std::string::npos)
{
Log::debug("HttpRequest::parseBuffer() in state Headers waiting for more data");
return false; // Wait for more data
}
headers_ = buffer_.substr(0, pos + 2); // Include the last \r\n
buffer_.erase(0, pos + 4);
parseContentLength();
if (contentLength_ > 0)
{
state_ = State::Body;
}
else
{
Log::debug("HttpRequest::parseBuffer() in state Headers no body to read");
state_ = State::Complete;
return false; // No body to read
}
return true;
}
bool HttpRequest::parseBufferforBody()
{
Log::trace("HttpRequest::parseBufferforBody() called");
if (buffer_.size() < contentLength_)
{
Log::debug("HttpRequest::parseBuffer() in state Body waiting for more data");
return false; // Wait for more data
}
body_ = buffer_.substr(0, contentLength_);
buffer_.erase(0, contentLength_);
state_ = State::Complete;
return true;
}
void HttpRequest::reset() void HttpRequest::reset()
{ {
Log::trace("HttpRequest::reset() called"); Log::trace("HttpRequest::reset() called");