a few good ideas as to how to better handle the config parsing
This commit is contained in:
@@ -6,7 +6,7 @@
|
|||||||
/* By: me <erlazo@student.42.fr> +#+ +:+ +#+ */
|
/* By: me <erlazo@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2022/07/13 22:11:17 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
|
/***** Stuf to rework
|
||||||
|
|
||||||
I don't love the use of EMPTY and FAILURE and those
|
I don't love the use of EMPTY and FAILURE and those
|
||||||
|
slowly transitioning away...
|
||||||
|
|
||||||
I would rather throw exceptions everywhere...
|
I would rather throw exceptions everywhere...
|
||||||
|
|
||||||
|
|
||||||
where do i check if there is only a ";"
|
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<ServerConfig> * rather than just simple
|
need to figure out why return std::vector<ServerConfig> * rather than just simple
|
||||||
not a pointer...
|
not a pointer...
|
||||||
is there a good reason?
|
is there a good reason?
|
||||||
|
|
||||||
|
I need to better understand what check_proper_line does
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -133,6 +135,7 @@ std::vector<Server> * ConfigParser::parse()
|
|||||||
|
|
||||||
// could we return a ref instead?
|
// could we return a ref instead?
|
||||||
// i think no
|
// i think no
|
||||||
|
// might need new names for Prev and Curr, not super descriptive...
|
||||||
ServerConfig ConfigParser::parse_server(size_t *start)
|
ServerConfig ConfigParser::parse_server(size_t *start)
|
||||||
{
|
{
|
||||||
ServerConfig ret;
|
ServerConfig ret;
|
||||||
@@ -144,8 +147,11 @@ ServerConfig ConfigParser::parse_server(size_t *start)
|
|||||||
throw std::invalid_argument("bad config file syntax");
|
throw std::invalid_argument("bad config file syntax");
|
||||||
|
|
||||||
size_t curr = _content.find_first_of(" \t\n", ++prev);
|
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)
|
while (curr != std::string::npos)
|
||||||
{
|
{
|
||||||
|
_get_key(&word_start, &blank_start);
|
||||||
_check_proper_line_end(&prev, &curr); // nope, not an option i think...
|
_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)
|
/* if ((prev = _content.find_first_not_of(" \t\n", curr)) == std::string::npos)
|
||||||
throw std::invalid_argument("bad config file arguments");
|
throw std::invalid_argument("bad config file arguments");
|
||||||
@@ -154,6 +160,7 @@ ServerConfig ConfigParser::parse_server(size_t *start)
|
|||||||
*/ key_start = prev;
|
*/ key_start = prev;
|
||||||
|
|
||||||
std::string key = _content.substr(prev, curr - prev);
|
std::string key = _content.substr(prev, curr - prev);
|
||||||
|
std::string key = _get_key(&word_start, &blank_start);
|
||||||
switch (key)
|
switch (key)
|
||||||
{
|
{
|
||||||
case "}":
|
case "}":
|
||||||
@@ -164,6 +171,15 @@ ServerConfig ConfigParser::parse_server(size_t *start)
|
|||||||
// the name but it's so clear...
|
// the name but it's so clear...
|
||||||
ret.location.push_back(parse_location(&curr));
|
ret.location.push_back(parse_location(&curr));
|
||||||
default:
|
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);
|
_check_proper_line_end(&prev, &curr);
|
||||||
/* if ((prev = _content.find_first_not_of(" \t\n", curr)) == std::string::npos)
|
/* if ((prev = _content.find_first_not_of(" \t\n", curr)) == std::string::npos)
|
||||||
throw std::invalid_argument("bad config file arguments");
|
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");
|
throw std::invalid_argument("bad config file arguments");
|
||||||
*/
|
*/
|
||||||
// why bother with the if.. why not throw exception in check_line...
|
// 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");
|
throw std::invalid_argument("bad config file arguments");
|
||||||
// if ((int)value_end == EMPTY)
|
// if ((int)value_end == EMPTY)
|
||||||
// continue ;
|
// continue ;
|
||||||
@@ -229,13 +245,16 @@ LocationConfig ConfigParser::parse_location(size_t *start)
|
|||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
// not convinced i want to return an int...
|
// yea ok new plan, this is where a lot of the checks will happen...
|
||||||
// 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)
|
|
||||||
void ConfigParser::_set_server_value(Server *server, const std::string key, const std::string value)
|
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
|
// 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...
|
// that unnecessary since in theory i've already checked that it's good...
|
||||||
switch (key)
|
switch (key)
|
||||||
@@ -335,6 +354,9 @@ int ConfigParser::_set_location_value(Location *location, const std::string key,
|
|||||||
|
|
||||||
// shit, this doesn't work...
|
// shit, this doesn't work...
|
||||||
// wait it might...
|
// 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)
|
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)
|
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");
|
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
|
// no longer returning an int
|
||||||
// fuck no we have to return 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...
|
// bother chaning it now...
|
||||||
int ConfigParser::_check_for_semicolon(std::string line)
|
int ConfigParser::_check_for_semicolon(std::string line)
|
||||||
{
|
{
|
||||||
|
// yea ok i just don't like this...
|
||||||
|
|
||||||
// line must be end with semicolon
|
// line must be end with semicolon
|
||||||
size_t semicol;
|
size_t semicol;
|
||||||
size_t find;
|
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...
|
// I might need to make my own Exceptions to throw...
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* By: me <erlazo@student.42.fr> +#+ +:+ +#+ */
|
/* By: me <erlazo@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2022/07/11 23:01:41 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?
|
# 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 {
|
class ConfigParser {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -47,6 +62,10 @@ private:
|
|||||||
|
|
||||||
int _check_for_semicolon(std::string line); // const?
|
int _check_for_semicolon(std::string line); // const?
|
||||||
|
|
||||||
|
// just for testing purposes
|
||||||
|
void _print_content() const;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user