aboutsummaryrefslogtreecommitdiff
path: root/lib/q2url.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2012-09-19 19:43:22 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2012-09-19 19:43:22 +0300
commit96871660d41c0130460f52057c0334cec46f7dd3 (patch)
tree3c78ca7b60d127a8745c4da5e71a184dd3fa13e8 /lib/q2url.c
parent7bec448cd0383ef533ab7c0c6e19374d515dfecf (diff)
downloadeclat-96871660d41c0130460f52057c0334cec46f7dd3.tar.gz
eclat-96871660d41c0130460f52057c0334cec46f7dd3.tar.bz2
Implement query-to-url function.
* lib/q2url.c: New file. * lib/Makefile.am: Add new file. * lib/libeclat.h (ec2_query) <signature>: New member. (eclat_query_to_url): New proto. (eclat_query_signature): Change signature. * lib/reqsign.c (eclat_query_signature): Store signature to req->signature.
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.