From d1920de838b17847b2e8a1520af0d82e670d5558 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 11 May 2021 16:04:02 +0200 Subject: Parse content disposition better (when it contains encoding) --- src/NetUtils.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'src/NetUtils.cpp') diff --git a/src/NetUtils.cpp b/src/NetUtils.cpp index dc7c2d2..de908b1 100644 --- a/src/NetUtils.cpp +++ b/src/NetUtils.cpp @@ -1563,6 +1563,18 @@ namespace QuickMedia { return c >= '0' && c <= '9'; } + // Returns -1 if its not a hex value + static int get_hex_value(char c) { + if(c >= '0' && c <= '9') + return c - '0'; + else if(c >= 'A' && c <= 'F') + return 10 + (c - 'A'); + else if(c >= 'a' && c <= 'f') + return 10 + (c - 'a'); + else + return -1; + } + static bool is_whitespace(char c) { return c == ' ' || c == '\t' || c == '\n'; } @@ -1584,6 +1596,34 @@ namespace QuickMedia { return result.str(); } + std::string url_param_decode(const std::string ¶m) { + std::string result; + for(int i = 0; i < (int)param.size();) { + char c = param[i]; + if(c == '%') { + if(i < (int)param.size() - 1 && param[i + 1] == '%') { + result += c; + i += 2; + } else if(i < (int)param.size() - 2) { + int first_c = get_hex_value(param[i + 1]); + int second_c = get_hex_value(param[i + 2]); + if(first_c != -1 && second_c != -1) { + result += (char)((first_c << 4) | second_c); + i += 3; + } else { + i += 1; + } + } else { + i += 1; + } + } else { + result += c; + i += 1; + } + } + return result; + } + static bool is_url_start_char(char c) { return is_alpha(c) || is_digit(c) || c == '-' || c == '.' || c == '_' || c == '~'; } -- cgit v1.2.3