#include "Webserv.hpp" bool Webserv::_is_cgi(Client *client) { if (client->get_rq_path().find("/cgi-bin/") != std::string::npos) return true; return false; } void Webserv::_exec_cgi(Client *client) { char** env; env = _set_env(client); _exec_script(client, env); // _construct_response(client); } char* Webserv::_dup_env(std::string var, std::string val = "") { std::string str; str = var + "=" + val; return ( strdup(str.c_str()) ); } char** Webserv::_set_env(Client *client) { char** env = new char*[19]; env[0] = _dup_env("AUTH_TYPE"); env[1] = _dup_env("CONTENT_LENGTH" , "665"); env[2] = _dup_env("CONTENT_TYPE"); env[3] = _dup_env("GATEWAY_INTERFACE"); env[4] = _dup_env("PATH_INFO"); env[5] = _dup_env("PATH_TRANSLATED"); env[6] = _dup_env("QUERY_STRING"); env[7] = _dup_env("REMOTE_ADDR" , client->get_cl_ip()); env[8] = _dup_env("REMOTE_HOST" , client->get_rq_headers("Host")); // just test env[9] = _dup_env("REMOTE_IDENT"); // authentification not supported env[10] = _dup_env("REMOTE_USER"); // authentification not supported env[11] = _dup_env("REQUEST_METHOD" , client->get_rq_method_str()); env[12] = _dup_env("SCRIPT_NAME"); // TODO: define (https://www.rfc-editor.org/rfc/rfc3875#section-4.1.13 // ,https://www.rfc-editor.org/rfc/rfc3875#section-8.2) env[13] = _dup_env("SERVER_NAME" , client->get_rq_hostname()); env[14] = _dup_env("SERVER_PORT" , client->get_rq_port()); env[15] = _dup_env("SERVER_PROTOCOL", client->get_rq_version()); env[16] = _dup_env("SERVER_SOFTWARE", "webser/1.0"); env[17] = _dup_env("REDIRECT_STATUS", "200"); env[18] = NULL; return env; } void Webserv::_exec_script(Client *client, char **env) { int save_stdout; char * const * nll = NULL; // save STDOUT save_stdout = dup(STDOUT_FILENO); // inside child process if (fork() == 0) { dup2(client->get_cl_fd(), STDOUT_FILENO); // execve("./srcs/cgi-bin/cgi_cpp.cgi", nll, client->env); execve("./srcs/cgi-bin/php-cgi", nll, env); } // inside parent process else waitpid(-1, NULL, 0); // restore stdout dup2(save_stdout, STDOUT_FILENO); } void Webserv::_construct_client(Client *client) { (void)client; }