Skip to content

Commit 5e74253

Browse files
committed
use a state machine to parse 'mimes.conf' function
1 parent 9b10936 commit 5e74253

File tree

2 files changed

+73
-32
lines changed

2 files changed

+73
-32
lines changed

src/server/config/ConfigParser.cpp

Lines changed: 66 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -412,59 +412,93 @@ namespace HttpServer
412412
const std::string str_buf(buf.cbegin(), buf.cend() );
413413

414414
size_t cur_pos = 0;
415-
size_t end_pos = str_buf.find('\n', cur_pos);
416415

417-
while (std::string::npos != end_pos)
418-
{
419-
cur_pos = str_buf.find_first_not_of(whitespace, cur_pos);
420-
size_t delimiter = str_buf.find_first_of(whitespace, cur_pos);
416+
ConfigFileDataState dataState = CONFIGFILEDATASNONE;
421417

422-
if (delimiter < end_pos)
418+
while (std::string::npos != cur_pos)
419+
{
420+
//std::cout << "parse Mine dataState: " << dataState << std::endl;
421+
switch(dataState)
423422
{
424-
std::string mime_type = str_buf.substr(cur_pos, delimiter - cur_pos);
425-
426-
if ('#' != mime_type.front() )
427-
{
428-
delimiter = str_buf.find_first_not_of(whitespace, delimiter);
423+
case CONFIGFILEDATASNONE:
429424

430-
if (delimiter < end_pos)
425+
case CONFIGFILEDATASNOTE:
426+
431427
{
432-
std::string ext = str_buf.substr(delimiter, end_pos - delimiter);
433-
434-
delimiter = ext.find_first_of(whitespace);
428+
cur_pos = str_buf.find_first_not_of(whitespace, cur_pos);
429+
if (cur_pos < 0)
430+
{
431+
return true;
432+
}
435433

436-
if (std::string::npos != delimiter)
434+
//start from next line
435+
if ('#' == buf[cur_pos])
437436
{
438-
for (size_t ext_pos = 0; std::string::npos != ext_pos; )
437+
//last line
438+
cur_pos = str_buf.find_first_of("\n", cur_pos);
439+
if (cur_pos < 0)
439440
{
440-
std::string ext_unit = ext.substr(ext_pos, std::string::npos != delimiter ? delimiter - ext_pos : std::string::npos);
441-
442-
if (false == ext_unit.empty() )
443-
{
444-
mimes_types.emplace(std::move(ext_unit), mime_type);
445-
}
441+
return true;
442+
}
446443

447-
ext_pos = ext.find_first_not_of(whitespace, delimiter);
444+
cur_pos += 1;
448445

449-
delimiter = ext.find_first_of(whitespace, ext_pos);
450-
}
446+
dataState = CONFIGFILEDATASNOTE;
447+
}
448+
else if ('\n' == buf[cur_pos])
449+
{
450+
cur_pos += 1;
451+
dataState = CONFIGFILEDATASNONE;
451452
}
452453
else
453454
{
454-
mimes_types.emplace(std::move(ext), std::move(mime_type) );
455+
dataState = CONFIGFILEDATASTYPE;
455456
}
456457
}
457-
}
458-
}
458+
break;
459+
case CONFIGFILEDATASTYPE:
460+
{
461+
size_t delimiter = str_buf.find_first_of("\n", cur_pos);
462+
std::string strLine = str_buf.substr(cur_pos, delimiter - cur_pos);
463+
464+
//get mimetypes
465+
{
466+
size_t ext_pos = strLine.find_first_of(whitespace, 0);
467+
if (ext_pos < 0)
468+
{
469+
return false;
470+
}
471+
std::string strExt = strLine.substr(0, ext_pos);
472+
size_t extUnitPos = strLine.find_first_not_of(whitespace, ext_pos);
473+
std::string strExtUnit = strLine.substr(extUnitPos, strLine.length() - extUnitPos);
459474

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

462-
end_pos = str_buf.find('\n', cur_pos);
463-
}
477+
//std::cout << strExt << " " << strExtUnit << std::endl;
478+
}
479+
480+
//change line
481+
cur_pos = str_buf.find_first_of("\n", cur_pos);
482+
if (cur_pos < 0)
483+
{
484+
return true;
485+
}
464486

487+
cur_pos += 1;
488+
489+
dataState = CONFIGFILEDATASNONE;
490+
491+
}
492+
break;
493+
default:
494+
break;
495+
}
496+
}
497+
465498
return true;
466499
}
467500

501+
468502
static size_t findBlockEnd(const std::string &str_buf, size_t str_pos)
469503
{
470504
size_t pos = str_buf.find('}', str_pos);

src/server/config/ConfigParser.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77

88
namespace HttpServer
99
{
10+
enum ConfigFileDataState
11+
{
12+
CONFIGFILEDATASNONE = 0,
13+
CONFIGFILEDATASNOTE, //comment
14+
CONFIGFILEDATASTYPE,
15+
16+
};
1017
class ConfigParser
1118
{
1219
private:

0 commit comments

Comments
 (0)