diff options
Diffstat (limited to '')
| -rw-r--r-- | xs_url.h | 25 |
1 files changed, 24 insertions, 1 deletions
| @@ -1,10 +1,11 @@ | |||
| 1 | /* copyright (c) 2022 - 2024 grunfink et al. / MIT license */ | 1 | /* copyright (c) 2022 - 2025 grunfink et al. / MIT license */ |
| 2 | 2 | ||
| 3 | #ifndef _XS_URL_H | 3 | #ifndef _XS_URL_H |
| 4 | 4 | ||
| 5 | #define _XS_URL_H | 5 | #define _XS_URL_H |
| 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_dict *xs_url_vars(const char *str); | 9 | xs_dict *xs_url_vars(const char *str); |
| 9 | xs_dict *xs_multipart_form_data(const char *payload, int p_size, const char *header); | 10 | xs_dict *xs_multipart_form_data(const char *payload, int p_size, const char *header); |
| 10 | 11 | ||
| @@ -39,6 +40,28 @@ xs_str *xs_url_dec(const char *str) | |||
| 39 | } | 40 | } |
| 40 | 41 | ||
| 41 | 42 | ||
| 43 | xs_str *xs_url_enc(const char *str) | ||
| 44 | /* URL-encodes a string (RFC 3986) */ | ||
| 45 | { | ||
| 46 | xs_str *s = xs_str_new(NULL); | ||
| 47 | |||
| 48 | while (*str) { | ||
| 49 | if (isalnum(*str) || strchr("-._~", *str)) { | ||
| 50 | s = xs_append_m(s, str, 1); | ||
| 51 | } | ||
| 52 | else { | ||
| 53 | char tmp[8]; | ||
| 54 | snprintf(tmp, sizeof(tmp), "%%%02X", (unsigned char)*str); | ||
| 55 | s = xs_append_m(s, tmp, 3); | ||
| 56 | } | ||
| 57 | |||
| 58 | str++; | ||
| 59 | } | ||
| 60 | |||
| 61 | return s; | ||
| 62 | } | ||
| 63 | |||
| 64 | |||
| 42 | xs_dict *xs_url_vars(const char *str) | 65 | xs_dict *xs_url_vars(const char *str) |
| 43 | /* parse url variables */ | 66 | /* parse url variables */ |
| 44 | { | 67 | { |