diff options
| author | 2023-05-11 10:48:37 +0200 | |
|---|---|---|
| committer | 2023-05-11 10:48:37 +0200 | |
| commit | 9c4e491497d42770d64e9770fe347514f577cf39 (patch) | |
| tree | 3be24fbb7e48e0fd1f86de6caadc671de8f30cc8 /xs_httpd.h | |
| parent | In /relationship, the id[] can be a list. (diff) | |
| download | penes-snac2-9c4e491497d42770d64e9770fe347514f577cf39.tar.gz penes-snac2-9c4e491497d42770d64e9770fe347514f577cf39.tar.xz penes-snac2-9c4e491497d42770d64e9770fe347514f577cf39.zip | |
Backport from xs.
Diffstat (limited to 'xs_httpd.h')
| -rw-r--r-- | xs_httpd.h | 39 |
1 files changed, 32 insertions, 7 deletions
| @@ -4,15 +4,15 @@ | |||
| 4 | 4 | ||
| 5 | #define _XS_HTTPD_H | 5 | #define _XS_HTTPD_H |
| 6 | 6 | ||
| 7 | xs_str *xs_url_dec(char *str); | 7 | xs_str *xs_url_dec(const char *str); |
| 8 | xs_dict *xs_url_vars(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); | 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); | 10 | void xs_httpd_response(FILE *f, int status, xs_dict *headers, xs_str *body, int b_size); |
| 11 | 11 | ||
| 12 | 12 | ||
| 13 | #ifdef XS_IMPLEMENTATION | 13 | #ifdef XS_IMPLEMENTATION |
| 14 | 14 | ||
| 15 | xs_str *xs_url_dec(char *str) | 15 | xs_str *xs_url_dec(const char *str) |
| 16 | /* decodes an URL */ | 16 | /* decodes an URL */ |
| 17 | { | 17 | { |
| 18 | xs_str *s = xs_str_new(NULL); | 18 | xs_str *s = xs_str_new(NULL); |
| @@ -41,7 +41,7 @@ xs_str *xs_url_dec(char *str) | |||
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | 43 | ||
| 44 | xs_dict *xs_url_vars(char *str) | 44 | xs_dict *xs_url_vars(const char *str) |
| 45 | /* parse url variables */ | 45 | /* parse url variables */ |
| 46 | { | 46 | { |
| 47 | xs_dict *vars; | 47 | xs_dict *vars; |
| @@ -59,9 +59,34 @@ xs_dict *xs_url_vars(char *str) | |||
| 59 | while (xs_list_iter(&l, &v)) { | 59 | while (xs_list_iter(&l, &v)) { |
| 60 | xs *kv = xs_split_n(v, "=", 2); | 60 | xs *kv = xs_split_n(v, "=", 2); |
| 61 | 61 | ||
| 62 | if (xs_list_len(kv) == 2) | 62 | if (xs_list_len(kv) == 2) { |
| 63 | vars = xs_dict_append(vars, | 63 | const char *key = xs_list_get(kv, 0); |
| 64 | xs_list_get(kv, 0), xs_list_get(kv, 1)); | 64 | const char *pv = xs_dict_get(vars, key); |
| 65 | |||
| 66 | if (!xs_is_null(pv)) { | ||
| 67 | /* there is a previous value: convert to a list and append */ | ||
| 68 | xs *vlist = NULL; | ||
| 69 | if (xs_type(pv) == XSTYPE_LIST) | ||
| 70 | vlist = xs_dup(pv); | ||
| 71 | else { | ||
| 72 | vlist = xs_list_new(); | ||
| 73 | vlist = xs_list_append(vlist, pv); | ||
| 74 | } | ||
| 75 | |||
| 76 | vlist = xs_list_append(vlist, xs_list_get(kv, 1)); | ||
| 77 | vars = xs_dict_set(vars, key, vlist); | ||
| 78 | } | ||
| 79 | else { | ||
| 80 | /* ends with []? force to always be a list */ | ||
| 81 | if (xs_endswith(key, "[]")) { | ||
| 82 | xs *vlist = xs_list_new(); | ||
| 83 | vlist = xs_list_append(vlist, xs_list_get(kv, 1)); | ||
| 84 | vars = xs_dict_append(vars, key, vlist); | ||
| 85 | } | ||
| 86 | else | ||
| 87 | vars = xs_dict_append(vars, key, xs_list_get(kv, 1)); | ||
| 88 | } | ||
| 89 | } | ||
| 65 | } | 90 | } |
| 66 | } | 91 | } |
| 67 | 92 | ||