summaryrefslogtreecommitdiff
path: root/xs_url.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--xs_url.h25
1 files changed, 24 insertions, 1 deletions
diff --git a/xs_url.h b/xs_url.h
index ac43585..3c24736 100644
--- a/xs_url.h
+++ b/xs_url.h
@@ -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
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_dict *xs_url_vars(const char *str); 9xs_dict *xs_url_vars(const char *str);
9xs_dict *xs_multipart_form_data(const char *payload, int p_size, const char *header); 10xs_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
43xs_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
42xs_dict *xs_url_vars(const char *str) 65xs_dict *xs_url_vars(const char *str)
43/* parse url variables */ 66/* parse url variables */
44{ 67{