From 2bcfa97e1b3760e0c9acbdf57bfe4ae631e9f037 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Sun, 13 Dec 2020 16:05:55 +0100 Subject: [PATCH] Added url_encode and url_decode --- src/utils.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/utils.h | 4 ++++ 2 files changed, 55 insertions(+) diff --git a/src/utils.c b/src/utils.c index f1a1a40..40aebbf 100644 --- a/src/utils.c +++ b/src/utils.c @@ -21,3 +21,54 @@ char *format_duration(unsigned long micros, char *buf) { } return buf; } + +int url_encode(const char *str, char *enc, ssize_t *size) { + char *ptr = enc; + char ch; + memset(enc, 0, *size); + for (int i = 0; i < strlen(str); i++, ptr++) { + if ((ptr - enc) >= *size) { + printf("%li %li\n", ptr - enc, *size); + return -1; + } + ch = str[i]; + if (ch == ':' || ch == '/' || ch == '?' || ch == '#' || ch == '[' || ch == ']' || ch == '@' || ch == '!' || + ch == '$' || ch == '&' || ch == '\'' || ch == '(' || ch == ')' || ch == '*' || ch == '+' || ch == ',' || + ch == ';' || ch == '=' || ch < ' ' || ch > '~') { + if ((ptr - enc + 2) >= *size) { + return -1; + } + sprintf(ptr, "%%%02X", ch); + ptr += 2; + } else if (ch == ' ') { + ptr[0] = '+'; + } else { + ptr[0] = ch; + } + } + *size = ptr - enc; + return 0; +} + +int url_decode(const char *str, char *dec, ssize_t *size) { + char *ptr = dec; + char ch, buf[3]; + memset(dec, 0, *size); + for (int i = 0; i < strlen(str); i++, ptr++) { + if ((ptr - dec) >= *size) { + return -1; + } + ch = str[i]; + if (ch == '+') { + ch = ' '; + } else if (ch == '%') { + memcpy(buf, str + i + 1, 2); + buf[2] = 0; + ch = (char) strtol(buf, NULL, 16); + i += 2; + } + ptr[0] = ch; + } + *size = ptr - dec; + return 0; +} diff --git a/src/utils.h b/src/utils.h index bf3eadd..954e297 100644 --- a/src/utils.h +++ b/src/utils.h @@ -21,4 +21,8 @@ char *log_prefix; char *format_duration(unsigned long micros, char *buf); +int url_encode(const char *str, char *enc, ssize_t *size); + +int url_decode(const char *str, char *dec, ssize_t *size); + #endif //NECRONDA_SERVER_UTILS_H