aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2023-05-06 20:55:40 +0200
committerChristian Grothoff <christian@grothoff.org>2023-05-06 20:55:40 +0200
commit404b2b78f187e3da2fedee5748b9bfcdfa4a105c (patch)
treef774b8ca0ea11d8886c7ff02f024c9588bbeef74
parent1f9427e1d9672b93577aea4c9d5a63575ee0b525 (diff)
downloadexchange-404b2b78f187e3da2fedee5748b9bfcdfa4a105c.tar.xz
add convenience function TALER_TEMPLATING_reply_error
-rw-r--r--src/include/taler_templating_lib.h20
-rw-r--r--src/mhd/mhd_parsing.c11
-rw-r--r--src/templating/templating_api.c39
3 files changed, 69 insertions, 1 deletions
diff --git a/src/include/taler_templating_lib.h b/src/include/taler_templating_lib.h
index 53946b9c0..ebda2ecf3 100644
--- a/src/include/taler_templating_lib.h
+++ b/src/include/taler_templating_lib.h
@@ -91,6 +91,26 @@ TALER_TEMPLATING_reply (struct MHD_Connection *connection,
const char *taler_uri,
const json_t *root);
+
+/**
+ * Load a @a template and substitute an error message based on @a ec and @a
+ * detail, returning the result to the @a connection with the given @a
+ * http_status code.
+ *
+ * @param connection the connection we act upon
+ * @param template basename of the template to load
+ * @param http_status code to use on success
+ * @param ec error code to return
+ * @param detail optional text to add to the template
+ * @return #MHD_YES on success, #MHD_NO to just close the connection
+ */
+MHD_RESULT
+TALER_TEMPLATING_reply_error (struct MHD_Connection *connection,
+ const char *template_basename,
+ unsigned int http_status,
+ enum TALER_ErrorCode ec,
+ const char *detail);
+
/**
* Preload templates.
*
diff --git a/src/mhd/mhd_parsing.c b/src/mhd/mhd_parsing.c
index b047df7d3..9e3cb5714 100644
--- a/src/mhd/mhd_parsing.c
+++ b/src/mhd/mhd_parsing.c
@@ -364,7 +364,16 @@ TALER_MHD_check_content_length_ (struct MHD_Connection *connection,
MHD_HEADER_KIND,
MHD_HTTP_HEADER_CONTENT_LENGTH);
if (NULL == cl)
- return GNUNET_OK;
+ {
+ GNUNET_break_op (0);
+ return (MHD_YES ==
+ TALER_MHD_reply_with_error (connection,
+ MHD_HTTP_BAD_REQUEST,
+ TALER_EC_GENERIC_PARAMETER_MISSING,
+ MHD_HTTP_HEADER_CONTENT_LENGTH))
+ ? GNUNET_NO
+ : GNUNET_SYSERR;
+ }
if (1 != sscanf (cl,
"%llu%c",
&cv,
diff --git a/src/templating/templating_api.c b/src/templating/templating_api.c
index 324e199eb..dba042e5d 100644
--- a/src/templating/templating_api.c
+++ b/src/templating/templating_api.c
@@ -428,6 +428,45 @@ load_template (void *cls,
}
+MHD_RESULT
+TALER_TEMPLATING_reply_error (struct MHD_Connection *connection,
+ const char *template_basename,
+ unsigned int http_status,
+ enum TALER_ErrorCode ec,
+ const char *detail)
+{
+ json_t *data;
+ enum GNUNET_GenericReturnValue ret;
+
+ data = GNUNET_JSON_PACK (
+ GNUNET_JSON_pack_uint64 ("ec",
+ ec),
+ GNUNET_JSON_pack_string ("hint",
+ TALER_ErrorCode_get_hint (ec)),
+ GNUNET_JSON_pack_string ("detail",
+ detail)
+ );
+ ret = TALER_TEMPLATING_reply (connection,
+ http_status,
+ template_basename,
+ NULL,
+ NULL,
+ data);
+ json_decref (data);
+ switch (ret)
+ {
+ case GNUNET_OK:
+ return MHD_YES;
+ case GNUNET_NO:
+ return MHD_YES;
+ case GNUNET_SYSERR:
+ return MHD_NO;
+ }
+ GNUNET_assert (0);
+ return MHD_NO;
+}
+
+
enum GNUNET_GenericReturnValue
TALER_TEMPLATING_init (const char *subsystem)
{