summaryrefslogtreecommitdiff
path: root/xs_url.h
diff options
context:
space:
mode:
Diffstat (limited to 'xs_url.h')
-rw-r--r--xs_url.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/xs_url.h b/xs_url.h
index 7bdff49..222771f 100644
--- a/xs_url.h
+++ b/xs_url.h
@@ -6,6 +6,7 @@
6 6
7xs_str *xs_url_dec(const char *str); 7xs_str *xs_url_dec(const char *str);
8xs_str *xs_url_enc(const char *str); 8xs_str *xs_url_enc(const char *str);
9xs_str *xs_url_dec_emoji(const char *str);
9xs_dict *xs_url_vars(const char *str); 10xs_dict *xs_url_vars(const char *str);
10xs_dict *xs_multipart_form_data(const char *payload, int p_size, const char *header); 11xs_dict *xs_multipart_form_data(const char *payload, int p_size, const char *header);
11 12
@@ -79,6 +80,38 @@ xs_str *xs_url_dec(const char *str)
79} 80}
80 81
81 82
83xs_str *xs_url_dec_emoji(const char *str)
84/* decodes an URL, returns NULL if not every char is an encoded hex */
85{
86 xs_str *s = xs_str_new(NULL);
87
88 while (*str) {
89 if (!xs_is_string(str))
90 break;
91
92 if (*str == '%') {
93 unsigned int i;
94
95 if (sscanf(str + 1, "%02x", &i) == 1) {
96 unsigned char uc = i;
97
98 if (!xs_is_string((char *)&uc))
99 break;
100
101 s = xs_append_m(s, (char *)&uc, 1);
102 str += 2;
103 }
104 }
105 else
106 return NULL;
107
108 str++;
109 }
110
111 return s;
112}
113
114
82xs_str *xs_url_enc(const char *str) 115xs_str *xs_url_enc(const char *str)
83/* URL-encodes a string (RFC 3986) */ 116/* URL-encodes a string (RFC 3986) */
84{ 117{