summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoryangwei <[email protected]>2023-04-11 11:46:20 +0800
committeryangwei <[email protected]>2023-04-11 11:46:20 +0800
commit8521902b397ea248930af380058871cc556be452 (patch)
treead114aa1fc149ad4ed614b7a4dece2106ec15821 /src
parentcb4adbbb7190dfb576cafe02117b90b5cd7bbe84 (diff)
🐞 fix(http_url_decode): using libhttpd urldecode
Diffstat (limited to 'src')
-rw-r--r--src/HTTP_Message.c35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/HTTP_Message.c b/src/HTTP_Message.c
index 6296680..f1fb8f8 100644
--- a/src/HTTP_Message.c
+++ b/src/HTTP_Message.c
@@ -93,7 +93,6 @@ char* http_url_decode(char *data, int* data_len)
free(str);
return data;
}
-*/
char* http_url_decode(char *data, int* data_len)
{
@@ -128,6 +127,40 @@ char* http_url_decode(char *data, int* data_len)
free(str);
return data;
}
+*/
+
+#define li_cton(c,n) \
+ (((n) = (c) - '0') <= 9 || (((n) = ((c)&0xdf) - 'A') <= 5 ? ((n) += 10) : 0))
+
+char hex2int(unsigned char hex) {
+ unsigned char n;
+ return li_cton(hex,n) ? (char)n : 0xFF;
+}
+
+char* http_url_decode(char* url, int *len)
+{
+ if(url == NULL || *len <= 0) return 0;
+
+ const char *ptr = url;
+ char *src = *len ? memchr(url, '%', *len) : 0;
+ if (NULL == src) return 0;
+
+ char *dst = src;
+ do {
+ /* *src == '%' */
+ unsigned char high = ((unsigned char *)src)[1];
+ unsigned char low = high ? hex2int(((unsigned char *)src)[2]) : 0xFF;
+ if (0xFF != (high = hex2int(high)) && 0xFF != low) {
+ high = (high << 4) | low; /* map ctrls to '_' */
+ *dst = (high >= 32 && high != 127) ? high : '_';
+ src += 2;
+ } /* else ignore this '%'; leave as-is and move on */
+
+ while ((*++dst = *++src) != '%' && *src) ;
+ } while (*src);
+ *len = (dst - ptr) + 1;
+ return url;
+}
const char* http_proto_flag2region(int64 proto_flag)