From 8477669e6f446d9d20d98739490b4b29a2549c43 Mon Sep 17 00:00:00 2001 From: hugogogo Date: Wed, 27 Jul 2022 20:47:13 +0200 Subject: [PATCH] adding first tests with cgi --- {testers => 42_testers}/cgi_tester | Bin {testers => 42_testers}/tester | Bin README.md | 5 +++ headers/Webserv.hpp | 27 ++++++------ index.html | 13 ++++++ srcs/Webserv.cpp | 67 +++++++++++++++++++++++++++++ srcs/cgi-bin/cgi.cpp | 41 ++++++++++++++++++ srcs/cgi-bin/cgi_cpp.cgi | Bin 0 -> 14576 bytes srcs/cgi-bin/php-cgi | 7 +++ 9 files changed, 146 insertions(+), 14 deletions(-) rename {testers => 42_testers}/cgi_tester (100%) rename {testers => 42_testers}/tester (100%) create mode 100644 index.html create mode 100644 srcs/cgi-bin/cgi.cpp create mode 100755 srcs/cgi-bin/cgi_cpp.cgi create mode 100755 srcs/cgi-bin/php-cgi diff --git a/testers/cgi_tester b/42_testers/cgi_tester similarity index 100% rename from testers/cgi_tester rename to 42_testers/cgi_tester diff --git a/testers/tester b/42_testers/tester similarity index 100% rename from testers/tester rename to 42_testers/tester diff --git a/README.md b/README.md index a9668a1..56711d5 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,11 @@ SERVER_SOFTWARE : the server software you're using (e.g. Apache 1.3) ``` REDIRECT_STATUS : for exemple, 200 ``` +#### cgi questions : +- when should we use the cgi ? + - execute cgi based on certain file extensions as defined in configuration file + - if the path lead to the cgi script ? + - for certain methods like POST GET or DELETE ? --- ## ressources diff --git a/headers/Webserv.hpp b/headers/Webserv.hpp index fda9751..bef8f0e 100644 --- a/headers/Webserv.hpp +++ b/headers/Webserv.hpp @@ -4,24 +4,23 @@ # include # include -# include // errno -# include // perror +# include // errno +# include // perror # include # include -# include // close -# include // cout, cin -# include // memset - -# include // socket, accept, listen, send, recv, bind, connect, setsockopt, getsockname -# include // sockaddr_in -// # include // usefull for what ? -# include // htonl, htons, ntohl, ntohs, inet_addr - -# include // epoll -# include // fcntl +# include // close +# include // cout, cin +# include // memset +# include // socket, accept, listen, send, recv, bind, connect, setsockopt, getsockname +# include // sockaddr_in +# include // htonl, htons, ntohl, ntohs, inet_addr +# include // epoll +# include // fcntl +# include // waitpid +# include // stringstream #define BUFSIZE 8192 -#define TIMEOUT 3 * 60 * 1000 +#define TIMEOUT 10 * 1000 #define MAX_EVENTS 42 // arbitrary #define MSG_TEST "Le Webserv / 20 =D\n" #define MSG_BOUNCE "bounced properly ;)\n" // placeholder diff --git a/index.html b/index.html new file mode 100644 index 0000000..ae36576 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + +
+ +
+ + + diff --git a/srcs/Webserv.cpp b/srcs/Webserv.cpp index b0bd37f..9c57479 100644 --- a/srcs/Webserv.cpp +++ b/srcs/Webserv.cpp @@ -177,6 +177,73 @@ void Webserv::_read_request(int fd) void Webserv::_send_response(int fd) { + + + // TMP test cgi + // find POST in _buf + std::string tmpstr = _buf; + std::size_t found; + found = tmpstr.find("POST"); + // if "POST" found, execve a cgi + if (found != std::string::npos) + { + int save_stdout; + char** env = new char*[4]; + char * const * nll = NULL; + + // set env + env[0] = strdup("PATH_INFO=/no"); + env[1] = strdup("REQUEST_METHOD=POST"); + env[2] = strdup("SERVER_PROTOCOL=HTTP/1.1"); + env[3] = NULL; + // save STDOUT + save_stdout = dup(STDOUT_FILENO); + // inside chil process + if (fork() == 0) + { + dup2(fd, STDOUT_FILENO); + execve("./srcs/cgi-bin/cgi_cpp.cgi", nll, env); + } + // inside parent process + else + waitpid(-1, NULL, 0); + // restore stdout + dup2(save_stdout, STDOUT_FILENO); + // don't send the rest + ::close(fd); + return; + } + else + found = tmpstr.find("index.html"); + // if "index.html" found, send the page + if (found != std::string::npos) + { + int index_fd; + std::string to_send; + std::string end_header = "\r\n\r\n"; + std::string body; + std::stringstream strs; + char buffer[1]; + + to_send = "HTTP/1.1 200 OK\nContent-Type: text/html; charset=UTF-8\nContent-Length: "; + index_fd = open("./index.html", O_RDONLY); + for (int ret = 1; ret > 0;) + { + ret = read(index_fd, buffer, 1); + body += buffer; + } + strs << body.size(); + to_send += strs.str(); + to_send += end_header; + to_send += body; + ::send(fd, to_send.c_str(), to_send.size(), 0); + // don't send the rest + ::close(fd); + return; + } + // TMP end test cgi + + std::cout << "send()\n"; if (::send(fd, _buf, _read_ret, 0) == -1) std::perror("err send(): "); diff --git a/srcs/cgi-bin/cgi.cpp b/srcs/cgi-bin/cgi.cpp new file mode 100644 index 0000000..3882239 --- /dev/null +++ b/srcs/cgi-bin/cgi.cpp @@ -0,0 +1,41 @@ +# include +# include +# include + +int main (int ac, char **av) { + std::string to_send; + std::string header; + std::string end_header = "\r\n\r\n"; + std::string response; + std::stringstream strs; + + header = "HTTP/1.1 200 OK\n"; + header += "Content-Type: text/html; charset=UTF-8\n"; + header += "Content-Length: "; + + response = "\n"; + response += "\n"; + response += "\n"; + response += "CGI\n"; + response += "\n"; + response += "\n"; + response += "

CGI request :

\n"; + for (int i = 1; i < ac; i++) + { + response += "

"; + response += av[i]; + response += "

\n"; + } + response += "\n"; + response += "\n"; + + strs << response.size(); + header += strs.str(); + header += end_header; + to_send = header; + to_send += response; + + std::cout << to_send; + + return 0; +} diff --git a/srcs/cgi-bin/cgi_cpp.cgi b/srcs/cgi-bin/cgi_cpp.cgi new file mode 100755 index 0000000000000000000000000000000000000000..95013cbab183e1dadb657b89fd40e3c70bfc5ed6 GIT binary patch literal 14576 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 RLi+cs2IcQ_l!9CTe*xzN5cL26 literal 0 HcmV?d00001 diff --git a/srcs/cgi-bin/php-cgi b/srcs/cgi-bin/php-cgi new file mode 100755 index 0000000..bb78d68 --- /dev/null +++ b/srcs/cgi-bin/php-cgi @@ -0,0 +1,7 @@ +#! /usr/bin/php + +# +