/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* 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; std::string root; std::vector index; unsigned int allow_methods; std::vector cgi_ext; // php not .php bool autoindex; std::vector upload_repo; // 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 << "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... bool operator<(const LocationConfig& rhs) const { int comp_lhs = 0; int comp_rhs = 0; size_t tmp = 0; // 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 << "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); return (comp_lhs < comp_rhs); // right comparison ? not <= ? }; }; #endif