mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-21 11:30:01 +00:00
Add mg_url_encode_opt()
CL: Add `mg_url_encode_opt()` - a parametrized version of `mg_url_encode()` PUBLISHED_FROM=17fa57a7a5325b51b6e3aef3855eac4e82c35782
This commit is contained in:
1 parent
c2fbff6d0e
commit
e89be2e944
6 files changed
+81
-18
No files matched your search
+12
-4
@@ -313,17 +313,21 @@ void mg_basic_auth_header(const struct mg_str user, const struct mg_str pass,
|
||||
mbuf_append(buf, header_suffix, strlen(header_suffix));
|
||||
}
|
||||
|
||||
struct mg_str mg_url_encode(const struct mg_str src) {
|
||||
static const char *dont_escape = "._-$,;~()/";
|
||||
static const char *hex = "0123456789abcdef";
|
||||
struct mg_str mg_url_encode_opt(const struct mg_str src,
|
||||
const struct mg_str safe, unsigned int flags) {
|
||||
const char *hex =
|
||||
(flags & MG_URL_ENCODE_F_UPPERCASE_HEX ? "0123456789ABCDEF"
|
||||
: "0123456789abcdef");
|
||||
size_t i = 0;
|
||||
struct mbuf mb;
|
||||
mbuf_init(&mb, src.len);
|
||||
|
||||
for (i = 0; i < src.len; i++) {
|
||||
const unsigned char c = *((const unsigned char *) src.p + i);
|
||||
if (isalnum(c) || strchr(dont_escape, c) != NULL) {
|
||||
if (isalnum(c) || mg_strchr(safe, c) != NULL) {
|
||||
mbuf_append(&mb, &c, 1);
|
||||
} else if (c == ' ' && (flags & MG_URL_ENCODE_F_SPACE_AS_PLUS)) {
|
||||
mbuf_append(&mb, "+", 1);
|
||||
} else {
|
||||
mbuf_append(&mb, "%", 1);
|
||||
mbuf_append(&mb, &hex[c >> 4], 1);
|
||||
@@ -334,3 +338,7 @@ struct mg_str mg_url_encode(const struct mg_str src) {
|
||||
mbuf_trim(&mb);
|
||||
return mg_mk_str_n(mb.buf, mb.len - 1);
|
||||
}
|
||||
|
||||
struct mg_str mg_url_encode(const struct mg_str src) {
|
||||
return mg_url_encode_opt(src, mg_mk_str("._-$,;~()/"), 0);
|
||||
}
|
||||
+8
-1
@@ -196,10 +196,17 @@ void mg_basic_auth_header(const struct mg_str user, const struct mg_str pass,
|
||||
|
||||
/*
|
||||
* URL-escape the specified string.
|
||||
* All non-printable characters are escaped, plus `._-$,;~()/`.
|
||||
* All characters acept letters, numbers and characters listed in
|
||||
* `safe` are escaped. If `hex_upper`is true, `A-F` are used for hex digits.
|
||||
* Input need not be NUL-terminated, but the returned string is.
|
||||
* Returned string is heap-allocated and must be free()'d.
|
||||
*/
|
||||
#define MG_URL_ENCODE_F_SPACE_AS_PLUS (1 << 0)
|
||||
#define MG_URL_ENCODE_F_UPPERCASE_HEX (1 << 1)
|
||||
struct mg_str mg_url_encode_opt(const struct mg_str src,
|
||||
const struct mg_str safe, unsigned int flags);
|
||||
|
||||
/* Same as `mg_url_encode_opt(src, "._-$,;~()/", 0)`. */
|
||||
struct mg_str mg_url_encode(const struct mg_str src);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
Reference in new issue
Block a user