diff --git a/default.config b/default.config index fc18753..5bcea6c 100644 --- a/default.config +++ b/default.config @@ -31,7 +31,6 @@ server { # allow_methods DELETE; # } - allow_methods GET POST; # location /test/something.html { location /test/something.html { diff --git a/srcs/config/LocationConfig.hpp b/srcs/config/LocationConfig.hpp index 22be5e5..09ea756 100644 --- a/srcs/config/LocationConfig.hpp +++ b/srcs/config/LocationConfig.hpp @@ -38,12 +38,14 @@ public: std::string path; - int client_body_limit; std::string root; std::vector index; unsigned int allow_methods; - std::map cgi_info; + std::vector cgi_ext; // php not .php + bool autoindex; + + std::vector upload_repo; // 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... @@ -57,7 +59,6 @@ public: 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"; @@ -100,13 +101,14 @@ public: ++comp_rhs; // ok now we need to add a thing where we check for files vs folders - if (comp_lhs == comp_rhs) +/* if (comp_lhs == comp_rhs) { if (path_is_valid(root + path) == 2) --comp_lhs; if (path_is_valid(rhs.root + rhs.path) == 2) --comp_rhs; } +*/ // std::cout << "comp_lhs: " << comp_lhs << " comp_rhs: " << comp_rhs // << " bool res: " << (comp_lhs > comp_rhs) << "\n"; diff --git a/srcs/config/ServerConfig.hpp b/srcs/config/ServerConfig.hpp index 90e61b9..ceee50a 100644 --- a/srcs/config/ServerConfig.hpp +++ b/srcs/config/ServerConfig.hpp @@ -33,14 +33,12 @@ public: unsigned int client_body_limit; // set to default max if none set // might be the only one we let slide if bad input... It remains false... - bool autoindex; // we will check the index in the post processing with access() ? std::vector index; std::map error_pages; // fuck it, you can only call allow_methods once in Server - unsigned int allow_methods; std::vector locations; @@ -71,17 +69,12 @@ public: std::cout << it->first << "--" << it->second << " "; // for (size_t i = 0; i < error_pages.size(); i++) // std::cout << error_pages->first << "--" << error_pages->second << " "; - std::cout << "\nallow_methods: "; - std::cout << ::http_methods_to_str(allow_methods) << "\n"; // std::cout << "skiping Locations for now...\n"; for (std::vector::iterator it = locations.begin(); it < locations.end(); it++) it->print_all(); - std::cout << "autoindex: " << autoindex << '\n'; std::cout << "client_body_limit: " << client_body_limit << '\n'; - // std::cout << "redirect_status: " << redirect_status << '\n'; - // std::cout << "redirect_uri: " << redirect_uri << '\n'; std::cout << "host: " << host << '\n'; std::cout << "port: " << port << '\n'; diff --git a/srcs/config/parser.cpp b/srcs/config/parser.cpp index dd043f2..601f471 100644 --- a/srcs/config/parser.cpp +++ b/srcs/config/parser.cpp @@ -105,8 +105,6 @@ ServerConfig ConfigParser::_parse_server(size_t *start) size_t curr = _content.find_first_not_of(" \t\n", *start); ret.client_body_limit = 0; - ret.autoindex = false; - ret.allow_methods = 0; if (curr == std::string::npos || _content[curr] != '{') throw std::invalid_argument("bad config file syntax 1"); @@ -144,7 +142,7 @@ LocationConfig ConfigParser::_parse_location(size_t *start) size_t curr = *start; // start is after the 1st word aka "location" - ret.client_body_limit = 0; + ret.autoindex = false; ret.redirect_status = 0; ret.allow_methods = 0; @@ -243,12 +241,6 @@ void ConfigParser::_set_server_values(ServerConfig *server, \ else throw std::invalid_argument("Root dir invalid 1"); } - else if (key == "autoindex" && size == 1) - { - // autoindex is a bool, there's no good way for me to see if it has - // bet set already - server->autoindex = (tmp_val[0] == "on" ? true : false); - } else if (key == "client_body_limit" && size == 1 \ && server->client_body_limit == 0) { @@ -265,16 +257,6 @@ void ConfigParser::_set_server_values(ServerConfig *server, \ for (unsigned long i = 0; i != tmp_val.size(); i++) server->index.push_back(tmp_val[i]); } - else if (key == "allow_methods" && server->allow_methods == 0) - { - for (unsigned long i = 0; i != tmp_val.size(); i++) - { - http_method m = ::str_to_http_method(tmp_val[i]); - if (m == UNKNOWN) - throw std::invalid_argument("not a valid method"); - server->allow_methods |= m; - } - } else if (key == "error_page") { @@ -329,12 +311,9 @@ void ConfigParser::_set_location_values(LocationConfig *location, \ else throw std::invalid_argument("Root dir invalid"); } - else if (key == "client_body_limit" && size == 1 \ - && location->client_body_limit == 0) + else if (key == "autoindex" && size == 1) { - if (!::isNumeric(tmp_val[0])) - throw std::invalid_argument("client_body_limit not a number"); - location->client_body_limit = atoi(tmp_val[0].c_str()); + location->autoindex = (tmp_val[0] == "on" ? true : false); } else if (key == "index") { @@ -352,18 +331,16 @@ void ConfigParser::_set_location_values(LocationConfig *location, \ location->allow_methods |= m; } } - else if (key == "cgi_info") + else if (key == "cgi_ext") { - // you can call cgi_info several times i think. -// ok wtf is all this even doing, figure that out - unsigned long i = value.find_first_of(" "); - if (i == std::string::npos) - throw std::invalid_argument("bad config file arguments 8"); - // ok why an int now, we gotta be more consistent! - int j = value.find_first_not_of(" ", i); - location->cgi_info[value.substr(0, i)] = value.substr(j, value.length()); + for (size_t i = 0; i < tmp_val.size(); i++) + { + if (tmp_val[i][0] == '.') + throw std::invalid_argument("cgi_ext should not have a leading '.'"); + location->cgi_ext.push_back(tmp_val[i]); + } } - else if (key == "return" && location->redirect_status == 0 \ + else if (key == "redirect" && location->redirect_status == 0 \ && location->redirect_uri == "") { // actually i think there can only be one per location... diff --git a/srcs/config/postProcessing.cpp b/srcs/config/postProcessing.cpp index 412ea08..0ca5e5e 100644 --- a/srcs/config/postProcessing.cpp +++ b/srcs/config/postProcessing.cpp @@ -5,11 +5,6 @@ void ConfigParser::_post_processing(std::vector *servers) { - - // make certain servers default - // fill out empty settings - // if special settings are empty throw - std::vector::iterator it = servers->begin(); while (it != servers->end()) @@ -25,12 +20,6 @@ void ConfigParser::_post_processing(std::vector *servers) if (it->client_body_limit == 0) it->client_body_limit = 5000; // what is the recomended size? - // autoindex is False by Default - - // if Allow methodes not specified we set to ALL - if (it->allow_methods == UNKNOWN) // in this case that means nothing... - it->allow_methods = ANY_METHODS; - // would prefer ALL_METHODS if (it->index.empty()) throw std::invalid_argument("Config file needs an Index"); @@ -48,10 +37,10 @@ void ConfigParser::_post_processing(std::vector *servers) LocationConfig tmp; tmp.path = "/"; - tmp.client_body_limit = 5000; // figur out correct amount tmp.root = it->root; tmp.index = it->index; - tmp.allow_methods = it->allow_methods; + tmp.allow_methods = ANY_METHODS; + tmp.autoindex = false; tmp.redirect_status = 0; it->locations.push_back(tmp); } @@ -60,15 +49,11 @@ void ConfigParser::_post_processing(std::vector *servers) while (it_l != it->locations.end()) { - - if (it_l->client_body_limit == 0) - it_l->client_body_limit = 5000; // what is the recomended size? if (it_l->root == "") it_l->root = it->root; - // if Allow methodes not specified we set to Server methods - if (it_l->allow_methods == UNKNOWN) // in this case that means nothing... - it_l->allow_methods = it->allow_methods; + if (it_l->allow_methods == UNKNOWN) + it_l->allow_methods = ANY_METHODS; // fill out index from Server? // or do a bunch of checks on what is in there... @@ -108,7 +93,7 @@ bool ConfigParser::_find_root_path_location(std::vector location { if (it->path.compare("/") == 0) { - std::cout << "in compare: " << it->path << " -- "; + // std::cout << "in compare: " << it->path << " -- "; return true; } ++it; diff --git a/srcs/webserv/Webserv.hpp b/srcs/webserv/Webserv.hpp index f2323b8..e5fe312 100644 --- a/srcs/webserv/Webserv.hpp +++ b/srcs/webserv/Webserv.hpp @@ -29,6 +29,7 @@ # include "ServerConfig.hpp" # include "utils.hpp" # include "http_status.hpp" +# include "autoindex.hpp" extern bool g_run; extern int g_last_signal; @@ -83,7 +84,7 @@ class Webserv void _get(Client *client, ServerConfig &server, LocationConfig &location); // in progress - void _autoindex(Client *client, std::string &path); + void _autoindex(Client *client, LocationConfig &location, std::string &path); void _get_file(Client *client, const std::string &path); diff --git a/srcs/webserv/autoindex.hpp b/srcs/webserv/autoindex.hpp new file mode 100644 index 0000000..32d9d11 --- /dev/null +++ b/srcs/webserv/autoindex.hpp @@ -0,0 +1,25 @@ + +#ifndef AUTOINDEX_HPP +# define AUTOINDEX_HPP + +// # define HTML_ERROR(STATUS) "\r\n"STATUS"

"STATUS"


Le Webserv/0.1

" + +# define AUTOINDEX_START \ +""\ +""\ +""\ + " Index of " + +# define AUTOINDEX_MID \ +""\ +""\ +"" + + +# define AUTOINDEX_END \ +""\ +"" + + + +#endif diff --git a/srcs/webserv/response.cpp b/srcs/webserv/response.cpp index 001743c..c658461 100644 --- a/srcs/webserv/response.cpp +++ b/srcs/webserv/response.cpp @@ -145,7 +145,11 @@ void Webserv::_get(Client *client, ServerConfig &server, LocationConfig &locatio std::cout << "ERIC path: " << path << '\n'; -// if (path_is_valid( +/* if (path_is_valid(path) == 1 && location.autoindex == true) + { + _autoindex(client, location, path); + } +*/ // TMP HUGO // @@ -162,7 +166,10 @@ void Webserv::_get(Client *client, ServerConfig &server, LocationConfig &locatio // i might need some sort of _generate_autoindex() -void Webserv::_autoindex(Client *client, std::string &path) +#include +#include + +void Webserv::_autoindex(Client *client, LocationConfig &location, std::string &path) { // i think the plan is to generate an html file and return it // it should be filled with the stuff that is found in that repo @@ -174,7 +181,39 @@ void Webserv::_autoindex(Client *client, std::string &path) // Let's try the 2nd one first. + std::cout << "made it to _autoindex\n"; + DIR *dir; + struct dirent *ent; + + if ((dir = opendir ((location.root + location.path).c_str())) != NULL) { + /* print all the files and directories within directory */ + while ((ent = readdir (dir)) != NULL) { + printf ("%s\n", ent->d_name); + } + closedir (dir); + } else { + /* could not open directory */ +// perror (""); + std::cout << "could not open dir\n"; + return ; + } + + + + std::string dir_list; + + dir_list.append(AUTOINDEX_START); + dir_list.append(location.path); + dir_list.append(AUTOINDEX_MID); + // loop something + dir_list.append(location.path); + + + + dir_list.append(AUTOINDEX_END); + + _append_body(client, dir_list.c_str(), dir_list.size(), "html"); diff --git a/www/test/index.html b/www/test/index1.html similarity index 100% rename from www/test/index.html rename to www/test/index1.html