From 1203fda832b806c5fa21fe2cfb55ce0eb8d18464 Mon Sep 17 00:00:00 2001 From: Jerry <27206617@qq.com> Date: Mon, 17 Apr 2017 11:48:38 +0800 Subject: [PATCH] Escape some characters in URL --- source/core/util.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/source/core/util.c b/source/core/util.c index f24c8da..2ddd76b 100644 --- a/source/core/util.c +++ b/source/core/util.c @@ -53,6 +53,40 @@ static int util_get_lines(PrintConsole* console, const char* str) { return lines; } +static char util_dec2hex(short int c) +{ + if (0 <= c && c <= 9) return c + '0'; + else if (10 <= c && c <= 15) return c + 'A' - 10; + else return -1; +} + +void util_urlencode(char url[]) +{ + int i = 0; + int res_len = 0; + int len = strlen(url); + char res[1024]; + for (i = 0; i < len; ++i) { + char c = url[i]; + if ( + ('0' <= c && c <= '9') || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || + c == ':' || c == '/' || c == '.' || c == '%' || c == '+' || c == '?' || c == '=' || c == '&' || c == '#' + ) res[res_len++] = c; + else { + int j = (short int)c; + if (j < 0) j += 256; + int i1, i0; + i1 = j / 16; + i0 = j - i1 * 16; + res[res_len++] = '%'; + res[res_len++] = util_dec2hex(i1); + res[res_len++] = util_dec2hex(i0); + } + } + res[res_len] = '\0'; + strcpy(url, res); +} + void util_panic(const char* s, ...) { va_list list; va_start(list, s); @@ -687,6 +721,8 @@ Result util_http_open_ranged(httpcContext* context, u32* responseCode, const cha char currUrl[1024]; strncpy(currUrl, url, sizeof(currUrl)); + util_urlencode(currUrl); + char range[64]; if(rangeEnd > rangeStart) { snprintf(range, sizeof(range), "%lu-%lu", rangeStart, rangeEnd); @@ -790,4 +826,4 @@ Result util_http_close(httpcContext* context) { } return httpcCloseContext(context); -} \ No newline at end of file +}