Skip to content

Commit

Permalink
refactor(Server): fix logic in Server, fix uploadHandler in case of a…
Browse files Browse the repository at this point in the history
…n error
  • Loading branch information
Stefano Lombardo committed May 21, 2024
1 parent c47fbf6 commit 6ffc2f8
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 90 deletions.
42 changes: 40 additions & 2 deletions config/webserv_default.conf
Original file line number Diff line number Diff line change
@@ -1,9 +1,47 @@
server {
listen 8080;
server_name localho:8080 localhost:8080 www.localhost:8080;
allow_methods GET POST DELETE;
autoindex off;
root /var/;
error_page 404 404.html;
cgi_ext .cgi;

location /admin {
return http://google.com;
index admin.html;
allow_methods GET POST;
}
location /cgi-bin/ {
cgi_ext .cgi .py;
autoindex off;
}
}

server {
listen 8080;
server_name www.development_site;
server_name www.example.com;
allow_methods GET POST;
autoindex on;
cgi_ext .cgi .py;
root var/;
location / {
index index.html;
allow_methods GET POST;
upload_path upload/;
}
}

server {
listen 8080;
server_name www.php_site.com;
allow_methods GET POST DELETE;
autoindex off;
root var/;
}

server {
listen 8080;
server_name www.php_site;
allow_methods GET POST DELETE;
root var/;
}
2 changes: 1 addition & 1 deletion include/webserv.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#define SEND_BUFFER_SIZE 1024 * 100 // 100 KB
#define BUFFER_SIZE 1025
#define CGI_TIMEOUT_MS 300000 // 3 seconds
#define CONFIG_FILE_DEFAULT_PATH "./config/webserv_default.conf"
#define CONFIG_FILE_DEFAULT_PATH "./conf/webserv_default.conf"

#define RED "\033[1;31m"
#define GREEN "\033[1;32m"
Expand Down
100 changes: 17 additions & 83 deletions src/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,7 @@ void Server::startPollEventLoop()
while (1)
{
if (_hasCGI)
{
std::cout << "We have CGI" << std::endl;
timeout = 1000; // 1 seconds
}
else
timeout = -1;
printConnections("BEFORE POLL", _FDs, _connections, true);
Expand All @@ -85,29 +82,16 @@ void Server::startPollEventLoop()
if (ret > 0)
{
size_t originalSize = _FDs.size();
// if _FDs becomes bigger than originalSize we don't want to loop over the new elements before we finish the
// old ones if _FDs becomes smaller than originalSize we don't want to loop over the old elements that are
// not in _FDs anymore

for (size_t i = 0; i < originalSize && i < _FDs.size(); i++)
{
if (_FDs[i].revents & (POLLIN | POLLOUT))
{
Debug::log("Enters revents", Debug::OCF);
// if (i == 0)
if (_connections[i].getType() == SERVER)
{
// printFrame("SERVER SOCKET EVENT", true);
acceptNewConnection(_connections[i]);
}
else
{
// printFrame("CLIENT SOCKET EVENT", true);
handleConnection(_connections[i],
i,
_connections[i].getParser(),
_connections[i].getRequest(),
_connections[i].getResponse());

handleConnection(_connections[i], i);
if ((_connections[i].getHasFinishedReading() && _connections[i].getHasDataToSend()))
_FDs[i].events = POLLOUT;
}
Expand Down Expand Up @@ -202,30 +186,23 @@ void Server::readFromClient(Connection &conn, size_t &i, Parser &parser, HTTPReq
Debug::log("\033[1;33mReading headers\033[0m", Debug::NORMAL);
if (!conn.readHeaders(parser))
{
// only in case of system error == do not send response
Debug::log("Error reading headers", Debug::OCF);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(false);
conn.setCanBeClosed(true);
return;
}
conn.setHasReadSocket(true);
if (!parser.preParseHeaders(response))
{
// logic was incorrect here
conn.setCanBeClosed(false);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(false);
// ---------------------
std::cout << "Error pre-parsing headers" << std::endl;
return;
}
}

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

if (parser.getHeadersComplete() && !parser.getHeadersAreParsed())
{
Expand All @@ -236,19 +213,14 @@ void Server::readFromClient(Connection &conn, size_t &i, Parser &parser, HTTPReq

if (response.getStatusCode() != 0)
{
conn.setCanBeClosed(false);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(false);
Debug::log("Error parsing headers or request line", Debug::NORMAL);
return;
}

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

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

if (request.getMethod() == "GET" || request.getMethod() == "DELETE" || request.getMethod() == "SALAD")
Debug::log("GET request, no body to read", Debug::NORMAL);
else
Expand All @@ -260,56 +232,48 @@ void Server::handlePostRequest(Connection &conn, Parser &parser, HTTPRequest &re
if (parser.getIsChunked() && !conn.getHasReadSocket())
{
Debug::log("Chunked body", Debug::NORMAL);
// TODO: double check this condition, logic
if (!conn.readChunkedBody(parser))
{
// only in case of system error == do not send response
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: double check this condition, logic
if (!parser.getBodyComplete() && parser.getBuffer().size() == request.getContentLength())
{
// if body was read during reading headers
parser.setBodyComplete(true);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(true);
}
//-----------------------------//

else if (!conn.readBody(parser, request, response))
{
// only in case of system error == do not send response
Debug::log("Error reading body", Debug::OCF);
conn.setCanBeClosed(false);
conn.setCanBeClosed(true);
conn.setHasFinishedReading(true);
conn.setHasDataToSend(false);
conn.setHasDataToSend(true);
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;
}
Expand Down Expand Up @@ -502,8 +466,13 @@ void Server::closeClientConnection(Connection &conn, size_t &i)
--i;
}

void Server::handleConnection(Connection &conn, size_t &i, Parser &parser, HTTPRequest &request, HTTPResponse &response)
void Server::handleConnection(Connection &conn, size_t &i)
{
Parser &parser = _connections[i].getParser();
HTTPRequest &request = _connections[i].getRequest();
HTTPResponse &response = _connections[i].getResponse();

// printFrame("CLIENT SOCKET EVENT", true);
std::cout << "\033[1;36m" << "Entering handleConnection" << "\033[0m" << std::endl;

conn.setHasReadSocket(false);
Expand Down Expand Up @@ -755,6 +724,7 @@ void Server::acceptNewConnection(Connection &conn)

// struct sockaddr_in clientAddress;
// We choose sockaddr_storage to be able to handle both IPv4 and IPv6
// printFrame("SERVER SOCKET EVENT", true);
struct sockaddr_storage clientAddress;
socklen_t ClientAddrLen = sizeof(clientAddress);
Debug::log("New connection detected", Debug::SERVER);
Expand Down Expand Up @@ -980,39 +950,3 @@ void Server::findLocationBlock(HTTPRequest &request, ServerBlock &serverBlock, D
}
}
}

// void Server::handleServerBlockError(Connection& conn, HTTPResponse &response)
// {
// // if error already occurred, we don't want to overwrite it
// if (response.getStatusCode() != 0)
// {
// Debug::log("Error response" + toString(response.getStatusCode()), Debug::NORMAL);
// response.setErrorResponse(response.getStatusCode());
// conn.setHasDataToSend(true);
// return;
// }

// static StaticContentHandler staticContentInstance;

// staticContentInstance.handleNotFound(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;
// }
2 changes: 1 addition & 1 deletion src/Server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class Server
// void addServerSocketPollFdToVectors();
void addServerSocketsPollFdToVectors();
void acceptNewConnection(Connection &conn);
void handleConnection(Connection &conn, size_t &i, Parser &parser, HTTPRequest &request, HTTPResponse &response);
void handleConnection(Connection &conn, size_t &i);
void handleServerSocketError();
void handleClientSocketError(int clientFD, size_t &i);
void handleSocketTimeoutIfAny();
Expand Down
5 changes: 2 additions & 3 deletions src/UploadHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@ bool UploadHandler::createFile(HTTPRequest &request)
else
_uploadDir = request.getRoot() + request.getHost() + "/" + _uploadDir;


std::cout << "Creating file at " << _uploadDir << std::endl;
std::vector<File> files = request.getFiles();
std::vector<File>::iterator it;
Expand Down Expand Up @@ -160,7 +159,7 @@ void UploadHandler::handleRequest(HTTPRequest &request, HTTPResponse &response)
{
std::cout << PURPLE << "calling upload boundary" << RESET << std::endl;
if (!createFile(const_cast<HTTPRequest &>(request)))
response.setStatusCode(422, "Unprocessable Entity");
return (response.setStatusCode(422, "Unprocessable Entity"));
handleResponse(response, SUCCESS);
}
else
Expand All @@ -169,7 +168,7 @@ void UploadHandler::handleRequest(HTTPRequest &request, HTTPResponse &response)
// temporary solution
std::cout << PURPLE << "calling create file chunked" << RESET << std::endl;
if (!createFileChunked(const_cast<HTTPRequest &>(request)))
response.setStatusCode(422, "Unprocessable Entity");
return (response.setStatusCode(422, "Unprocessable Entity"));
handleResponse(response, SUCCESS);
// std::cout << "415 Unsupported Media Type" << std::endl;
// handleResponse(response, BAD_REQUEST);
Expand Down

0 comments on commit 6ffc2f8

Please sign in to comment.