/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* 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 "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; 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