Skip to content

Commit

Permalink
bug(Metavariables): fix content length metavar that prevented the scr…
Browse files Browse the repository at this point in the history
…ipt from working
  • Loading branch information
lmangall committed May 21, 2024
1 parent f2a20fc commit 45361d6
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 26 deletions.
6 changes: 5 additions & 1 deletion src/CGIHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,18 @@ void CGIHandler::handleRequest(HTTPRequest &request, HTTPResponse &response)
MetaVariables env;
env.HTTPRequestToMetaVars(request, env);

std::cout << BLUE << "CGIHandler: handleRequest" << RESET << std::endl;

std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl;
std::cout << request << std::endl;
std::cout << request.getBody() << std::endl;
std::cout << YELLOW << request.getBody() << RESET << std::endl;
std::cout << std::endl;
std::cout << std::endl;

std::cout << YELLOW << "Request body: " << request.getBody() << RESET << std::endl;

if (!executeCGI(env, request.getBody(), response))
{
response.setStatusCode(500, "");
Expand Down
5 changes: 3 additions & 2 deletions src/MetaVariables.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,14 +188,15 @@ void MetaVariables::HTTPRequestToMetaVars(const HTTPRequest &request, MetaVariab
{
env.setVar("CONTENT_TYPE", "");
}
std::pair<std::string, std::string> contentLengthHeader = request.getSingleHeader("Content-Length");
std::pair<std::string, std::string> contentLengthHeader = request.getSingleHeader("content-length");
if (!contentLengthHeader.first.empty())
{
env.setVar("CONTENT_LENGTH", contentLengthHeader.second);
Debug::log("Content-Length header found.", Debug::NORMAL);
}
else
{
env.setVar("CONTENT_LENGTH", "0");
Debug::log("Content-Length header not found.", Debug::NORMAL);
}
}

Expand Down
45 changes: 26 additions & 19 deletions src/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,9 +213,9 @@ bool requestIsCGI(const HTTPRequest &request)
void handlePostCGIRequest(Connection &conn, Parser &parser, HTTPRequest &request, HTTPResponse &response)
{
std::cout << BLUE << "handlePostCGIRequest" << RESET << std::endl;
if (parser.getIsChunked() && !conn.getHasReadSocket())
if (!parser.getIsChunked() && !conn.getHasReadSocket())
{
Debug::log("Chunked body in handlePostCGIRequest", Debug::NORMAL);
Debug::log("Not a chunked body in handlePostCGIRequest", Debug::NORMAL);
if (!conn.readBody(parser, request, response))
{
Debug::log("Error reading body", Debug::OCF);
Expand All @@ -227,21 +227,21 @@ void handlePostCGIRequest(Connection &conn, Parser &parser, HTTPRequest &request
}
else if (!conn.getHasReadSocket())
{
if (!parser.getBodyComplete() && parser.getBuffer().size() == request.getContentLength())
{
parser.setBodyComplete(true);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(true);
}

else if (!conn.readBody(parser, request, response))
{
Debug::log("Error reading body", Debug::OCF);
conn.setCanBeClosed(false);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(false);
return;
}
// if (!parser.getBodyComplete() && parser.getBuffer().size() == request.getContentLength())
// {
// parser.setBodyComplete(true);
// conn.setHasFinishedReading(true);
// conn.setHasDataToSend(true);
// }

// else if (!conn.readBody(parser, request, response))
// {
// 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 &&
Expand All @@ -252,6 +252,7 @@ void handlePostCGIRequest(Connection &conn, Parser &parser, HTTPRequest &request
conn.setHasFinishedReading(true);
conn.setCanBeClosed(false);
conn.setHasDataToSend(false);
std::cout << "Body complete in handlePostCGIRequest" << std::endl;
return;
}
//-----------------------------//
Expand All @@ -267,8 +268,11 @@ void handlePostCGIRequest(Connection &conn, Parser &parser, HTTPRequest &request
if (!request.getUploadBoundary().empty())
parser.parseFileUpload(parser.getBuffer(), request, response);

request.setBody(parser.getBuffer());
conn.setHasFinishedReading(true);
// TODO: check if this is correct
request.setBody(parser.getBuffer());
std::cout << YELLOW << "Request body: " << request.getBody() << RESET << std::endl;
Debug::log("Finished reading in handlePostCGIRequest", Debug::NORMAL);
}

void Server::readFromClient(Connection &conn, size_t &i, Parser &parser, HTTPRequest &request, HTTPResponse &response)
Expand Down Expand Up @@ -409,7 +413,7 @@ void Server::buildResponse(Connection &conn, size_t &i, HTTPRequest &request, HT
(void)i;
Debug::log("Entering buildResponse", Debug::NORMAL);
Debug::log("Request method: " + request.getMethod(), Debug::NORMAL);

std::cout << YELLOW << "Request body in buildResponse: " << request.getBody() << RESET << std::endl;
if (!response.getIsCGI())
{
ServerBlock serverBlock;
Expand Down Expand Up @@ -569,6 +573,9 @@ void Server::handleConnection(Connection &conn, size_t &i, Parser &parser, HTTPR
return;
}
std::cout << request << std::endl;

std::cout << YELLOW << "Request body in handleConnection: " << request.getBody() << RESET << std::endl;

if (!conn.getCanBeClosed() && !conn.getHasDataToSend())
buildResponse(conn, i, request, response);
// MInd that after the last read from the pipe of the CGI getHasReadSocket will be false but we will have a read
Expand Down
4 changes: 2 additions & 2 deletions tests/CGI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,12 +182,12 @@ void sendData(const std::vector<HTTPTest> &tests, sockaddr_in serverAddress)

void cgi(sockaddr_in serverAdress)
{
std::string postData = "name=Jasasane&salad=Caesar";
std::string postData = "name=Jane&salad=Caesar";
std::stringstream request;
request << "POST /database/salad_db.py HTTP/1.1\r\n"
<< "Host: www.saladbook.xyz\r\n"
<< "Content-Type: application/x-www-form-urlencoded\r\n"
<< "Content-Length: " << postData.size() << "\r\n"
<< "content-Length: " << postData.size() << "\r\n"
<< "\r\n"
<< postData << "\r\n\r\n";

Expand Down
5 changes: 3 additions & 2 deletions var/www.saladbook.xyz/database/database.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"Stefano": "Carrot",
"Leo": "nicoise",
"Daniil": "with_beets"
}
"Daniil": "with_beets",
"Jane": "Caesar"
}

0 comments on commit 45361d6

Please sign in to comment.