@@ -1881,38 +1881,39 @@ inline bool parse_multipart_boundary(const std::string &content_type,
1881
1881
}
1882
1882
1883
1883
inline 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
+ }
1900
1901
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
+ }
1905
1906
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 ;
1910
1910
}
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 ;
1916
1917
}
1917
1918
1918
1919
class MultipartFormDataParser {
0 commit comments