@@ -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);
0 commit comments