130 lines
3.4 KiB
C++
130 lines
3.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 "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;
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|