Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
use a state machine to parse 'mimes.conf' function
  • Loading branch information
wuyougongzi committed Dec 3, 2017
commit 5e7425317384cc01c47f9d416a5f325b916e29b0
98 changes: 66 additions & 32 deletions src/server/config/ConfigParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -412,59 +412,93 @@ namespace HttpServer
const std::string str_buf(buf.cbegin(), buf.cend() );

size_t cur_pos = 0;
size_t end_pos = str_buf.find('\n', cur_pos);

while (std::string::npos != end_pos)
{
cur_pos = str_buf.find_first_not_of(whitespace, cur_pos);
size_t delimiter = str_buf.find_first_of(whitespace, cur_pos);
ConfigFileDataState dataState = CONFIGFILEDATASNONE;

if (delimiter < end_pos)
while (std::string::npos != cur_pos)
{
//std::cout << "parse Mine dataState: " << dataState << std::endl;
switch(dataState)
{
std::string mime_type = str_buf.substr(cur_pos, delimiter - cur_pos);

if ('#' != mime_type.front() )
{
delimiter = str_buf.find_first_not_of(whitespace, delimiter);
case CONFIGFILEDATASNONE:

if (delimiter < end_pos)
case CONFIGFILEDATASNOTE:

{
std::string ext = str_buf.substr(delimiter, end_pos - delimiter);

delimiter = ext.find_first_of(whitespace);
cur_pos = str_buf.find_first_not_of(whitespace, cur_pos);
if (cur_pos < 0)
{
return true;
}

if (std::string::npos != delimiter)
//start from next line
if ('#' == buf[cur_pos])
{
for (size_t ext_pos = 0; std::string::npos != ext_pos; )
//last line
cur_pos = str_buf.find_first_of("\n", cur_pos);
if (cur_pos < 0)
{
std::string ext_unit = ext.substr(ext_pos, std::string::npos != delimiter ? delimiter - ext_pos : std::string::npos);

if (false == ext_unit.empty() )
{
mimes_types.emplace(std::move(ext_unit), mime_type);
}
return true;
}

ext_pos = ext.find_first_not_of(whitespace, delimiter);
cur_pos += 1;

delimiter = ext.find_first_of(whitespace, ext_pos);
}
dataState = CONFIGFILEDATASNOTE;
}
else if ('\n' == buf[cur_pos])
{
cur_pos += 1;
dataState = CONFIGFILEDATASNONE;
}
else
{
mimes_types.emplace(std::move(ext), std::move(mime_type) );
dataState = CONFIGFILEDATASTYPE;
}
}
}
}
break;
case CONFIGFILEDATASTYPE:
{
size_t delimiter = str_buf.find_first_of("\n", cur_pos);
std::string strLine = str_buf.substr(cur_pos, delimiter - cur_pos);

//get mimetypes
{
size_t ext_pos = strLine.find_first_of(whitespace, 0);
if (ext_pos < 0)
{
return false;
}
std::string strExt = strLine.substr(0, ext_pos);
size_t extUnitPos = strLine.find_first_not_of(whitespace, ext_pos);
std::string strExtUnit = strLine.substr(extUnitPos, strLine.length() - extUnitPos);

cur_pos = end_pos + 1;
mimes_types.emplace(std::move(strExt), std::move(strExtUnit));

end_pos = str_buf.find('\n', cur_pos);
}
//std::cout << strExt << " " << strExtUnit << std::endl;
}

//change line
cur_pos = str_buf.find_first_of("\n", cur_pos);
if (cur_pos < 0)
{
return true;
}

cur_pos += 1;

dataState = CONFIGFILEDATASNONE;

}
break;
default:
break;
}
}

return true;
}


static size_t findBlockEnd(const std::string &str_buf, size_t str_pos)
{
size_t pos = str_buf.find('}', str_pos);
Expand Down
7 changes: 7 additions & 0 deletions src/server/config/ConfigParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@

namespace HttpServer
{
enum ConfigFileDataState
{
CONFIGFILEDATASNONE = 0,
CONFIGFILEDATASNOTE, //comment
CONFIGFILEDATASTYPE,

};
class ConfigParser
{
private:
Expand Down