diff --git a/srcs/ConfigParser.cpp b/srcs/ConfigParser.cpp index 2a6be83..dd32f7a 100644 --- a/srcs/ConfigParser.cpp +++ b/srcs/ConfigParser.cpp @@ -6,7 +6,7 @@ /* By: me +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/07/13 22:11:17 by me #+# #+# */ -/* Updated: 2022/07/25 20:56:51 by me ### ########.fr */ +/* Updated: 2022/07/27 19:27:55 by me ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,18 +16,20 @@ /***** Stuf to rework I don't love the use of EMPTY and FAILURE and those + slowly transitioning away... I would rather throw exceptions everywhere... where do i check if there is only a ";" -we could make a print _content just to make sure it works properly... need to figure out why return std::vector * rather than just simple not a pointer... is there a good reason? +I need to better understand what check_proper_line does + */ @@ -133,6 +135,7 @@ std::vector * ConfigParser::parse() // could we return a ref instead? // i think no +// might need new names for Prev and Curr, not super descriptive... ServerConfig ConfigParser::parse_server(size_t *start) { ServerConfig ret; @@ -144,8 +147,11 @@ ServerConfig ConfigParser::parse_server(size_t *start) throw std::invalid_argument("bad config file syntax"); size_t curr = _content.find_first_of(" \t\n", ++prev); + if (curr == std::string::npos) // are there other things to check for? + throw std::invalid_argument("bad config file syntax"); while (curr != std::string::npos) { + _get_key(&word_start, &blank_start); _check_proper_line_end(&prev, &curr); // nope, not an option i think... /* if ((prev = _content.find_first_not_of(" \t\n", curr)) == std::string::npos) throw std::invalid_argument("bad config file arguments"); @@ -154,6 +160,7 @@ ServerConfig ConfigParser::parse_server(size_t *start) */ key_start = prev; std::string key = _content.substr(prev, curr - prev); + std::string key = _get_key(&word_start, &blank_start); switch (key) { case "}": @@ -164,6 +171,15 @@ ServerConfig ConfigParser::parse_server(size_t *start) // the name but it's so clear... ret.location.push_back(parse_location(&curr)); default: + + // ok i figured it out, there's a slight difference! + + // curr below is this actually, she does go all the way to the end of the line... + // there has to be a better way of doing this, just like + // get me the first word, get me all the rest... but like in sub functions... + if ((curr = _content.find_first_of("\n", prev)) == std::string::npos) + throw std::invalid_argument("bad config file arguments"); + _check_proper_line_end(&prev, &curr); /* if ((prev = _content.find_first_not_of(" \t\n", curr)) == std::string::npos) throw std::invalid_argument("bad config file arguments"); @@ -171,7 +187,7 @@ ServerConfig ConfigParser::parse_server(size_t *start) throw std::invalid_argument("bad config file arguments"); */ // why bother with the if.. why not throw exception in check_line... - if ((value_end = check_line_syntax(_content.substr(key_start, curr - key_start))) == FAILED) + if ((value_end = _check_for_semicolon(_content.substr(key_start, curr - key_start))) == FAILED) throw std::invalid_argument("bad config file arguments"); // if ((int)value_end == EMPTY) // continue ; @@ -229,13 +245,16 @@ LocationConfig ConfigParser::parse_location(size_t *start) return (ret); } -// not convinced i want to return an int... -// but could be helpful to get more feed back -// maybe use a throw... but catch in parse_server... -// yea i don't see any reason to return an int -//int ConfigParser::_set_server_value(Server *server, const std::string key, const std::string value) +// yea ok new plan, this is where a lot of the checks will happen... + + void ConfigParser::_set_server_value(Server *server, const std::string key, const std::string value) { + // so turns out here is where i should be checking for the semicolon i think + // and also making sure there are the right number of values depending on which key it is... + // like for error page there can be a bunch but you can't have say 1 error code and several error files + // it's 1 error file per line and + // i could do some checks at the start for value being bad or empty? or is // that unnecessary since in theory i've already checked that it's good... switch (key) @@ -335,6 +354,9 @@ int ConfigParser::_set_location_value(Location *location, const std::string key, // shit, this doesn't work... // wait it might... + // definitely need a better name... +// _check_proper_word_break ? +// get next word ? void ConfigParser::_check_proper_line_end(size_t *prev, size_t *curr) { if ((*prev = _content.find_first_not_of(" \t\n", *curr)) == std::string::npos) @@ -343,9 +365,6 @@ void ConfigParser::_check_proper_line_end(size_t *prev, size_t *curr) throw std::invalid_argument("bad config file arguments"); } -// i'm not sure i like this... - // and it needs to be _check_... -// rework this whole thing... // no longer returning an int // fuck no we have to return an int... @@ -354,6 +373,8 @@ void ConfigParser::_check_proper_line_end(size_t *prev, size_t *curr) // bother chaning it now... int ConfigParser::_check_for_semicolon(std::string line) { + // yea ok i just don't like this... + // line must be end with semicolon size_t semicol; size_t find; @@ -369,6 +390,13 @@ int ConfigParser::_check_for_semicolon(std::string line) } +void ConfigParser::_print_content() const +{ + std::cout << _content; +} + + + // I might need to make my own Exceptions to throw... diff --git a/srcs/ConfigParser.hpp b/srcs/ConfigParser.hpp index b0605d5..378f987 100644 --- a/srcs/ConfigParser.hpp +++ b/srcs/ConfigParser.hpp @@ -6,7 +6,7 @@ /* By: me +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/07/11 23:01:41 by me #+# #+# */ -/* Updated: 2022/07/25 20:56:53 by me ### ########.fr */ +/* Updated: 2022/07/27 19:27:57 by me ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,21 @@ # include "Webserv.hpp" // easier to just do this? +// This is gonna be temporary cuz i don't konw if i like it +#define MAX_REQUEST_SIZE 2048 +#define MAX_URI_SIZE 64 +#define BSIZE 1024 + +enum MethodType +{ + GET, + POST, + DELETE, + INVALID, +}; + + + class ConfigParser { public: @@ -47,6 +62,10 @@ private: int _check_for_semicolon(std::string line); // const? + // just for testing purposes + void _print_content() const; + + };