aboutsummaryrefslogtreecommitdiff
path: root/src/NetUtils.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2021-05-11 16:04:02 +0200
committerdec05eba <dec05eba@protonmail.com>2021-05-11 16:04:52 +0200
commitd1920de838b17847b2e8a1520af0d82e670d5558 (patch)
tree520220da38f258f788a42ee0b13fac74d980acbc /src/NetUtils.cpp
parent2be5a938f906fa1ec95b424a0efd5fab3a1acdc7 (diff)
Parse content disposition better (when it contains encoding)
Diffstat (limited to 'src/NetUtils.cpp')
-rw-r--r--src/NetUtils.cpp40
1 files changed, 40 insertions, 0 deletions
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 &param) {
+ 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 == '~';
}