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 */