diff options
| author | yangwei <[email protected]> | 2023-04-11 11:46:20 +0800 |
|---|---|---|
| committer | yangwei <[email protected]> | 2023-04-11 11:46:20 +0800 |
| commit | 8521902b397ea248930af380058871cc556be452 (patch) | |
| tree | ad114aa1fc149ad4ed614b7a4dece2106ec15821 /src | |
| parent | cb4adbbb7190dfb576cafe02117b90b5cd7bbe84 (diff) | |
🐞 fix(http_url_decode): using libhttpd urldecode
Diffstat (limited to 'src')
| -rw-r--r-- | src/HTTP_Message.c | 35 |
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) |
