diff --git a/Makefile b/Makefile index 7f16bc5..bfa86cf 100644 --- a/Makefile +++ b/Makefile @@ -11,13 +11,13 @@ UTILS = __raw_data_utils.cpp __file_manager_utils.cpp __webserv_utils.cpp CONN = Req.cpp Res.cpp ConnStream.cpp HttpError.cpp -SERVER_ENG = ServerContext.cpp WebServer.cpp +SERVER_ENG = ServerContext.cpp WebServer.cpp ServerError.cpp SRC = $(addprefix srcs/__utils/,$(UTILS)) \ $(addprefix srcs/server_engine/,$(SERVER_ENG)) \ $(addprefix srcs/parser/,$(PARSER)) \ - $(addprefix srcs/conn/,$(CONN)) \ - $(addprefix srcs/,main.cpp) \ + $(addprefix srcs/conn/,$(CONN)) \ + $(addprefix srcs/,main.cpp) \ OBJ = $(SRC:.cpp=.o) diff --git a/inc/Req.hpp b/inc/Req.hpp index bbd30e6..eee76bb 100644 --- a/inc/Req.hpp +++ b/inc/Req.hpp @@ -73,8 +73,6 @@ class Req std::string file_ext; std::string query_string; - std::vector cgi_path; - std::string is_route; int route_id; diff --git a/inc/ServerContext.hpp b/inc/ServerContext.hpp index d717989..34e5de2 100644 --- a/inc/ServerContext.hpp +++ b/inc/ServerContext.hpp @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ServerContext.hpp :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: ratavare +#+ +:+ +#+ */ +/* By: asepulve +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/09 12:31:02 by asepulve #+# #+# */ -/* Updated: 2024/05/22 17:11:52 by ratavare ### ########.fr */ +/* Updated: 2024/05/23 01:13:07 by asepulve ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ /* Classes */ #include "Parser.hpp" +#include /* Utils */ #include <__webserv_utils.hpp> diff --git a/inc/ServerError.hpp b/inc/ServerError.hpp new file mode 100644 index 0000000..e836a2e --- /dev/null +++ b/inc/ServerError.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include +#include +#include + +class ServerError : public std::exception +{ + private: + const char *msg; + virtual const char *what() const throw(); + public: + const char * get_msg(void) const; + ServerError(const char *_msg); +}; diff --git a/inc/WebServer.hpp b/inc/WebServer.hpp index 78eb371..693a557 100644 --- a/inc/WebServer.hpp +++ b/inc/WebServer.hpp @@ -1,7 +1,5 @@ #pragma once -#include - /* C headers*/ #include #include @@ -23,6 +21,9 @@ /* Classes */ #include +#include +#include + /* Utils */ #include <__webserv_utils.hpp> @@ -55,15 +56,5 @@ class WebServer void close_conn(int, int); void time_out(int); - class Error : public std::exception - { - private: - const char *msg; - virtual const char *what() const throw(); - - public: - Error(const char *_msg); - }; - static void sig_handler(int sig); // * Handles Ctrl + c }; diff --git a/inc/__file_manager_utils.hpp b/inc/__file_manager_utils.hpp index 840325f..73459e0 100644 --- a/inc/__file_manager_utils.hpp +++ b/inc/__file_manager_utils.hpp @@ -36,7 +36,7 @@ namespace FileManager // * Get method std::string read_file(const std::string); - std::string directory_listing(const std::string, std::string, int); + std::string directory_listing(const std::string, std::string, int); // * Post method std::string create_files(const std::vector &, const std::string&, const std::string); diff --git a/srcs/conn/Req.cpp b/srcs/conn/Req.cpp index 67c3fd8..3ea9c25 100644 --- a/srcs/conn/Req.cpp +++ b/srcs/conn/Req.cpp @@ -1,10 +1,9 @@ #include +/* +*/ Req::Req(ConnStream * _stream) : stream(_stream), out_of_bound(std::string::npos) { - this->cgi_path.push_back("a.py"); - this->cgi_path.push_back("a.php"); - this->content_length = 0; this->referer = std::string(); this->file_path = std::string(); diff --git a/srcs/conn/Res.cpp b/srcs/conn/Res.cpp index 65e837b..867718b 100644 --- a/srcs/conn/Res.cpp +++ b/srcs/conn/Res.cpp @@ -71,18 +71,16 @@ int Res::check_method(void) */ int Res::send(void) { + std::map &cgi_path = stream->server->cgi_path; Req *req = stream->req; - std::vector &cgi_path = req->cgi_path; - std::vector::iterator it = std::find(cgi_path.begin(), cgi_path.end(), req->file_path); - if (!this->status_code.empty() && !this->error_msg.empty()) return (build_http_response()); try { if (this->check_method() == -1) throw HttpError("403" , "Forbidden"); - if (it != req->cgi_path.end()) + if (cgi_path.find(req->file_ext) != cgi_path.end()) return (this->exec_CGI()); if (req->method == "GET") exec_get(); @@ -111,13 +109,9 @@ int Res::exec_CGI(void) int pipe_fd_aux[2]; pid_t pid; - char *argv0 = const_cast(""); - - if (req->file_ext == ".py") - argv0 = const_cast("/usr/bin/python3"); - else if (req->file_ext == ".php") - argv0 = const_cast("/usr/bin/php"); + ServerContext * server = stream->server; + char *argv0 = const_cast(server->cgi_path[req->file_ext].c_str()); char *argv1 = const_cast(req->file_path.c_str()); char *const argv[] = {argv0, argv1, NULL}; diff --git a/srcs/main.cpp b/srcs/main.cpp index a5c8c13..569ac54 100644 --- a/srcs/main.cpp +++ b/srcs/main.cpp @@ -2,6 +2,7 @@ #include #include + const char* RED_TEXT = "\033[31m"; const char* RESET_COLOR = "\033[0m"; diff --git a/srcs/server_engine/ServerContext.cpp b/srcs/server_engine/ServerContext.cpp index 6961a09..91675f9 100644 --- a/srcs/server_engine/ServerContext.cpp +++ b/srcs/server_engine/ServerContext.cpp @@ -5,6 +5,7 @@ */ ServerContext::ServerContext(t_server serverNode) { + std::list >::iterator cgi_it = serverNode.cgi.begin(); std::list::iterator it = serverNode.route.begin(); std::list >::iterator _it = serverNode.errorPages.begin(); std::list::iterator tmp; @@ -18,8 +19,13 @@ ServerContext::ServerContext(t_server serverNode) this->port = serverNode.port; this->name = serverNode.serverName; this->ip = serverNode.host; - for (std::list > ::iterator tmp = serverNode.cgi.begin(); tmp != serverNode.cgi.end(); tmp++) - this->cgi_path.insert(std::make_pair(tmp->first, tmp->second)); + + for (; cgi_it != serverNode.cgi.end(); cgi_it++) + { + if (!fopen(cgi_it->second.c_str(), "r")) + throw ServerError("CGI path doesn't exist. Maybe the cgi is not installed"); + this->cgi_path.insert(std::make_pair(cgi_it->first, cgi_it->second)); + } // * Error pages for (;_it != serverNode.errorPages.end(); _it++) diff --git a/srcs/server_engine/ServerError.cpp b/srcs/server_engine/ServerError.cpp new file mode 100644 index 0000000..0709713 --- /dev/null +++ b/srcs/server_engine/ServerError.cpp @@ -0,0 +1,13 @@ +#include + +ServerError::ServerError(const char *_msg) : msg(_msg) {} + + +const char *ServerError::get_msg(void) const +{ + return (msg); +} +const char *ServerError::ServerError::what() const throw() +{ + return (msg); +} diff --git a/srcs/server_engine/WebServer.cpp b/srcs/server_engine/WebServer.cpp index 2f57134..64d4994 100644 --- a/srcs/server_engine/WebServer.cpp +++ b/srcs/server_engine/WebServer.cpp @@ -67,7 +67,7 @@ void WebServer::init_servers(std::vector& vec) this->epoll_fd = epoll_create1(0); if (this->epoll_fd < 0) - throw Error("Epoll_create1 failed."); + throw ServerError("Epoll_create1 failed."); for (size_t i = 0; i < vec.size(); i++) { memset(&server_addr, 0, sizeof(struct sockaddr_in)); @@ -81,15 +81,15 @@ void WebServer::init_servers(std::vector& vec) this->servers[server_fd] = vec[i]; if (server_fd < 0) - throw Error("Socket failed."); + throw ServerError("Socket failed."); if (sfd_non_blocking(server_fd) < 0) - throw Error("Couldn't make the server socket non-blocking."); + throw ServerError("Couldn't make the server socket non-blocking."); if (set_reuseaddr(server_fd) < 0) - throw Error("Setsockopt failed"); + throw ServerError("Setsockopt failed"); if (bind(server_fd, &server_addr) < 0) - throw Error("Bind failed."); + throw ServerError("Bind failed."); if (::listen(server_fd, vec[i]->max_events) < 0) - throw Error("Listen failed."); + throw ServerError("Listen failed."); memset(&event, 0, sizeof(struct epoll_event)); event.events = EPOLLIN; @@ -97,7 +97,7 @@ void WebServer::init_servers(std::vector& vec) this->servers[server_fd]->epoll_event_info = static_cast(event.data.ptr); if (epoll_add_fd(this->epoll_fd, server_fd, event)) - throw Error("epoll_ctl failed."); + throw ServerError("epoll_ctl failed."); this->max_events += vec[i]->max_events; std::cout << "[" << vec[i]->max_events << "] Listening on port: " << vec[i]->port << std::endl; @@ -117,15 +117,15 @@ void WebServer::accept_connection(int epoll_fd, int fd) int client_fd = accept(fd, (struct sockaddr *)&client_addr, &client_addr_len); if (client_fd < 0) - throw Error("accept failed."); + throw ServerError("accept failed."); if (sfd_non_blocking(client_fd) < 0) - throw Error("Couln't make socket fd non-blocking."); + throw ServerError("Couln't make socket fd non-blocking."); event.events = EPOLLIN | EPOLLET; event.data.ptr = new t_event_data(client_fd, CLIENT); if (epoll_add_fd(epoll_fd, client_fd, event) < 0) - throw Error("Epoll_ctl failed"); + throw ServerError("Epoll_ctl failed"); this->streams[client_fd] = new ConnStream(client_fd, servers[fd]); this->streams[client_fd]->epoll_event_info = static_cast(event.data.ptr); } @@ -139,7 +139,7 @@ void WebServer::send_response(int epoll_fd, int fd, t_event event) int status = this->streams[fd]->res->send(); this->streams[fd]->set_time(); // * Update last action; if ((status > 0) && epoll_in_fd(epoll_fd, fd, event) < 0) - throw Error("Epoll_ctl failed"); + throw ServerError("Epoll_ctl failed"); this->streams[fd]->clean_conn(); if (status == -1) close_conn(epoll_fd, fd); @@ -156,7 +156,7 @@ void WebServer::read_request(int epoll_fd, int fd, t_event event) this->streams[fd]->set_time(); if ((status == 1) && epoll_out_fd(epoll_fd, fd, event)) - throw Error("Epoll_ctl failed"); + throw ServerError("Epoll_ctl failed"); if (status == -1) this->close_conn(epoll_fd, fd); } @@ -230,7 +230,7 @@ void WebServer::listen(void) time_out(epoll_fd); } if (num_events < 0 && is_running) - throw Error("Epoll_wait failed."); + throw ServerError("Epoll_wait failed."); } /*Signal Handler*/ @@ -248,18 +248,10 @@ void WebServer::sig_handler(int sig) void WebServer::close_conn(int epoll_fd, int sfd) { if (epoll_del_fd(epoll_fd, sfd) < 0) - throw Error("Epoll_ctl failed"); + throw ServerError("Epoll_ctl failed"); close(sfd); if (waitpid(streams[sfd]->cgi_pid, NULL, WNOHANG) == 0) kill(this->streams[sfd]->cgi_pid, SIGKILL); delete this->streams[sfd]; this->streams.erase(sfd); } - -/*Exception class*/ -WebServer::Error::Error(const char *_msg) : msg(_msg) {} - -const char *WebServer::Error::what() const throw() -{ - return (msg); -}