diff --git a/webserv/http/HttpRequest.cpp b/webserv/http/HttpRequest.cpp index 19a0e05..4febb38 100644 --- a/webserv/http/HttpRequest.cpp +++ b/webserv/http/HttpRequest.cpp @@ -64,60 +64,91 @@ void HttpRequest::parseBuffer() { while (true) { - if (state_ == State::RequestLine) + switch (state_) { - size_t pos = buffer_.find("\r\n"); - if (pos == std::string::npos) + case State::RequestLine: + if (!parseBufferforRequestLine()) { - Log::debug("HttpRequest::parseBuffer() in state RequestLine waiting for more data"); return; // Wait for more data } - requestLine_ = buffer_.substr(0, pos); - buffer_.erase(0, pos + 2); - state_ = State::Headers; - } - else if (state_ == State::Headers) - { - size_t pos = buffer_.find("\r\n\r\n"); - if (pos == std::string::npos) + break; + case State::Headers: + if (!parseBufferforHeaders()) { - Log::debug("HttpRequest::parseBuffer() in state Headers waiting for more data"); return; // Wait for more data } - headers_ = buffer_.substr(0, pos + 2); // Include the last \r\n - buffer_.erase(0, pos + 4); - parseContentLength(); - - if (contentLength_ > 0) + break; + case State::Body: + if (!parseBufferforBody()) { - 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 } - body_ = buffer_.substr(0, contentLength_); - buffer_.erase(0, contentLength_); - state_ = State::Complete; - } - else if (state_ == State::Complete) - { + 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"); + 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() { Log::trace("HttpRequest::reset() called");