diff options
author | 2016-03-31 17:56:32 +0200 | |
---|---|---|
committer | 2016-03-31 17:56:32 +0200 | |
commit | 1205c90cccd3144bab24b4b5fd8dcbf0d0e6b570 (patch) | |
tree | ed8b93e852f4f7e6b1884348891e39b562eb74bb /src/afb-hreq.c | |
parent | cc4b56b6710624c069642d1a510d0060949fe5b9 (diff) |
refactoring (in progress, tbf)
Change-Id: I8f2684a38d0894d827510d9a171ee6d5c39fb55e
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'src/afb-hreq.c')
-rw-r--r-- | src/afb-hreq.c | 62 |
1 files changed, 56 insertions, 6 deletions
diff --git a/src/afb-hreq.c b/src/afb-hreq.c index 60ff6b01..16114675 100644 --- a/src/afb-hreq.c +++ b/src/afb-hreq.c @@ -36,6 +36,12 @@ struct hreq_data { char *value; }; +static const struct afb_req_itf afb_hreq_itf = { + .argument = (void*)afb_hreq_get_argument, + .is_argument_file = (void*)afb_hreq_is_argument_a_file, + .iterate_arguments = (void*)afb_hreq_iterate_arguments +}; + static struct hreq_data *get_data(struct afb_hreq *hreq, const char *key, int create) { struct hreq_data *data = hreq->data; @@ -279,12 +285,6 @@ const char *afb_hreq_get_header(struct afb_hreq *hreq, const char *name) return MHD_lookup_connection_value(hreq->connection, MHD_HEADER_KIND, name); } -const struct afb_req_itf afb_hreq_itf = { - .get_cookie = (void*)afb_hreq_get_cookie, - .get_argument = (void*)afb_hreq_get_argument -}; - - void afb_hreq_post_end(struct afb_hreq *hreq) { struct hreq_data *data = hreq->data; @@ -340,3 +340,53 @@ int afb_hreq_post_add_file(struct afb_hreq *hreq, const char *key, const char *f } +int afb_hreq_is_argument_a_file(struct afb_hreq *hreq, const char *key) +{ + struct hreq_data *hdat = get_data(hreq, key, 0); + return hdat != NULL && hdat->file != 0; +} + + +struct afb_req afb_hreq_to_req(struct afb_hreq *hreq) +{ + return (struct afb_req){ .itf = &afb_hreq_itf, .data = hreq }; +} + +struct iterator_data +{ + struct afb_hreq *hreq; + int (*iterator)(void *closure, const char *key, const char *value, int isfile); + void *closure; +}; + +static int itargs(struct iterator_data *id, enum MHD_ValueKind kind, const char *key, const char *value) +{ + if (get_data(id->hreq, key, 0)) + return 1; + return id->iterator(id->closure, key, value, 0); +} + +void afb_hreq_iterate_arguments(struct afb_hreq *hreq, int (*iterator)(void *closure, const char *key, const char *value, int isfile), void *closure) +{ + struct iterator_data id = { .hreq = hreq, .iterator = iterator, .closure = closure }; + struct hreq_data *data = hreq->data; + while (data) { + if (!iterator(closure, data->key, data->value, !!data->file)) + return; + data = data->next; + } + MHD_get_connection_values (hreq->connection, MHD_GET_ARGUMENT_KIND, (void*)itargs, &id); +} + +void afb_hreq_drop_data(struct afb_hreq *hreq) +{ + struct hreq_data *data = hreq->data; + while (data) { + hreq->data = data->next; + free(data->key); + free(data->value); + free(data); + data = hreq->data; + } +} + |