aboutsummaryrefslogtreecommitdiffstats
path: root/src/afb-hreq.c
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2016-03-31 17:56:32 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2016-03-31 17:56:32 +0200
commit1205c90cccd3144bab24b4b5fd8dcbf0d0e6b570 (patch)
treeed8b93e852f4f7e6b1884348891e39b562eb74bb /src/afb-hreq.c
parentcc4b56b6710624c069642d1a510d0060949fe5b9 (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.c62
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;
+ }
+}
+