#include "Webserv.hpp" bool Webserv::_is_cgi(Client *client) { // TODO see how it works with config if (client->fill_script_path("php-cgi")) return true; if (client->fill_script_path("cgi_cpp.cgi")) 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::_dup_env(std::string var, int i) { std::string str; std::string val; val = ::itos(i); 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"); // authentification not supported env[1] = _dup_env("CONTENT_LENGTH" , client->get_rq_body().size()); env[2] = _dup_env("CONTENT_TYPE" , client->get_rq_headers("Content-Type")); env[3] = _dup_env("GATEWAY_INTERFACE" , "CGI/1.0"); env[4] = _dup_env("PATH_INFO" , client->get_rq_script_info()); env[5] = _dup_env("PATH_TRANSLATED"); // not supported env[6] = _dup_env("QUERY_STRING" , client->get_rq_query()); 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(client->get_rq_script_path().c_str(), 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; }