diff --git a/default.config b/default.config index abf9e92..088b63d 100644 --- a/default.config +++ b/default.config @@ -26,9 +26,11 @@ server { location /test { index index1.html subdex.html; + root ./www/test/; } location /test/index1.html { + root ./www/test/; index index1.html subdex.html; } @@ -38,19 +40,22 @@ server { location /stylesheet/ { # root ./www/../; - root ./; + root ./styelsheet/; } location /test/something.html { # allow_methods DELETE; + root ./www/test/; } location /test/test_deeper/ { # allow_methods autoindex on; + root ./www/test/test_deeper/; } location /test/test_deeper/super_deep { + root ./www/test/test_deeper/super_deep/; autoindex on; } diff --git a/memo.txt b/memo.txt index 25f2106..2860c19 100644 --- a/memo.txt +++ b/memo.txt @@ -1,11 +1,8 @@ IN 42 SUBJECT AND/OR PRIORITY : +- Fix "href" in autoindex - CGI - chunked request (response not mandatory it seems) -- fix need for index and autoindex config - Ecrire des tests ! -- "root" need to replace "location->path" part of "client.path" - replace up to the last "/" of the "location->path" part - (if its a folder this will be in fact the entire path) - handle redirection (Work, but weird behavior need deeper test) - upload files with config "upload_dir" - _determine_location() review (New version to complete and test) diff --git a/srcs/config/parser.cpp b/srcs/config/parser.cpp index 90ec1e1..fe47799 100644 --- a/srcs/config/parser.cpp +++ b/srcs/config/parser.cpp @@ -1,14 +1,3 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ConfigParser.cpp :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: lperrey +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2022/07/13 22:11:17 by me #+# #+# */ -/* Updated: 2022/08/03 17:51:35 by lperrey ### ########.fr */ -/* */ -/* ************************************************************************** */ #include "ConfigParser.hpp" @@ -232,9 +221,9 @@ void ConfigParser::_set_server_values(ServerConfig *server, \ else if (key == "root" && size == 1 && server->root == "") { // remove trailing / - if (tmp_val[0][tmp_val[0].size() - 1] != '/') - tmp_val[0].push_back('/'); - // tmp_val[0].erase(tmp_val[0].size() - 1, 1); + if (tmp_val[0][tmp_val[0].size() - 1] == '/') + tmp_val[0].erase(tmp_val[0].size() - 1, 1); + // tmp_val[0].push_back('/'); server->root = tmp_val[0]; } else if (key == "client_body_limit" && size == 1 \ @@ -281,10 +270,10 @@ void ConfigParser::_set_location_values(LocationConfig *location, \ throw std::invalid_argument("missing value"); else if (key == "root" && size == 1 && location->root == "") { - // add trailing / - if (tmp_val[0][tmp_val[0].size() - 1] != '/') - tmp_val[0].push_back('/'); -// tmp_val[0].erase(tmp_val[0].size() - 1, 1); + // remove trailing / + if (tmp_val[0][tmp_val[0].size() - 1] == '/') + tmp_val[0].erase(tmp_val[0].size() - 1, 1); +// tmp_val[0].push_back('/'); location->root = tmp_val[0]; } else if (key == "autoindex" && size == 1) diff --git a/srcs/config/postProcessing.cpp b/srcs/config/postProcessing.cpp index 938c1bf..bfc3a29 100644 --- a/srcs/config/postProcessing.cpp +++ b/srcs/config/postProcessing.cpp @@ -52,15 +52,17 @@ void ConfigParser::_post_processing(std::vector *servers) if (it_l->allow_methods == UNKNOWN) it_l->allow_methods = ANY_METHODS; -// also if (it_l->index.empty() && it_l->autoindex == false) it_l->index = it->index; // nothing to be done for cgi_ext, error_pages, redirect - if (path_is_valid(it_l->root + it_l->path) == 1 \ - && it_l->path[it_l->path.size() - 1] != '/') - it_l->path.push_back('/'); +// if (path_is_valid(it_l->root) == IS_DIR +// && it_l->path[it_l->path.size() - 1] != '/') +// it_l->path.push_back('/'); + if (it_l->path[it_l->path.size() - 1] == '/' + && it_l->path.size() > 1) + it_l->path.erase(it_l->path.size() - 1); ++it_l; } diff --git a/srcs/utils.cpp b/srcs/utils.cpp index 75c60a0..1961183 100644 --- a/srcs/utils.cpp +++ b/srcs/utils.cpp @@ -117,16 +117,16 @@ int path_is_valid(std::string path) if (S_ISREG(s.st_mode)) { // std::cout << "is a file\n"; - return (2); + return (IS_FILE); } else if (S_ISDIR(s.st_mode)) { // std::cout << "is a Dir\n"; - return (1); + return (IS_DIR); } } // std::cout << "path is neither dir nor file\n"; - return (0); + return (IS_OTHER); } diff --git a/srcs/utils.hpp b/srcs/utils.hpp index 861dd3f..8dfd258 100644 --- a/srcs/utils.hpp +++ b/srcs/utils.hpp @@ -14,6 +14,11 @@ # define LF "\n" # define CRLF CR LF +# define IS_FILE 2 +# define IS_DIR 1 +# define IS_OTHER 0 + + enum http_method { UNKNOWN = 0b0, diff --git a/srcs/webserv/autoindex.hpp b/srcs/webserv/autoindex.hpp index 1fc9f9e..7138a7a 100644 --- a/srcs/webserv/autoindex.hpp +++ b/srcs/webserv/autoindex.hpp @@ -2,8 +2,6 @@ #ifndef AUTOINDEX_HPP # define AUTOINDEX_HPP -// # define HTML_ERROR(STATUS) "\r\n"STATUS"

"STATUS"


Le Webserv/0.1

" - # define AUTOINDEX_START \ ""\ ""\ diff --git a/srcs/webserv/method_get.cpp b/srcs/webserv/method_get.cpp index 933d141..c6e3d08 100644 --- a/srcs/webserv/method_get.cpp +++ b/srcs/webserv/method_get.cpp @@ -1,68 +1,16 @@ #include "Webserv.hpp" +// TODO : path_is_valid() Macro for return value void Webserv::_get(Client *client) { -/* RULES ** - -if path is a valid dir check if index is specified and serve that -if no index and autoindex, server that -if file, server that! - -Where does cgi fit in in all this ??? - -*/ - std::string path = client->get_rq_abs_path(); - // this might not be the best thing, a voir -// path.insert(0, client->assigned_location->root); - -//client->assigned_location->path - + std::cerr << "path before = " << path << "\n"; // DEBUG path.replace(0, client->assigned_location->path.size(), client->assigned_location->root); + std::cerr << "path after = " << path << "\n"; // DEBUG - std::cerr << "path = " << path << "\n"; - - // path = root + location.path - // we will tack on an index if there is a valid one - // or autoindex if allowed - // or let _get_file sort out the error otherwise. - -// change this cuz -// if (path_is_valid(client->assigned_location->root) == 2) -// _get_file(...); - if (path_is_valid(path) == 1) - { - // std::cout << "path is valid\n"; - if (path[path.size() - 1] != '/') - path.push_back('/'); - for (size_t i = 0; i < client->assigned_location->index.size(); i++) - { -// std::cout << "location path: " << client->assigned_location->path << '\n'; -// std::cout << "location index: " << client->assigned_location->index[i] << '\n'; -// std::cout << "path with index: " << path + assigned_location->index[i] << '\n'; - if (path_is_valid(path + client->assigned_location->index[i]) == 2) - { - // std::cout << "found a valid index\n"; - path.append(client->assigned_location->index[i]); - _get_file(client, path); - return ; - } - } - if (client->assigned_location->autoindex == true) - { - _autoindex(client, path); - return ; - } - } -// else -// _get_file(client, path); - // what about cgi ??? - - - - // TMP HUGO + // TMP HUGO ( We move this in process_switch() ) // std::string script_output; if (_is_cgi(client)) @@ -78,7 +26,28 @@ Where does cgi fit in in all this ??? // // END TMP HUGO - _get_file(client, path); +// Index/Autoindex block + if (path_is_valid(path) == IS_DIR) + { + std::cout << "made it to Index/Autoindex\n"; + if (path[path.size() - 1] != '/') + path.push_back('/'); + for (size_t i = 0; i < client->assigned_location->index.size(); i++) + { + if (path_is_valid(path + client->assigned_location->index[i]) == 2) + { + path.append(client->assigned_location->index[i]); + _get_file(client, path); + return ; + } + } + if (client->assigned_location->autoindex == true) + _autoindex(client, path); + } + else + _get_file(client, path); + + } # define MAX_FILESIZE 1000000 // (1Mo) @@ -147,9 +116,8 @@ void Webserv::_get_file(Client *client, const std::string &path) //void Webserv::_autoindex(Client *client, LocationConfig &location, std::string &path) void Webserv::_autoindex(Client *client, std::string &path) { -// std::cout << "made it to _autoindex\n"; + std::cout << "made it to _autoindex\n"; - (void)path; std::string dir_list; DIR *dir; struct dirent *ent; @@ -157,21 +125,21 @@ void Webserv::_autoindex(Client *client, std::string &path) // std::cout << "location root: " << client->assigned_location->root << " location path: " // << client->assigned_location->path << '\n'; -// if ((dir = opendir (path.c_str())) != NULL) - if ((dir = opendir ((client->assigned_location->root + client->assigned_location->path).c_str())) != NULL) + std::cout << "Path in auto is: " << path << '\n'; + if ( (dir = opendir(path.c_str()) ) != NULL) { /* print all the files and directories within directory */ dir_list.append(AUTOINDEX_START); - dir_list.append(client->assigned_location->path); + dir_list.append(path); dir_list.append(AUTOINDEX_MID1); - dir_list.append(client->assigned_location->path); + dir_list.append(path); dir_list.append(AUTOINDEX_MID2); while ((ent = readdir (dir)) != NULL) { if (strcmp(".", ent->d_name) == 0) continue ; dir_list.append("assigned_location->path.c_str()); +// dir_list.append(path); dir_list.append(ent->d_name); dir_list.append("\">"); dir_list.append(ent->d_name); diff --git a/srcs/webserv/response.cpp b/srcs/webserv/response.cpp index f0b7a92..1ac1eff 100644 --- a/srcs/webserv/response.cpp +++ b/srcs/webserv/response.cpp @@ -169,67 +169,11 @@ ServerConfig *_determine_process_server(Client *client, std::vector client.path, stop comparaison. -- client.path.compare(0, location.path.size(), location.path) -if ( == 0) -{ - if (location.path.size() == client.path.size()) - { - FOUND; - } - else if (client.path[location.path.size()] == '/') - { - FOUND; - } -} -else -{ - NOT FOUND; - ++next; -} -*/ - std::vector::const_iterator it = server.locations.begin(); - while (it != server.locations.end()) - { - if (it->path.size() > path.size()) - { - // prendre en compte l'éventuel "/" final si location est un dossier - if (it->path.size()-1 > path.size() || it->path[it->path.size()-1] != '/') - { - ++it; - continue; - } - } - if (path.compare(0, it->path.size(), it->path) == 0) - { - if (it->path.size() == path.size()) - break; - else if (path[it->path.size()-1] == '/') - break; - } - ++it; - } - if (it != server.locations.end()) - return (&(*it)); - else - return (&(server.locations.back())); -} - // Temporary Global Scope. Probably move to Client in the future. const LocationConfig *_determine_location(const ServerConfig &server, const std::string &path) { std::cout << "determin location path sent: " << path << '\n'; - -/// NO FUCKING IDEA WHY BUT... -// basically if 2 strings are identical to a point, compare from -// longer one or it'll freak out cuz of \0 or something idk -//// Basically: str.compare() from the larger string... - /* RULES *** If a path coresponds exactly to a location, use that one @@ -237,105 +181,39 @@ if no path coresponds then use the most correct one most correct means the most precise branch that is still above the point we are aiming for +New Rule for location paths, they never end in / +Sooo +If we get a url that ends in / ignore the last / + + */ -// IS THERE A WAY TO SIMPLIFY THIS LOGIC ??? - -// what if i tack on a / at the end of path if there isn't one -// and then compare it to things that are their normal length? - - std::string tmp = path; - if (tmp[tmp.size() - 1] != '/') - tmp.push_back('/'); - -/test/index.html/ -/test/index.html + std::string uri = path; + if (uri[uri.size() - 1] == '/') + uri.erase(uri.size() - 1); for (std::vector::const_iterator it = server.locations.begin(); it != server.locations.end(); it++) { std::cout << it->path << " -- "; - if (it->path.size() > tmp.size()) - continue ; - - if (tmp.compare(0, it->path.size(), it->path) == 0) - { - std::cout << "checking with last /\n"; - if (it->path.size() == tmp.size()) - { - std::cout << "path sizes are equal \n"; - return (&(*it)); - } - else if (tmp[it->path.size() - 1] == '/') - { - std::cout << "ends in /\n"; - return (&(*it)); - } - } - -/* -// std::cout << it->path[it->path.size() - 1] << " "; -// it->path.size() -1 only when path ends in / because -// if path doesn't end in / then we are looking for a file -// meaning all it->paths that end in / are wrong if they >= - // if (it->path[it->path.size() - 1] == '/' ? it->path.size() - 1 > path.size() : it->path.size() > path.size()) - - if (path[path.size() - 1] == '/' ? it->path.size() > path.size() : it->path.size() - 1 > path.size()) + if (it->path.size() > uri.size()) { std::cout << "skipping this one\n"; continue ; } - -// if (it->path[it->path.size() - 1] == '/') - if (path[path.size() - 1] == '/') + if (uri.compare(0, it->path.size(), it->path) == 0) { - if (path.compare(0, it->path.size(), it->path) == 0) - { - std::cout << "checking with last /\n"; - if (it->path.size() == path.size()) - { - std::cout << "path sizes are equal \n"; - return (&(*it)); - } - else if (path[it->path.size() - 1] == '/') - { - std::cout << "ends in /\n"; - return (&(*it)); - } - } + if (it->path.size() == uri.size()) + return (&(*it)); + else if (uri[it->path.size()] == '/') + return (&(*it)); } - else - { - if (path.size() <= it->path.size()) - { - std::cout << "path is missing a /\n"; - if (it->path.compare(0, path.size(), path) == 0) - return (&(*it)); - // means we are looking for /test/test_deeper/ - // with /test/test_deeper - } - else - { -// if (it->path.compare(0, it->path.size() - 1, path) == 0) - if (path.compare(0, it->path.size(), it->path) == 0) - { - std::cout << "checking without last /\n"; - if (it->path.size() - 1 == path.size()) - return (&(*it)); - else if (path[it->path.size() - 1] == '/') - return (&(*it)); - } - } - } -*/ - } -// if (it != server.locations.end()) -// return (&(*it)); -// else - return (&(server.locations.back())); + return (&(server.locations.back())); + + // /test/mdr // /test/mdr/ // /test/mdrBST @@ -349,17 +227,16 @@ if no path coresponds then use the most correct one /test/test_deepei /test/test_deepei/ /test/test_deeperi - +/test/test_deeper/super_deep/ +/test/aaaaaaaaaaa/super_deep/ */ - - - - - } + + + std::string Webserv::_determine_file_extension(const std::string &path) const { size_t dot_pos = path.rfind(".");