#include "cgi_utils.hpp" std::string str_tolower(std::string str) { std::transform(str.begin(), str.end(), str.begin(), ::tolower); return str; } std::string trim(std::string str, char del) { size_t pos; // delete leadings del pos = str.find_first_not_of(del); if (pos == NPOS) pos = str.size(); str = str.substr(pos); // delete trailing del pos = str.find_last_not_of(del); if (pos != NPOS) str = str.substr(0, pos + 1); return str; } std::vector split(const std::string & input, std::string delim, char ctrim) { std::vector split_str; std::string tmp; size_t start = 0; size_t end = 0; size_t len = 0; while (end != NPOS) { end = input.find(delim, start); len = end - start; if (end == NPOS) len = end; tmp = input.substr(start, len); if (ctrim != '\0') tmp = trim(tmp, ctrim); if (tmp.size() != 0) split_str.push_back( tmp ); start = end + delim.size(); } return split_str; } std::string itos(int n) { std::stringstream strs; strs << n; return ( strs.str() ); } std::string parse_env(const std::string & env) { std::string ret = ""; char * ret_env; ret_env = getenv(env.c_str()); if (ret_env != NULL) ret = ret_env; return ret; } std::string print_env(char **env, std::string tag) { std::string ret = ""; for (int i = 0; env[i] != NULL; ++i) { ret += "<" + tag + ">"; ret += env[i]; ret += "
"; } return ret; } std::string print_form(std::string form, std::string tag_key, std::string tag_val) { std::vector split_str; std::vector sub_split_str; std::vector::const_iterator it; std::string ret = ""; std::string key; split_str = split(form, "&"); for (it = split_str.begin(); it != split_str.end(); ++it) { sub_split_str = split(*it, "="); key = sub_split_str[0]; if (key == "fname") key = "first name"; else if (key == "lname") key = "last name"; ret += "
<" + tag_key + ">" + key + ": "; ret += "<" + tag_val + ">" + sub_split_str[1] + ""; } return ret; } std::string get_form_infos(const std::string & rq_body) { std::string form_infos; std::string method; method = parse_env("REQUEST_METHOD"); if (method == "POST") form_infos = rq_body; else if (method == "GET") form_infos = parse_env("QUERY_STRING"); return form_infos; } std::string get_value(const std::string & key, const std::string & rq_body) { std::string infos; std::string ret; size_t pos; size_t end; size_t len; infos = get_form_infos(rq_body); pos = str_tolower(infos).find(str_tolower(key)); if (pos == NPOS) return ""; pos = infos.find_first_of("=", pos); if (pos == NPOS) return ""; pos++; end = infos.find_first_of("&", pos); if (end == NPOS) end = infos.size(); len = end - pos; ret = infos.substr(pos, len); return ret; } void fill_body_basic(char **env, std::string & http_body, const std::string & rq_body) { std::string rq_method = "not found"; std::string rq_query; std::string form_infos; rq_method = parse_env("REQUEST_METHOD"); rq_query = parse_env("QUERY_STRING"); if (rq_method == "POST") form_infos = rq_body; else if (rq_method == "GET") form_infos = rq_query; http_body = HTML_BODY_TOP; http_body += "

method used:

"; http_body += "

" + rq_method + "

"; http_body += "

form body:

"; http_body += "

" + rq_body + "

"; http_body += "

form query:

"; http_body += "

" + rq_query + "

"; http_body += "

output:


"; http_body += print_form(form_infos, "p", "p"); http_body += "

cgi_env_variables:


"; http_body += print_env(env, "p"); http_body += HTML_BODY_BOTTOM; } size_t eval_file_read(const std::string &path) { if (::access(path.c_str(), F_OK) == -1) { std::perror("err access()"); return 404; // NOT_FOUND, file doesn't exist } if (::access(path.c_str(), R_OK) == -1) { std::perror("err access()"); return 403; // FORBIDDEN, file doesn't have access permission } return 0; }