mirror of
https://github.com/3lswear/webserv.git
synced 2025-10-28 21:07:59 +03:00
163 lines
2.8 KiB
C++
163 lines
2.8 KiB
C++
#include "Config.hpp"
|
|
|
|
Config::Config()
|
|
{
|
|
}
|
|
|
|
|
|
int isFile(std::string path)
|
|
{
|
|
struct stat s;
|
|
|
|
if (stat(path.c_str(), &s) == 0)
|
|
{
|
|
if (s.st_mode & S_IFDIR)
|
|
return (-1);
|
|
else if (s.st_mode & S_IFREG)
|
|
return (0);
|
|
}
|
|
else
|
|
return (-1);
|
|
return (-1);
|
|
}
|
|
|
|
int isDir(std::string path)
|
|
{
|
|
struct stat s;
|
|
|
|
if (stat(path.c_str(), &s) == 0)
|
|
{
|
|
if (s.st_mode & S_IFDIR)
|
|
return (0);
|
|
else if (s.st_mode & S_IFREG)
|
|
return (-1);
|
|
}
|
|
else
|
|
return (-1);
|
|
return (-1);
|
|
}
|
|
int Config::calcLen(std::string &s1, std::string &s2)
|
|
{
|
|
unsigned long len = 0;
|
|
while ((len < (s1.size() )) && (len < (s2.size())))
|
|
{
|
|
if (s1[len] != s2[len])
|
|
break;
|
|
len++;
|
|
}
|
|
return (len);
|
|
}
|
|
|
|
location *Config::getLocation(std::vector<location *> &arr, std::string &URI)
|
|
{
|
|
unsigned int tryLen = URI.size();
|
|
std::string tryLocation;
|
|
location *tmp;
|
|
std::string suffix;
|
|
std::string suffix1;
|
|
std::vector<location *>::iterator it;
|
|
std::vector<location *> step_1;
|
|
std::vector<location *> step_2;
|
|
suffix = URI.substr(URI.rfind(".") + 1, URI.size() - URI.rfind("."));
|
|
|
|
while (tryLen)
|
|
{
|
|
it = arr.begin();
|
|
while (it != arr.end())
|
|
{
|
|
tmp = *it;
|
|
tryLocation = URI.substr(0, tryLen);
|
|
if (tmp->location == tryLocation)
|
|
step_1.push_back(tmp);
|
|
it++;
|
|
}
|
|
if (!step_1.empty())
|
|
break;
|
|
tryLen = URI.rfind("/", tryLen - 1);
|
|
}
|
|
if (!step_1.empty())
|
|
{
|
|
it = step_1.begin();
|
|
tmp = *it;
|
|
if (tmp->location == URI || tmp->location.size() > 1)
|
|
step_2.push_back(tmp);
|
|
}
|
|
it = arr.begin();
|
|
while (it != arr.end())
|
|
{
|
|
tmp = *it;
|
|
if (tmp->location[0] == '*')
|
|
{
|
|
suffix1 = tmp->location.substr(2);
|
|
if (suffix1 == suffix)
|
|
{
|
|
step_2.push_back(tmp);
|
|
break;
|
|
}
|
|
}
|
|
it++;
|
|
}
|
|
if (step_2.size() == 1)
|
|
return (step_2[0]);
|
|
else if (step_2.size() == 2)
|
|
{
|
|
if(!step_2[1]->cgi_pass.empty())
|
|
{
|
|
step_2[0]->cgi_pass = step_2[1]->cgi_pass;
|
|
}
|
|
return (step_2[0]);
|
|
}
|
|
it = arr.begin();
|
|
while (it != arr.end())
|
|
{
|
|
tmp = *it;
|
|
if (tmp->location == "/")
|
|
return (tmp);
|
|
it++;
|
|
}
|
|
|
|
return (NULL);
|
|
}
|
|
|
|
ServerConfig *Config::getConfig(std::vector<ServerConfig *> &arr, Request &request, serverListen &data)
|
|
{
|
|
ServerConfig *tmp;
|
|
std::vector<ServerConfig *>::iterator it;
|
|
std::vector<ServerConfig *> step_1;
|
|
std::vector<ServerConfig *> step_2;
|
|
|
|
it = arr.begin();
|
|
while (it != arr.end())
|
|
{
|
|
tmp = *it;
|
|
if (tmp->getPort() == data.port && tmp->getHost() == data.ip)
|
|
step_1.push_back(tmp);
|
|
it++;
|
|
}
|
|
if (step_1.size() == 1)
|
|
return (step_1[0]);
|
|
it = step_1.begin();
|
|
while (it != step_1.end())
|
|
{
|
|
tmp = *it;
|
|
if (!tmp->getServerName().empty())
|
|
step_2.push_back(tmp);
|
|
it++;
|
|
}
|
|
if (step_2.size() == 0)
|
|
return (step_1[0]);
|
|
it = step_2.begin();
|
|
while (it != step_2.end())
|
|
{
|
|
tmp = *it;
|
|
if (tmp->getServerName() == request.getHost())
|
|
return (tmp);
|
|
it++;
|
|
}
|
|
return (step_1[0]);
|
|
}
|
|
|
|
|
|
Config::~Config()
|
|
{
|
|
} |