commit fa770a9a29f4123164567c873ae6d6f34444777b
parent 79f8f92c49cea689013d62b6dcc75b07360d6ea7
Author: Marcello Stanisci <marcello.stanisci@inria.fr>
Date: Fri, 9 Dec 2016 16:10:42 +0100
20% of /map/in's merchant-lib
Diffstat:
2 files changed, 214 insertions(+), 0 deletions(-)
diff --git a/src/backend/taler-merchant-httpd_map.h b/src/backend/taler-merchant-httpd_map.h
@@ -0,0 +1,66 @@
+/*
+ This file is part of TALER
+ (C) 2014, 2015, 2016 INRIA
+
+ TALER is free software; you can redistribute it and/or modify it under the
+ terms of the GNU Affero General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ TALER 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
+ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file backend/taler-merchant-httpd_contract.c
+ * @brief HTTP serving layer mainly intended to communicate with the frontend
+ * @author Marcello Stanisci
+ */
+
+#ifndef TALER_MERCHANT_HTTPD_MAP_H
+#define TALER_MERCHANT_HTTPD_MAP_H
+#include <microhttpd.h>
+#include "taler-merchant-httpd.h"
+
+
+/**
+ * Manage a /map/in request. Store in db a plain text contract
+ * and its hashcode.
+ *
+ * @param rh context of the handler
+ * @param connection the MHD connection to handle
+ * @param[in,out] connection_cls the connection's closure (can be updated)
+ * @param upload_data upload data
+ * @param[in,out] upload_data_size number of bytes (left) in @a upload_data
+ * @return MHD result code
+ */
+int
+MH_handler_map_in (struct TMH_RequestHandler *rh,
+ struct MHD_Connection *connection,
+ void **connection_cls,
+ const char *upload_data,
+ size_t *upload_data_size);
+
+
+/**
+ * Manage a /map/out request. Query the db and returns a plain
+ * text contract associated with the hashcode given as input
+ *
+ * @param rh context of the handler
+ * @param connection the MHD connection to handle
+ * @param[in,out] connection_cls the connection's closure (can be updated)
+ * @param upload_data upload data
+ * @param[in,out] upload_data_size number of bytes (left) in @a upload_data
+ * @return MHD result code
+ */
+int
+MH_handler_map_out (struct TMH_RequestHandler *rh,
+ struct MHD_Connection *connection,
+ void **connection_cls,
+ const char *upload_data,
+ size_t *upload_data_size);
+
+/* end of taler-merchant-httpd_history.c */
+#endif
diff --git a/src/lib/merchant_api_map.c b/src/lib/merchant_api_map.c
@@ -0,0 +1,148 @@
+/*
+ This file is part of TALER
+ Copyright (C) 2014, 2015, 2016 GNUnet e.V. and INRIA
+
+ TALER is free software; you can redistribute it and/or modify it under the
+ terms of the GNU Lesser General Public License as published by the Free Software
+ Foundation; either version 2.1, or (at your option) any later version.
+
+ TALER 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License along with
+ TALER; see the file COPYING.LGPL. If not, see
+ <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file lib/merchant_api_map.c
+ * @brief Implementation of the /map/{in,out} request of the merchant's HTTP API
+ * @author Marcello Stanisci
+ */
+#include "platform.h"
+#include <curl/curl.h>
+#include <jansson.h>
+#include <microhttpd.h> /* just for HTTP status codes */
+#include <gnunet/gnunet_util_lib.h>
+#include <gnunet/gnunet_curl_lib.h>
+#include "taler_merchant_service.h"
+#include <taler/taler_json_lib.h>
+
+struct TALER_MERCHANT_MapInOperation
+{
+ /**
+ * Full URI, includes "/map/in".
+ */
+ char *url;
+
+ /**
+ * Request's body
+ */
+ json_t *json_enc;
+
+ /**
+ * Handle for the request.
+ */
+ struct GNUNET_CURL_Job *job;
+
+ /**
+ * Function to call with the result.
+ */
+ TALER_MERCHANT_MapInOperationCallback cb;
+
+ /**
+ * Closure for @a cb.
+ */
+ void *cb_cls;
+
+ /**
+ * Reference to the execution context.
+ */
+ struct GNUNET_CURL_Context *ctx;
+
+};
+
+/**
+ * Function called when we're done processing the
+ * HTTP /map/in request.
+ *
+ * @param cls the `struct TALER_MERCHANT_FIXME`
+ * @param response_code HTTP response code, 0 on error
+ * @param json response body, NULL if not in JSON
+ */
+static void
+handle_contract_finished (void *cls,
+ long response_code,
+ const json_t *json)
+{
+
+ /**
+ * 1 Check if errors occurred
+ * 2 Call callback
+ */
+}
+
+/**
+ * Issue a /map/in request to the backend.
+ *
+ * @param ctx execution context
+ * @param backend_uri base URL of the merchant backend
+ * @param contract contract to store
+ * @param h_contract hashcode of `contract`
+ * @param map_in_cb callback which will work the response gotten from the backend
+ * @param map_in_cb_cls closure to pass to @a history_cb
+ * @return handle for this operation, NULL upon errors
+ */
+struct TALER_MERCHANT_HistoryOperation *
+TALER_MERCHANT_history (struct GNUNET_CURL_Context *ctx,
+ const char *backend_uri,
+ const json_t *contract,
+ const struct GNUNET_HashCode *h_contract,
+ TALER_MERCHANT_MapInOperationCallback map_in_cb,
+ void *map_in_cb_cls)
+{
+ struct TALER_MERCHANT_MapInOperation *mio;
+ CURL *eh;
+ json_t *req;
+
+ mio = GNUNET_new (struct TALER_MERCHANT_MapInOperation);
+ mio->ctx = ctx;
+ mio->cb = map_in_cb;
+ mio->cb_cls = map_in_cb_cls;
+
+ GNUNET_asprintf (&mio->url,
+ "%s%s",
+ backend_uri,
+ "/map/in");
+
+ // build final json
+ req = json_pack ("{s:o, s:o}",
+ "contract", contract,
+ "h_contract", GNUNET_JSON_from_data_auto (h_contract));
+
+ GNUNET_assert (NULL !=
+ (mio->json_enc = json_dumps (req, JSON_COMPACT))
+ );
+
+ json_decref (req);
+ eh = curl_easy_init ();
+
+ GNUNET_assert (CURLE_OK ==
+ curl_easy_setopt (eh,
+ CURLOPT_URL,
+ mio->url));
+ GNUNET_assert (CURLE_OK ==
+ curl_easy_setopt (eh,
+ CURLOPT_POSTFIELDS,
+ mio->json_enc));
+ GNUNET_assert (CURLE_OK ==
+ curl_easy_setopt (eh,
+ CURLOPT_POSTFIELDSIZE,
+ strlen (mio->json_enc)));
+ mio->job = GNUNET_CURL_job_add (ctx,
+ eh,
+ GNUNET_YES,
+ &handle_map_in_finished,
+ mio);
+ return mio;
+}