Files
42_INT_12_webserv/srcs/config/LocationConfig.hpp

166 lines
4.4 KiB
C++

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* LocationConfig.hpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: lperrey <lperrey@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 <map>
# include <vector>
# include <string>
# include <iostream>
# include <sys/stat.h> // stat()
# include <stdio.h> // 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<std::string> index;
unsigned int allow_methods;
std::map<std::string, std::string> 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)
{
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