commit 9c4e491

default  ·  2023-05-11 08:48:37 +0000 UTC
parent 2a07311
Backport from xs.
3 files changed,  +91, -8
+32, -7
 1@@ -4,15 +4,15 @@
 2 
 3 #define _XS_HTTPD_H
 4 
 5-xs_str *xs_url_dec(char *str);
 6-xs_dict *xs_url_vars(char *str);
 7+xs_str *xs_url_dec(const char *str);
 8+xs_dict *xs_url_vars(const char *str);
 9 xs_dict *xs_httpd_request(FILE *f, xs_str **payload, int *p_size);
10 void xs_httpd_response(FILE *f, int status, xs_dict *headers, xs_str *body, int b_size);
11 
12 
13 #ifdef XS_IMPLEMENTATION
14 
15-xs_str *xs_url_dec(char *str)
16+xs_str *xs_url_dec(const char *str)
17 /* decodes an URL */
18 {
19     xs_str *s = xs_str_new(NULL);
20@@ -41,7 +41,7 @@ xs_str *xs_url_dec(char *str)
21 }
22 
23 
24-xs_dict *xs_url_vars(char *str)
25+xs_dict *xs_url_vars(const char *str)
26 /* parse url variables */
27 {
28     xs_dict *vars;
29@@ -59,9 +59,34 @@ xs_dict *xs_url_vars(char *str)
30         while (xs_list_iter(&l, &v)) {
31             xs *kv = xs_split_n(v, "=", 2);
32 
33-            if (xs_list_len(kv) == 2)
34-                vars = xs_dict_append(vars,
35-                    xs_list_get(kv, 0), xs_list_get(kv, 1));
36+            if (xs_list_len(kv) == 2) {
37+                const char *key = xs_list_get(kv, 0);
38+                const char *pv  = xs_dict_get(vars, key);
39+
40+                if (!xs_is_null(pv)) {
41+                    /* there is a previous value: convert to a list and append */
42+                    xs *vlist = NULL;
43+                    if (xs_type(pv) == XSTYPE_LIST)
44+                        vlist = xs_dup(pv);
45+                    else {
46+                        vlist = xs_list_new();
47+                        vlist = xs_list_append(vlist, pv);
48+                    }
49+
50+                    vlist = xs_list_append(vlist, xs_list_get(kv, 1));
51+                    vars  = xs_dict_set(vars, key, vlist);
52+                }
53+                else {
54+                    /* ends with []? force to always be a list */
55+                    if (xs_endswith(key, "[]")) {
56+                        xs *vlist = xs_list_new();
57+                        vlist = xs_list_append(vlist, xs_list_get(kv, 1));
58+                        vars = xs_dict_append(vars, key, vlist);
59+                    }
60+                    else
61+                        vars = xs_dict_append(vars, key, xs_list_get(kv, 1));
62+                }
63+            }
64         }
65     }
66 
+58, -0
 1@@ -22,6 +22,64 @@ int xs_evp_verify(const char *pubkey, const char *mem, int size, const char *b64
 2 #include "openssl/pem.h"
 3 #include "openssl/evp.h"
 4 
 5+#if 0
 6+xs_str *xs_base64_enc(const xs_val *data, int sz)
 7+/* encodes data to base64 */
 8+{
 9+    BIO *mem, *b64;
10+    BUF_MEM *bptr;
11+ 
12+    b64 = BIO_new(BIO_f_base64());
13+    mem = BIO_new(BIO_s_mem());
14+    b64 = BIO_push(b64, mem);
15+
16+    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
17+
18+    BIO_write(b64, data, sz);
19+    BIO_flush(b64);
20+    BIO_get_mem_ptr(b64, &bptr);
21+
22+    int n = bptr->length;
23+    xs_str *s = xs_realloc(NULL, _xs_blk_size(n + 1));
24+
25+    memcpy(s, bptr->data, n);
26+    s[n] = '\0';
27+
28+    BIO_free_all(b64);
29+
30+    return s;
31+}
32+
33+
34+xs_val *xs_base64_dec(const xs_str *data, int *size)
35+/* decodes data from base64 */
36+{
37+    BIO *b64, *mem;
38+
39+    *size = strlen(data);
40+
41+    b64 = BIO_new(BIO_f_base64());
42+    mem = BIO_new_mem_buf(data, *size);
43+    b64 = BIO_push(b64, mem);
44+
45+    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
46+
47+    /* alloc a very big buffer */
48+    xs_str *s = xs_realloc(NULL, *size);
49+
50+    *size = BIO_read(b64, s, *size);
51+
52+    /* adjust to current size */
53+    s = xs_realloc(s, _xs_blk_size(*size + 1));
54+    s[*size] = '\0';
55+
56+    BIO_free_all(mem);
57+
58+    return s;
59+}
60+#endif
61+
62+
63 xs_str *_xs_digest(const xs_val *input, int size, const char *digest, int as_hex)
64 /* generic function for generating and encoding digests */
65 {
+1, -1
1@@ -1 +1 @@
2-/* 01bea7d4a0e631c0406b358dda9cc9409362c003 */
3+/* 333e84c76cd0e51f9f98a36df2eb3bf81e0d2608 */