Skip to content

Commit

Permalink
fix(readFromClient): split readFromClient
Browse files Browse the repository at this point in the history
  • Loading branch information
dantol29 committed May 17, 2024
1 parent 64adc26 commit bc9c13d
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 66 deletions.
147 changes: 82 additions & 65 deletions src/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,13 +115,16 @@ void Server::readFromClient(Connection &conn, size_t &i, Parser &parser, HTTPReq
return;
}
}

if (!parser.getHeadersComplete())
{
Debug::log("Headers incomplete yet, exiting readFromClient.", Debug::NORMAL);
return;
}

if (parser.getHeadersComplete() && !parser.getHeadersAreParsed())
parser.parseRequestLineAndHeaders(parser.getHeadersBuffer().c_str(), request, response);

if (response.getStatusCode() != 0)
{
conn.setCanBeClosed(false);
Expand All @@ -130,76 +133,84 @@ void Server::readFromClient(Connection &conn, size_t &i, Parser &parser, HTTPReq
Debug::log("Error parsing headers or request line", Debug::OCF);
return;
}
std::cout << parser.getHeadersComplete() << " ," << request.getMethod() << std::endl;

if (parser.getHeadersComplete() && request.getMethod() == "GET")
conn.setHasFinishedReading(true);

if (response.getStatusCode() != 0)
Debug::log(toString(response.getStatusCode()), Debug::NORMAL);
if (request.getMethod() == "GET")

if (request.getMethod() == "GET" || request.getMethod() == "DELETE" \
|| request.getMethod() == "SALAD")
Debug::log("GET request, no body to read", Debug::NORMAL);
else
handlePostRequest(conn, i, parser, request, response);
}

void Server::handlePostRequest(Connection &conn, size_t &i, Parser &parser, HTTPRequest &request, HTTPResponse &response)
{
if (parser.getIsChunked() && !conn.getHasReadSocket())
{
if (parser.getIsChunked() && !conn.getHasReadSocket())
{
Debug::log("Chunked body", Debug::NORMAL);
if (!conn.readChunkedBody(parser))
{
// Case of error while reading chunked body
Debug::log("Error reading chunked body", Debug::OCF);
conn.setCanBeClosed(true);
conn.setHasFinishedReading(true);
// It could be that we had data that could be sent even if we have an error cause previous data was read
return;
}
conn.setHasReadSocket(true);
}
else if (!conn.getHasReadSocket())
{
Debug::log("\033[1;33mReading body\033[0m", Debug::NORMAL);
// TODO: add comments
if (!parser.getBodyComplete() && parser.getBuffer().size() == request.getContentLength())
{
// TODO: in the new design we will return here and go to the function where the response is
parser.setBodyComplete(true);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(true);
}
else if (!conn.getHasReadSocket() && !conn.readBody(parser, request, response, _config))
{
Debug::log("Error reading body", Debug::OCF);
conn.setCanBeClosed(false);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(false);
return;
}
}
if (!parser.getBodyComplete() && request.getContentLength() != 0 &&
parser.getBuffer().size() == request.getContentLength())
Debug::log("Chunked body", Debug::NORMAL);
// TODO: double check this condition, logic
if (!conn.readChunkedBody(parser))
{
// TODO: in the new design we will return here and go to the function where the response is
parser.setBodyComplete(true);
Debug::log("Error reading chunked body", Debug::OCF);
conn.setCanBeClosed(true);
conn.setHasFinishedReading(true);
conn.setCanBeClosed(false);
conn.setHasDataToSend(false);
// It could be that we had data that could be sent even if we have an error cause previous data was read
return;
}
if (!parser.getBodyComplete())
//-----------------------------//
conn.setHasReadSocket(true);
}
else if (!conn.getHasReadSocket())
{
Debug::log("\033[1;33mReading body\033[0m", Debug::NORMAL);
// TODO: double check this condition, logic
if (!parser.getBodyComplete() && parser.getBuffer().size() == request.getContentLength())
{
Debug::log("Body still incomplete, exiting readFromClient.", Debug::NORMAL);
conn.setHasFinishedReading(false);
conn.setHasReadSocket(true);
return;
parser.setBodyComplete(true);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(true);
}
// std::cout << parser.getBuffer() << std::endl;
if (!request.getUploadBoundary().empty())
parser.parseFileUpload(parser.getBuffer(), request, response);
else if (request.getMethod() != "GET")
//-----------------------------//

else if (!conn.readBody(parser, request, response, _config))
{
request.setBody(parser.getBuffer());
Debug::log("Error reading body", Debug::OCF);
conn.setCanBeClosed(false);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(false);
return;
}
}
// TODO: double check this condition, logic
if (!parser.getBodyComplete() && request.getContentLength() != 0 &&
parser.getBuffer().size() == request.getContentLength())
{
// TODO: in the new design we will return here and go to the function where the response is
parser.setBodyComplete(true);
conn.setHasFinishedReading(true);
conn.setCanBeClosed(false);
conn.setHasDataToSend(false);
return;
}
//-----------------------------//

if (!parser.getBodyComplete())
{
Debug::log("Body still incomplete, exiting readFromClient.", Debug::NORMAL);
conn.setHasFinishedReading(false);
conn.setHasReadSocket(true);
return;
}

if (!request.getUploadBoundary().empty())
parser.parseFileUpload(parser.getBuffer(), request, response);

request.setBody(parser.getBuffer());
conn.setHasFinishedReading(true);
}

void Server::buildResponse(Connection &conn, size_t &i, HTTPRequest &request, HTTPResponse &response)
Expand All @@ -210,26 +221,15 @@ void Server::buildResponse(Connection &conn, size_t &i, HTTPRequest &request, HT

ServerBlock serverBlock;
Directives directive;
std::string serverName;

std::cout << GREEN << "Number of server blocks: " << _config.getServerBlocks().size() << RESET << std::endl;
std::cout << "Request host: " << request.getSingleHeader("host").second << std::endl;

formRequestTarget(request);

for (size_t i = 0; i < _config.getServerBlocks().size(); i++)
{
// loop through all server names in the server block
for (size_t j = 0; j < _config.getServerBlocks()[i].getServerName().size(); j++)
{
serverName = _config.getServerBlocks()[i].getServerName()[j];
std::cout << RED << "Checking server name: " << serverName << RESET << std::endl;
if (serverName == request.getSingleHeader("host").second)
{
std::cout << GREEN << "Server name found" << RESET << std::endl;
break;
}
}
if (serverName == request.getSingleHeader("host").second)
if (findServerName(request, _config.getServerBlocks()[i]) == request.getSingleHeader("host").second)
{
findLocationBlock(request, _config.getServerBlocks()[i], directive);
break;
Expand Down Expand Up @@ -783,4 +783,21 @@ void Server::handleServerBlockError(Connection& conn, HTTPResponse &response)
response.setStatusCode(404, "No server block is matching the request host");
conn.setHasDataToSend(true);
return;
}

std::string Server::findServerName(HTTPRequest& request, ServerBlock& serverBlock)
{
std::string serverName;

for (size_t j = 0; j < serverBlock.getServerName().size(); j++)
{
serverName = serverBlock.getServerName()[j];
std::cout << RED << "Checking server name: " << serverName << RESET << std::endl;
if (serverName == request.getSingleHeader("host").second)
{
std::cout << GREEN << "Server name found" << RESET << std::endl;
break;
}
}
return serverName;
}
3 changes: 2 additions & 1 deletion src/Server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class Server

/* for handleConnection */
void readFromClient(Connection &conn, size_t &i, Parser &parser, HTTPRequest &request, HTTPResponse &response);
void handlePostRequest(Connection &conn, size_t &i, Parser &parser, HTTPRequest &request, HTTPResponse &response);
void buildResponse(Connection &conn, size_t &i, HTTPRequest &request, HTTPResponse &response);
void writeToClient(Connection &conn, size_t &i, HTTPResponse &response);
void closeClientConnection(Connection &conn, size_t &i);
Expand All @@ -74,7 +75,7 @@ class Server
void formRequestTarget(HTTPRequest &request);
void findLocationBlock(HTTPRequest &request, ServerBlock& serverBlock, Directives &directive);
void handleServerBlockError(Connection& conn, HTTPResponse &response);

std::string findServerName(HTTPRequest& request, ServerBlock& serverBlock);
/* Not avaiable constructors */
// Copy constructor
Server(const Server &other);
Expand Down

0 comments on commit bc9c13d

Please sign in to comment.