Refactor HttpRequest::parseBuffer: extract parsing logic into separate methods for request line, headers, and body
This commit is contained in:
parent
799cf250b7
commit
2924440e0d
@ -64,25 +64,57 @@ void HttpRequest::parseBuffer()
|
|||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (state_ == State::RequestLine)
|
switch (state_)
|
||||||
{
|
{
|
||||||
|
case State::RequestLine:
|
||||||
|
if (!parseBufferforRequestLine())
|
||||||
|
{
|
||||||
|
return; // Wait for more data
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case State::Headers:
|
||||||
|
if (!parseBufferforHeaders())
|
||||||
|
{
|
||||||
|
return; // Wait for more data
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case State::Body:
|
||||||
|
if (!parseBufferforBody())
|
||||||
|
{
|
||||||
|
return; // Wait for more data
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case State::Complete:
|
||||||
|
Log::debug("HttpRequest::parseBuffer() request is complete");
|
||||||
|
return; // Request is complete
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HttpRequest::parseBufferforRequestLine()
|
||||||
|
{
|
||||||
|
Log::trace("HttpRequest::parseBufferforRequestLine() called");
|
||||||
size_t pos = buffer_.find("\r\n");
|
size_t pos = buffer_.find("\r\n");
|
||||||
if (pos == std::string::npos)
|
if (pos == std::string::npos)
|
||||||
{
|
{
|
||||||
Log::debug("HttpRequest::parseBuffer() in state RequestLine waiting for more data");
|
Log::debug("HttpRequest::parseBuffer() in state RequestLine waiting for more data");
|
||||||
return; // Wait for more data
|
return false; // Wait for more data
|
||||||
}
|
}
|
||||||
requestLine_ = buffer_.substr(0, pos);
|
requestLine_ = buffer_.substr(0, pos);
|
||||||
buffer_.erase(0, pos + 2);
|
buffer_.erase(0, pos + 2);
|
||||||
state_ = State::Headers;
|
state_ = State::Headers;
|
||||||
}
|
|
||||||
else if (state_ == State::Headers)
|
return true;
|
||||||
{
|
}
|
||||||
|
|
||||||
|
bool HttpRequest::parseBufferforHeaders()
|
||||||
|
{
|
||||||
|
Log::trace("HttpRequest::parseBufferforHeaders() called");
|
||||||
size_t pos = buffer_.find("\r\n\r\n");
|
size_t pos = buffer_.find("\r\n\r\n");
|
||||||
if (pos == std::string::npos)
|
if (pos == std::string::npos)
|
||||||
{
|
{
|
||||||
Log::debug("HttpRequest::parseBuffer() in state Headers waiting for more data");
|
Log::debug("HttpRequest::parseBuffer() in state Headers waiting for more data");
|
||||||
return; // Wait for more data
|
return false; // Wait for more data
|
||||||
}
|
}
|
||||||
headers_ = buffer_.substr(0, pos + 2); // Include the last \r\n
|
headers_ = buffer_.substr(0, pos + 2); // Include the last \r\n
|
||||||
buffer_.erase(0, pos + 4);
|
buffer_.erase(0, pos + 4);
|
||||||
@ -96,26 +128,25 @@ void HttpRequest::parseBuffer()
|
|||||||
{
|
{
|
||||||
Log::debug("HttpRequest::parseBuffer() in state Headers no body to read");
|
Log::debug("HttpRequest::parseBuffer() in state Headers no body to read");
|
||||||
state_ = State::Complete;
|
state_ = State::Complete;
|
||||||
return; // No body to read
|
return false; // No body to read
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if (state_ == State::Body)
|
return true;
|
||||||
{
|
}
|
||||||
|
|
||||||
|
bool HttpRequest::parseBufferforBody()
|
||||||
|
{
|
||||||
|
Log::trace("HttpRequest::parseBufferforBody() called");
|
||||||
if (buffer_.size() < contentLength_)
|
if (buffer_.size() < contentLength_)
|
||||||
{
|
{
|
||||||
Log::debug("HttpRequest::parseBuffer() in state Body waiting for more data");
|
Log::debug("HttpRequest::parseBuffer() in state Body waiting for more data");
|
||||||
return; // Wait for more data
|
return false; // Wait for more data
|
||||||
}
|
}
|
||||||
body_ = buffer_.substr(0, contentLength_);
|
body_ = buffer_.substr(0, contentLength_);
|
||||||
buffer_.erase(0, contentLength_);
|
buffer_.erase(0, contentLength_);
|
||||||
state_ = State::Complete;
|
state_ = State::Complete;
|
||||||
}
|
|
||||||
else if (state_ == State::Complete)
|
return true;
|
||||||
{
|
|
||||||
Log::debug("HttpRequest::parseBuffer() request is complete");
|
|
||||||
return; // Request is complete
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HttpRequest::reset()
|
void HttpRequest::reset()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user