/* This file is part of Eclat. Copyright (C) 2012, 2013 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 . */ #include #include #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)); if (p->value) { 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, *p; acc = grecs_txtacc_create(); grecs_txtacc_grow(acc, "http", 4); if (req->flags & EC2_QF_HTTPS) grecs_txtacc_grow_char(acc, 's'); grecs_txtacc_grow(acc, "://", 3); grecs_txtacc_grow(acc, req->endpoint, strlen(req->endpoint)); grecs_txtacc_grow(acc, req->uri, strlen(req->uri)); if (req->flags & EC2_QF_POST) { 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")-1); grecs_txtacc_grow_char(acc, '='); urlencode(req->signature, strlen(req->signature), &p, NULL); grecs_txtacc_grow(acc, p, strlen(p)); free(p); /* 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; }