/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* LocationConfig.hpp :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/07/23 16:08:00 by me #+# #+# */ /* Updated: 2022/08/04 19:32:40 by erlazo ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef LOCATIONCONFIG_HPP # define LOCATIONCONFIG_HPP # include # include # include # include # include // stat() # include // printf(), gotta go # include "utils.hpp" // again, struct instead? class LocationConfig { public: // canonic stuff? // i thought this might fix the "non static member function" // shit i'm getting with the comparator... LocationConfig() {} ~LocationConfig() {} std::string path; int client_body_limit; std::string root; std::vector index; unsigned int allow_methods; std::map cgi_info; // wait if i can call several times, shouldn't it be a map? // wait no there can only be 1 and i think it might have to be in // location only... int redirect_status; std::string redirect_uri; // au pire you do location / { return 301 http://location; } // and that's how you get the redirect from the root. void print_all() { std::cout << "\nPRINTING A LOCATION\n"; std::cout << "Path: " << path << '\n'; std::cout << "client_body_limit: " << client_body_limit << '\n'; std::cout << "root: " << root << '\n'; std::cout << "Skipping index...\n"; std::cout << "Location allow_methods: "; std::cout << ::http_methods_to_str(allow_methods) << "\n"; std::cout << "Skipping redirect status etc...\n"; std::cout << "------\n"; } // works a lot better than using a compare function... // but it still doesn't work... // problem is the logic bool operator<(const LocationConfig& rhs) const { int comp_lhs = 0; int comp_rhs = 0; size_t tmp = 0; // consider adding 1 to path that ends in a file not folder. // What are the rules... // / is smaller than /test // and /test/test1 is bigger than test // so we want to count / while ((tmp = this->path.find_first_of("/", tmp)) != std::string::npos) { ++tmp; ++comp_lhs; } if (path[path.find_last_of("/") + 1] != '\0') ++comp_lhs; tmp = 0; while ((tmp = rhs.path.find_first_of("/", tmp)) != std::string::npos) { ++tmp; ++comp_rhs; } if (rhs.path[rhs.path.find_last_of("/") + 1] != '\0') ++comp_rhs; // ok now we need to add a thing where we check for files vs folders if (comp_lhs == comp_rhs) { if (path_is_valid(root + path) == 2) --comp_lhs; if (path_is_valid(rhs.root + rhs.path) == 2) --comp_rhs; /* std::cout << "locations are equal\n"; std::string tmp_path_lhs = root + path; std::cout << "root + path: " << tmp_path_lhs << '\n'; // const char *c_path_lhs = (root + path).substr(1).c_str(); // could the problem be that i'm in the .hpp ? const char *c_path_lhs = tmp_path_lhs.substr(1).c_str(); const char *c_path_rhs = (rhs.root + rhs.path).substr(1).c_str(); printf("lhs path: %s\n", c_path_lhs); printf("rhs path: %s\n", c_path_rhs); struct stat sl; struct stat sr; if (stat(c_path_lhs, &sl) == 0 && S_ISREG(sl.st_mode)) { std::cout << "lhs is a file\n"; --comp_lhs; } if (stat(c_path_rhs, &sr) == 0 && S_ISREG(sr.st_mode)) { std::cout << "rhs is a file\n"; --comp_rhs; } // do i need to free c_path's ??? */ } std::cout << "comp_lhs: " << comp_lhs << " comp_rhs: " << comp_rhs \ << " bool res: " << (comp_lhs > comp_rhs) << "\n"; // i honestly can't tell you how or why but using > rather than < // fixed all my problems // the fact that the bool was always 0 before, and the correct order // i want... super weird... // return (comp_lhs > comp_rhs); // right comparison ? not <= ? return (comp_lhs < comp_rhs); // right comparison ? not <= ? }; }; // ok it needs to go somewhere else #endif