summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/exchange/taler-exchange-httpd_responses.c170
-rw-r--r--src/include/taler_mhd_lib.h24
-rw-r--r--src/mhd/mhd_responses.c143
3 files changed, 121 insertions, 216 deletions
diff --git a/src/exchange/taler-exchange-httpd_responses.c b/src/exchange/taler-exchange-httpd_responses.c
index 6007a24bc..40c7fd7e0 100644
--- a/src/exchange/taler-exchange-httpd_responses.c
+++ b/src/exchange/taler-exchange-httpd_responses.c
@@ -94,28 +94,27 @@ TEH_RESPONSE_compile_transaction_history (
if (0 !=
json_array_append_new (
history,
- json_pack (
- "{s:s, s:o, s:o, s:o, s:o, s:o, s:o, s:o, s:o, s:o}",
- "type",
- "DEPOSIT",
- "amount",
- TALER_JSON_from_amount (&deposit->amount_with_fee),
- "deposit_fee",
- TALER_JSON_from_amount (&deposit->deposit_fee),
- "timestamp",
- GNUNET_JSON_from_time_abs (deposit->timestamp),
- "refund_deadline",
- GNUNET_JSON_from_time_abs (deposit->refund_deadline),
- "merchant_pub",
- GNUNET_JSON_from_data_auto (&deposit->merchant_pub),
- "h_contract_terms",
- GNUNET_JSON_from_data_auto (&deposit->h_contract_terms),
- "h_wire",
- GNUNET_JSON_from_data_auto (&deposit->h_wire),
- "h_denom_pub",
- GNUNET_JSON_from_data_auto (&deposit->h_denom_pub),
- "coin_sig",
- GNUNET_JSON_from_data_auto (&deposit->csig))))
+ GNUNET_JSON_PACK (
+ GNUNET_JSON_pack_string ("type",
+ "DEPOSIT"),
+ TALER_JSON_pack_amount ("amount",
+ &deposit->amount_with_fee),
+ TALER_JSON_pack_amount ("deposit_fee",
+ &deposit->deposit_fee),
+ GNUNET_JSON_pack_time_abs ("timestamp",
+ deposit->timestamp),
+ GNUNET_JSON_pack_time_abs ("refund_deadline",
+ deposit->refund_deadline),
+ GNUNET_JSON_pack_data_auto ("merchant_pub",
+ &deposit->merchant_pub),
+ GNUNET_JSON_pack_data_auto ("h_contract_terms",
+ &deposit->h_contract_terms),
+ GNUNET_JSON_pack_data_auto ("h_wire",
+ &deposit->h_wire),
+ GNUNET_JSON_pack_data_auto ("h_denom_pub",
+ &deposit->h_denom_pub),
+ GNUNET_JSON_pack_data_auto ("coin_sig",
+ &deposit->csig))))
{
GNUNET_break (0);
json_decref (history);
@@ -155,19 +154,19 @@ TEH_RESPONSE_compile_transaction_history (
if (0 !=
json_array_append_new (
history,
- json_pack ("{s:s, s:o, s:o, s:o, s:o, s:o}",
- "type",
- "MELT",
- "amount",
- TALER_JSON_from_amount (&melt->amount_with_fee),
- "melt_fee",
- TALER_JSON_from_amount (&melt->melt_fee),
- "rc",
- GNUNET_JSON_from_data_auto (&melt->rc),
- "h_denom_pub",
- GNUNET_JSON_from_data_auto (&melt->h_denom_pub),
- "coin_sig",
- GNUNET_JSON_from_data_auto (&melt->coin_sig))))
+ GNUNET_JSON_PACK (
+ GNUNET_JSON_pack_string ("type",
+ "MELT"),
+ TALER_JSON_pack_amount ("amount",
+ &melt->amount_with_fee),
+ TALER_JSON_pack_amount ("melt_fee",
+ &melt->melt_fee),
+ GNUNET_JSON_pack_data_auto ("rc",
+ &melt->rc),
+ GNUNET_JSON_pack_data_auto ("h_denom_pub",
+ &melt->h_denom_pub),
+ GNUNET_JSON_pack_data_auto ("coin_sig",
+ &melt->coin_sig))))
{
GNUNET_break (0);
json_decref (history);
@@ -216,22 +215,21 @@ TEH_RESPONSE_compile_transaction_history (
if (0 !=
json_array_append_new (
history,
- json_pack (
- "{s:s, s:o, s:o, s:o, s:o, s:I, s:o}",
- "type",
- "REFUND",
- "amount",
- TALER_JSON_from_amount (&value),
- "refund_fee",
- TALER_JSON_from_amount (&refund->refund_fee),
- "h_contract_terms",
- GNUNET_JSON_from_data_auto (&refund->h_contract_terms),
- "merchant_pub",
- GNUNET_JSON_from_data_auto (&refund->merchant_pub),
- "rtransaction_id",
- (json_int_t) refund->rtransaction_id,
- "merchant_sig",
- GNUNET_JSON_from_data_auto (&refund->merchant_sig))))
+ GNUNET_JSON_PACK (
+ GNUNET_JSON_pack_string ("type",
+ "REFUND"),
+ TALER_JSON_pack_amount ("amount",
+ &value),
+ TALER_JSON_pack_amount ("refund_fee",
+ &refund->refund_fee),
+ GNUNET_JSON_pack_data_auto ("h_contract_terms",
+ &refund->h_contract_terms),
+ GNUNET_JSON_pack_data_auto ("merchant_pub",
+ &refund->merchant_pub),
+ GNUNET_JSON_pack_uint64 ("rtransaction_id",
+ refund->rtransaction_id),
+ GNUNET_JSON_pack_data_auto ("merchant_sig",
+ &refund->merchant_sig))))
{
GNUNET_break (0);
json_decref (history);
@@ -269,23 +267,23 @@ TEH_RESPONSE_compile_transaction_history (
the denomination key's RSA signature over coin_pub, but as the
wallet should really already have this information (and cannot
check or do anything with it anyway if it doesn't), it seems
- strictly unnecessary. *///
+ strictly unnecessary. */
if (0 !=
json_array_append_new (
history,
- json_pack ("{s:s, s:o, s:o, s:o, s:o, s:o}",
- "type",
- "OLD-COIN-RECOUP",
- "amount",
- TALER_JSON_from_amount (&pr->value),
- "exchange_sig",
- GNUNET_JSON_from_data_auto (&esig),
- "exchange_pub",
- GNUNET_JSON_from_data_auto (&epub),
- "coin_pub",
- GNUNET_JSON_from_data_auto (&pr->coin.coin_pub),
- "timestamp",
- GNUNET_JSON_from_time_abs (pr->timestamp))))
+ GNUNET_JSON_PACK (
+ GNUNET_JSON_pack_string ("type",
+ "OLD-COIN-RECOUP"),
+ TALER_JSON_pack_amount ("amount",
+ &pr->value),
+ GNUNET_JSON_pack_data_auto ("exchange_sig",
+ &esig),
+ GNUNET_JSON_pack_data_auto ("exchange_pub",
+ &epub),
+ GNUNET_JSON_pack_data_auto ("coin_pub",
+ &pr->coin.coin_pub),
+ GNUNET_JSON_pack_time_abs ("timestamp",
+ pr->timestamp))))
{
GNUNET_break (0);
json_decref (history);
@@ -321,27 +319,27 @@ TEH_RESPONSE_compile_transaction_history (
if (0 !=
json_array_append_new (
history,
- json_pack ("{s:s, s:o, s:o, s:o, s:o, s:o, s:o, s:o, s:o, s:o}",
- "type",
- "RECOUP",
- "amount",
- TALER_JSON_from_amount (&recoup->value),
- "exchange_sig",
- GNUNET_JSON_from_data_auto (&esig),
- "exchange_pub",
- GNUNET_JSON_from_data_auto (&epub),
- "reserve_pub",
- GNUNET_JSON_from_data_auto (&recoup->reserve_pub),
- "h_denom_pub",
- GNUNET_JSON_from_data_auto (&recoup->h_denom_pub),
- "coin_sig",
- GNUNET_JSON_from_data_auto (&recoup->coin_sig),
- "coin_blind",
- GNUNET_JSON_from_data_auto (&recoup->coin_blind),
- "reserve_pub",
- GNUNET_JSON_from_data_auto (&recoup->reserve_pub),
- "timestamp",
- GNUNET_JSON_from_time_abs (recoup->timestamp))))
+ GNUNET_JSON_PACK (
+ GNUNET_JSON_pack_string ("type",
+ "RECOUP"),
+ TALER_JSON_pack_amount ("amount",
+ &recoup->value),
+ GNUNET_JSON_pack_data_auto ("exchange_sig",
+ &esig),
+ GNUNET_JSON_pack_data_auto ("exchange_pub",
+ &epub),
+ GNUNET_JSON_pack_data_auto ("reserve_pub",
+ &recoup->reserve_pub),
+ GNUNET_JSON_pack_data_auto ("h_denom_pub",
+ &recoup->h_denom_pub),
+ GNUNET_JSON_pack_data_auto ("coin_sig",
+ &recoup->coin_sig),
+ GNUNET_JSON_pack_data_auto ("coin_blind",
+ &recoup->coin_blind),
+ GNUNET_JSON_pack_data_auto ("reserve_pub",
+ &recoup->reserve_pub),
+ GNUNET_JSON_pack_time_abs ("timestamp",
+ recoup->timestamp))))
{
GNUNET_break (0);
json_decref (history);
diff --git a/src/include/taler_mhd_lib.h b/src/include/taler_mhd_lib.h
index 894a701c6..0e30d6600 100644
--- a/src/include/taler_mhd_lib.h
+++ b/src/include/taler_mhd_lib.h
@@ -142,6 +142,20 @@ TALER_MHD_reply_json_pack (struct MHD_Connection *connection,
/**
+ * Function to call to handle the request by building a JSON
+ * reply from varargs.
+ *
+ * @param connection the MHD connection to handle
+ * @param response_code HTTP response code to use
+ * @param ... varargs of JSON pack specification
+ * @return MHD result code
+ */
+#define TALER_MHD_REPLY_JSON_PACK(connection,response_code,...) \
+ TALER_MHD_reply_json (connection, GNUNET_JSON_PACK (__VA_ARGS__), \
+ response_code)
+
+
+/**
* Send a response indicating an error.
*
* @param connection the MHD connection to use
@@ -195,6 +209,16 @@ TALER_MHD_make_json_pack (const char *fmt,
/**
+ * Make JSON response object.
+ *
+ * @param ... varargs
+ * @return MHD response object
+ */
+#define TALER_MHD_MAKE_JSON_PACK(...) \
+ TALER_MHD_make_json (GNUNET_JSON_PACK (__VA_ARGS__))
+
+
+/**
* Create a response indicating an internal error.
*
* @param ec error code to return
diff --git a/src/mhd/mhd_responses.c b/src/mhd/mhd_responses.c
index 90a8d19f4..b666720e6 100644
--- a/src/mhd/mhd_responses.c
+++ b/src/mhd/mhd_responses.c
@@ -1,6 +1,6 @@
/*
This file is part of TALER
- Copyright (C) 2014-2020 Taler Systems SA
+ Copyright (C) 2014-2021 Taler Systems SA
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
@@ -32,12 +32,6 @@
static enum TALER_MHD_GlobalOptions TM_go;
-/**
- * Set global options for response generation
- * within libtalermhd.
- *
- * @param go global options to use
- */
void
TALER_MHD_setup (enum TALER_MHD_GlobalOptions go)
{
@@ -45,13 +39,6 @@ TALER_MHD_setup (enum TALER_MHD_GlobalOptions go)
}
-/**
- * Add headers we want to return in every response.
- * Useful for testing, like if we want to always close
- * connections.
- *
- * @param response response to modify
- */
void
TALER_MHD_add_global_headers (struct MHD_Response *response)
{
@@ -69,17 +56,6 @@ TALER_MHD_add_global_headers (struct MHD_Response *response)
}
-/**
- * Is HTTP body deflate compression supported by the client?
- *
- * @param connection connection to check
- * @return #MHD_YES if 'deflate' compression is allowed
- *
- * Note that right now we're ignoring q-values, which is technically
- * not correct, and also do not support "*" anywhere but in a line by
- * itself. This should eventually be fixed, see also
- * https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
- */
MHD_RESULT
TALER_MHD_can_compress (struct MHD_Connection *connection)
{
@@ -111,13 +87,6 @@ TALER_MHD_can_compress (struct MHD_Connection *connection)
}
-/**
- * Try to compress a response body. Updates @a buf and @a buf_size.
- *
- * @param[in,out] buf pointer to body to compress
- * @param[in,out] buf_size pointer to initial size of @a buf
- * @return #MHD_YES if @a buf was compressed
- */
MHD_RESULT
TALER_MHD_body_compress (void **buf,
size_t *buf_size)
@@ -148,12 +117,6 @@ TALER_MHD_body_compress (void **buf,
}
-/**
- * Make JSON response object.
- *
- * @param json the json object
- * @return MHD response object
- */
struct MHD_Response *
TALER_MHD_make_json (const json_t *json)
{
@@ -185,14 +148,6 @@ TALER_MHD_make_json (const json_t *json)
}
-/**
- * Send JSON object as response.
- *
- * @param connection the MHD connection
- * @param json the json object
- * @param response_code the http response code
- * @return MHD result code
- */
MHD_RESULT
TALER_MHD_reply_json (struct MHD_Connection *connection,
const json_t *json,
@@ -264,13 +219,6 @@ TALER_MHD_reply_json (struct MHD_Connection *connection,
}
-/**
- * Send back a "204 No Content" response with headers
- * for the CORS pre-flight request.
- *
- * @param connection the MHD connection
- * @return MHD result code
- */
MHD_RESULT
TALER_MHD_reply_cors_preflight (struct MHD_Connection *connection)
{
@@ -307,16 +255,6 @@ TALER_MHD_reply_cors_preflight (struct MHD_Connection *connection)
}
-/**
- * Function to call to handle the request by building a JSON
- * reply from a format string and varargs.
- *
- * @param connection the MHD connection to handle
- * @param response_code HTTP response code to use
- * @param fmt format string for pack
- * @param ... varargs
- * @return MHD result code
- */
MHD_RESULT
TALER_MHD_reply_json_pack (struct MHD_Connection *connection,
unsigned int response_code,
@@ -360,13 +298,6 @@ TALER_MHD_reply_json_pack (struct MHD_Connection *connection,
}
-/**
- * Make JSON response object.
- *
- * @param fmt format string for pack
- * @param ... varargs
- * @return MHD response object
- */
struct MHD_Response *
TALER_MHD_make_json_pack (const char *fmt,
...)
@@ -405,57 +336,34 @@ TALER_MHD_make_json_pack (const char *fmt,
}
-/**
- * Create a response indicating an internal error.
- *
- * @param ec error code to return
- * @param detail additional optional detail about the error, can be NULL
- * @return a MHD response object
- */
struct MHD_Response *
TALER_MHD_make_error (enum TALER_ErrorCode ec,
const char *detail)
{
- return TALER_MHD_make_json_pack ("{s:I, s:s, s:s?}",
- "code", (json_int_t) ec,
- "hint", TALER_ErrorCode_get_hint (ec),
- "detail", detail);
+ return TALER_MHD_make_JSON_PACK (
+ GNUNET_JSON_pack_uint64 ("code", ec),
+ GNUNET_JSON_pack_string ("hint", TALER_ErrorCode_get_hint (ec)),
+ GNUNET_JSON_pack_allow_null (
+ GNUNET_JSON_pack_string ("detail", detail)));
}
-/**
- * Send a response indicating an error.
- *
- * @param connection the MHD connection to use
- * @param ec error code uniquely identifying the error
- * @param http_status HTTP status code to use
- * @param detail additional optional detail about the error, can be NULL
- * @return a MHD result code
- */
MHD_RESULT
TALER_MHD_reply_with_error (struct MHD_Connection *connection,
unsigned int http_status,
enum TALER_ErrorCode ec,
const char *detail)
{
- return TALER_MHD_reply_json_pack (connection,
- http_status,
- "{s:I, s:s, s:s?}",
- "code", (json_int_t) ec,
- "hint", TALER_ErrorCode_get_hint (ec),
- "detail", detail);
+ return TALER_MHD_reply_JSON_PACK (
+ connection,
+ http_status,
+ GNUNET_JSON_pack_uint64 ("code", ec),
+ GNUNET_JSON_pack_string ("hint", TALER_ErrorCode_get_hint (ec)),
+ GNUNET_JSON_pack_allow_null (
+ GNUNET_JSON_pack_string ("detail", detail)));
}
-/**
- * Send a response indicating an error. The HTTP status code is
- * to be derived from the @a ec.
- *
- * @param connection the MHD connection to use
- * @param ec error code uniquely identifying the error
- * @param detail additional optional detail about the error
- * @return a MHD result code
- */
MHD_RESULT
TALER_MHD_reply_with_ec (struct MHD_Connection *connection,
enum TALER_ErrorCode ec,
@@ -478,12 +386,6 @@ TALER_MHD_reply_with_ec (struct MHD_Connection *connection,
}
-/**
- * Send a response indicating that the request was too big.
- *
- * @param connection the MHD connection to use
- * @return a MHD result code
- */
MHD_RESULT
TALER_MHD_reply_request_too_large (struct MHD_Connection *connection)
{
@@ -508,14 +410,6 @@ TALER_MHD_reply_request_too_large (struct MHD_Connection *connection)
}
-/**
- * Function to call to handle the request by sending
- * back a redirect to the AGPL source code.
- *
- * @param connection the MHD connection to handle
- * @param url where to redirect for the sources
- * @return MHD result code
- */
MHD_RESULT
TALER_MHD_reply_agpl (struct MHD_Connection *connection,
const char *url)
@@ -559,17 +453,6 @@ TALER_MHD_reply_agpl (struct MHD_Connection *connection,
}
-/**
- * Function to call to handle the request by sending
- * back static data.
- *
- * @param connection the MHD connection to handle
- * @param http_status status code to return
- * @param mime_type content-type to use
- * @param body response payload
- * @param body_size number of bytes in @a body
- * @return MHD result code
- */
MHD_RESULT
TALER_MHD_reply_static (struct MHD_Connection *connection,
unsigned int http_status,