@@ -1881,38 +1881,39 @@ inline bool parse_multipart_boundary(const std::string &content_type,
18811881}
18821882
18831883inline bool parse_range_header (const std::string &s, Ranges &ranges) {
1884- try {
1885- static auto re_first_range =
1886- std::regex (R"( bytes=(\d*-\d*(?:,\s*\d*-\d*)*))" );
1887- std::smatch m;
1888- if (std::regex_match (s, m, re_first_range)) {
1889- auto pos = m.position (1 );
1890- auto len = m.length (1 );
1891- detail::split (
1892- &s[pos], &s[pos + len], ' ,' , [&](const char *b, const char *e) {
1893- static auto re_another_range = std::regex (R"( \s*(\d*)-(\d*))" );
1894- std::cmatch m;
1895- if (std::regex_match (b, e, m, re_another_range)) {
1896- ssize_t first = -1 ;
1897- if (!m.str (1 ).empty ()) {
1898- first = static_cast <ssize_t >(std::stoll (m.str (1 )));
1899- }
1884+ static auto re_first_range =
1885+ std::regex (R"( bytes=(\d*-\d*(?:,\s*\d*-\d*)*))" );
1886+ std::smatch m;
1887+ if (std::regex_match (s, m, re_first_range)) {
1888+ auto pos = m.position (1 );
1889+ auto len = m.length (1 );
1890+ bool all_valid_ranges = true ;
1891+ detail::split (
1892+ &s[pos], &s[pos + len], ' ,' , [&](const char *b, const char *e) {
1893+ if (!all_valid_ranges) return ;
1894+ static auto re_another_range = std::regex (R"( \s*(\d*)-(\d*))" );
1895+ std::cmatch m;
1896+ if (std::regex_match (b, e, m, re_another_range)) {
1897+ ssize_t first = -1 ;
1898+ if (!m.str (1 ).empty ()) {
1899+ first = static_cast <ssize_t >(std::stoll (m.str (1 )));
1900+ }
19001901
1901- ssize_t last = -1 ;
1902- if (!m.str (2 ).empty ()) {
1903- last = static_cast <ssize_t >(std::stoll (m.str (2 )));
1904- }
1902+ ssize_t last = -1 ;
1903+ if (!m.str (2 ).empty ()) {
1904+ last = static_cast <ssize_t >(std::stoll (m.str (2 )));
1905+ }
19051906
1906- if (first != -1 && last != -1 && first > last) {
1907- throw std::runtime_error (" invalid range error" );
1908- }
1909- ranges.emplace_back (std::make_pair (first, last));
1907+ if (first != -1 && last != -1 && first > last) {
1908+ all_valid_ranges = false ;
1909+ return ;
19101910 }
1911- });
1912- return true ;
1913- }
1914- return false ;
1915- } catch (...) { return false ; }
1911+ ranges.emplace_back (std::make_pair (first, last));
1912+ }
1913+ });
1914+ return all_valid_ranges;
1915+ }
1916+ return false ;
19161917}
19171918
19181919class MultipartFormDataParser {
0 commit comments