diff options
Diffstat (limited to 'xs_url.h')
| -rw-r--r-- | xs_url.h | 33 |
1 files changed, 33 insertions, 0 deletions
| @@ -6,6 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | xs_str *xs_url_dec(const char *str); | 7 | xs_str *xs_url_dec(const char *str); |
| 8 | xs_str *xs_url_enc(const char *str); | 8 | xs_str *xs_url_enc(const char *str); |
| 9 | xs_str *xs_url_dec_emoji(const char *str); | ||
| 9 | xs_dict *xs_url_vars(const char *str); | 10 | xs_dict *xs_url_vars(const char *str); |
| 10 | xs_dict *xs_multipart_form_data(const char *payload, int p_size, const char *header); | 11 | xs_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 | ||
| 83 | xs_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 | |||
| 82 | xs_str *xs_url_enc(const char *str) | 115 | xs_str *xs_url_enc(const char *str) |
| 83 | /* URL-encodes a string (RFC 3986) */ | 116 | /* URL-encodes a string (RFC 3986) */ |
| 84 | { | 117 | { |