aboutsummaryrefslogtreecommitdiff
path: root/lib/q2url.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/q2url.c')
-rw-r--r--lib/q2url.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/q2url.c b/lib/q2url.c
new file mode 100644
index 0000000..a96e2e9
--- /dev/null
+++ b/lib/q2url.c
@@ -0,0 +1,75 @@
+/* This file is part of Eclat.
+ Copyright (C) 2012 Sergey Poznyakoff.
+
+ Eclat is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ Eclat is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Eclat. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+#include <string.h>
+#include "libeclat.h"
+#include "grecs.h"
+
+static int
+add_param(void *sym, void *data)
+{
+ struct ec2_param *p = sym;
+ struct grecs_txtacc *acc = data;
+
+ grecs_txtacc_grow_char(acc, '&');
+ grecs_txtacc_grow(acc, p->name, strlen(p->name));
+ grecs_txtacc_grow_char(acc, '=');
+ grecs_txtacc_grow(acc, p->value, strlen(p->value));
+
+ return 0;
+}
+
+char *
+eclat_query_to_url(struct ec2_query *req, char **post_params)
+{
+ struct grecs_txtacc *acc;
+ char *ret = NULL;
+
+ acc = grecs_txtacc_create();
+
+ grecs_txtacc_grow(acc, "http", 4);
+ if (req->https)
+ grecs_txtacc_grow_char(acc, 's');
+ grecs_txtacc_grow(acc, "//", 2);
+ grecs_txtacc_grow(acc, req->endpoint, strlen(req->endpoint));
+ grecs_txtacc_grow(acc, req->uri, strlen(req->uri));
+
+ if (strcmp(req->verb, "POST") == 0) {
+ grecs_txtacc_grow_char(acc, 0);
+ ret = grecs_txtacc_finish(acc, 1);
+ } else {
+ grecs_txtacc_grow_char(acc, '?');
+ }
+
+ /* Add signature */
+ grecs_txtacc_grow(acc, "Signature", sizeof ("Signature"));
+ grecs_txtacc_grow_char(acc, '=');
+ grecs_txtacc_grow(acc, req->signature, strlen(req->signature));
+ /* Add other parameters */
+ grecs_symtab_enumerate(req->params, add_param, acc);
+
+ grecs_txtacc_grow_char(acc, 0);
+
+ if (!ret)
+ ret = grecs_txtacc_finish(acc, 1);
+ else
+ *post_params = grecs_txtacc_finish(acc, 1);
+
+ grecs_txtacc_free(acc);
+
+ return ret;
+}

Return to:

Send suggestions and report system problems to the System administrator.