gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-exchange] branch master updated: nicer generic error reporting lo


From: gnunet
Subject: [taler-exchange] branch master updated: nicer generic error reporting logic, for #6432
Date: Tue, 25 Aug 2020 15:11:59 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new 4bba7263 nicer generic error reporting logic, for #6432
4bba7263 is described below

commit 4bba7263564303f45eed86cc68e54bbbf00856a6
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Tue Aug 25 15:11:56 2020 +0200

    nicer generic error reporting logic, for #6432
---
 contrib/gana                                       |  2 +-
 .../taler-auditor-httpd_deposit-confirmation.c     | 12 ++--
 src/auditor/taler-auditor-httpd_exchanges.c        |  4 +-
 src/bank-lib/fakebank.c                            | 17 +++--
 src/exchange/taler-exchange-httpd.c                | 10 +--
 src/exchange/taler-exchange-httpd_db.c             | 12 ++--
 src/exchange/taler-exchange-httpd_deposit.c        | 24 +++----
 src/exchange/taler-exchange-httpd_deposits_get.c   | 16 ++---
 src/exchange/taler-exchange-httpd_keystate.c       | 10 +--
 src/exchange/taler-exchange-httpd_link.c           |  6 +-
 src/exchange/taler-exchange-httpd_melt.c           | 61 ++++++++---------
 src/exchange/taler-exchange-httpd_recoup.c         | 22 +++---
 .../taler-exchange-httpd_refreshes_reveal.c        | 53 +++++++--------
 src/exchange/taler-exchange-httpd_refund.c         | 54 +++++++++------
 src/exchange/taler-exchange-httpd_reserves_get.c   | 16 ++---
 src/exchange/taler-exchange-httpd_responses.c      |  6 +-
 src/exchange/taler-exchange-httpd_transfers_get.c  | 12 ++--
 src/exchange/taler-exchange-httpd_withdraw.c       | 48 ++++++-------
 src/include/taler_mhd_lib.h                        |  8 +--
 src/json/json.c                                    |  3 +-
 src/mhd/mhd_legal.c                                |  1 +
 src/mhd/mhd_parsing.c                              | 78 +++++++++++-----------
 src/mhd/mhd_responses.c                            | 18 ++---
 23 files changed, 258 insertions(+), 235 deletions(-)

diff --git a/contrib/gana b/contrib/gana
index bc9def46..4c0be7d5 160000
--- a/contrib/gana
+++ b/contrib/gana
@@ -1 +1 @@
-Subproject commit bc9def4616494c85af54418bb11193c42f087634
+Subproject commit 4c0be7d53a083926c2dcc8e3781d650243466e89
diff --git a/src/auditor/taler-auditor-httpd_deposit-confirmation.c 
b/src/auditor/taler-auditor-httpd_deposit-confirmation.c
index e60e5c02..7ee5ead4 100644
--- a/src/auditor/taler-auditor-httpd_deposit-confirmation.c
+++ b/src/auditor/taler-auditor-httpd_deposit-confirmation.c
@@ -86,7 +86,7 @@ verify_and_execute_deposit_confirmation (
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_FORBIDDEN,
                                        
TALER_EC_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID,
-                                       "master_sig (expired)");
+                                       "master signature expired");
   }
 
   /* check our cache */
@@ -105,7 +105,7 @@ verify_and_execute_deposit_confirmation (
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
                                        TALER_EC_DB_SETUP_FAILED,
-                                       "failed to establish session with 
database");
+                                       NULL);
   }
   if (! cached)
   {
@@ -120,7 +120,7 @@ verify_and_execute_deposit_confirmation (
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_FORBIDDEN,
                                          
TALER_EC_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID,
-                                         "master_sig");
+                                         "master signature invalid");
     }
 
     /* execute transaction */
@@ -134,7 +134,7 @@ verify_and_execute_deposit_confirmation (
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_INTERNAL_SERVER_ERROR,
                                          
TALER_EC_AUDITOR_EXCHANGE_STORE_DB_ERROR,
-                                         "failed to persist exchange signing 
key");
+                                         NULL);
     }
 
     /* Cache it, due to concurreny it might already be in the cache,
@@ -174,7 +174,7 @@ verify_and_execute_deposit_confirmation (
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_FORBIDDEN,
                                          
TALER_EC_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID,
-                                         "exchange_sig");
+                                         "exchange signature invalid");
     }
   }
 
@@ -189,7 +189,7 @@ verify_and_execute_deposit_confirmation (
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
                                        
TALER_EC_DEPOSIT_CONFIRMATION_STORE_DB_ERROR,
-                                       "failed to persist deposit-confirmation 
data");
+                                       NULL);
   }
   return TALER_MHD_reply_json_pack (connection,
                                     MHD_HTTP_OK,
diff --git a/src/auditor/taler-auditor-httpd_exchanges.c 
b/src/auditor/taler-auditor-httpd_exchanges.c
index f117b608..ffa215ec 100644
--- a/src/auditor/taler-auditor-httpd_exchanges.c
+++ b/src/auditor/taler-auditor-httpd_exchanges.c
@@ -90,7 +90,7 @@ TAH_EXCHANGES_handler (struct TAH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
                                        TALER_EC_DB_SETUP_FAILED,
-                                       "failed to establish session with 
database");
+                                       NULL);
   }
   ja = json_array ();
   GNUNET_break (NULL != ja);
@@ -106,7 +106,7 @@ TAH_EXCHANGES_handler (struct TAH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
                                        TALER_EC_LIST_EXCHANGES_DB_ERROR,
-                                       "Could not fetch exchange list from 
database");
+                                       NULL);
   }
   return TALER_MHD_reply_json_pack (connection,
                                     MHD_HTTP_OK,
diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c
index 699acb51..990052e8 100644
--- a/src/bank-lib/fakebank.c
+++ b/src/bank-lib/fakebank.c
@@ -760,14 +760,19 @@ handle_transfer (struct TALER_FAKEBANK_Handle *h,
                                           &row_id);
       if (GNUNET_OK != ret)
       {
+        MHD_RESULT res;
+        char *uids;
+
         GNUNET_break (0);
+        uids = GNUNET_STRINGS_data_to_string_alloc (&uuid,
+                                                    sizeof (uuid));
         json_decref (json);
-        return TALER_MHD_reply_with_error (connection,
-                                           MHD_HTTP_CONFLICT,
-                                           
TALER_EC_BANK_TRANSFER_REQUEST_UID_REUSED,
-                                           "transfer request UID was reused");
-
-
+        res = TALER_MHD_reply_with_error (connection,
+                                          MHD_HTTP_CONFLICT,
+                                          
TALER_EC_BANK_TRANSFER_REQUEST_UID_REUSED,
+                                          uids);
+        GNUNET_free (uids);
+        return res;
       }
       GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                   "Receiving incoming wire transfer: %s->%s, subject: %s, 
amount: %s, from %s\n",
diff --git a/src/exchange/taler-exchange-httpd.c 
b/src/exchange/taler-exchange-httpd.c
index 73cc3530..bc6ab23b 100644
--- a/src/exchange/taler-exchange-httpd.c
+++ b/src/exchange/taler-exchange-httpd.c
@@ -236,7 +236,7 @@ handle_post_coins (const struct TEH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_COINS_INVALID_COIN_PUB,
-                                       "coin public key malformed");
+                                       args[0]);
   }
   for (unsigned int i = 0; NULL != h[i].op; i++)
     if (0 == strcmp (h[i].op,
@@ -247,7 +247,7 @@ handle_post_coins (const struct TEH_RequestHandler *rh,
   return TALER_MHD_reply_with_error (connection,
                                      MHD_HTTP_NOT_FOUND,
                                      TALER_EC_OPERATION_UNKNOWN,
-                                     "requested operation on coin unknown");
+                                     args[1]);
 }
 
 
@@ -331,7 +331,7 @@ proceed_with_handler (const struct TEH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_URI_TOO_LONG,
                                        TALER_EC_URI_TOO_LONG,
-                                       "The URI given is too long");
+                                       url);
   }
 
   /* All POST endpoints come with a body in JSON format. So we parse
@@ -745,7 +745,7 @@ handle_mhd_request (void *cls,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_METHOD_NOT_ALLOWED,
                                          TALER_EC_METHOD_INVALID,
-                                         "The HTTP method used is invalid for 
this URL");
+                                         method);
     }
   }
 
@@ -756,7 +756,7 @@ handle_mhd_request (void *cls,
     ret = TALER_MHD_reply_with_error (connection,
                                       MHD_HTTP_NOT_FOUND,
                                       TALER_EC_ENDPOINT_UNKNOWN,
-                                      "No handler found for the given URL");
+                                      url);
     GNUNET_async_scope_restore (&old_scope);
     return ret;
   }
diff --git a/src/exchange/taler-exchange-httpd_db.c 
b/src/exchange/taler-exchange-httpd_db.c
index b0e49522..505cf3d9 100644
--- a/src/exchange/taler-exchange-httpd_db.c
+++ b/src/exchange/taler-exchange-httpd_db.c
@@ -74,7 +74,7 @@ TEH_make_coin_known (const struct TALER_CoinPublicInfo *coin,
       = TALER_MHD_reply_with_error (connection,
                                     MHD_HTTP_INTERNAL_SERVER_ERROR,
                                     TALER_EC_DB_COIN_HISTORY_STORE_ERROR,
-                                    "could not persist coin data");
+                                    NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   case TALER_EXCHANGEDB_CKS_CONFLICT:
     break;
@@ -96,7 +96,7 @@ TEH_make_coin_known (const struct TALER_CoinPublicInfo *coin,
           connection,
           MHD_HTTP_INTERNAL_SERVER_ERROR,
           TALER_EC_DEPOSIT_HISTORY_DB_ERROR,
-          "could not fetch coin transaction history");
+          NULL);
       return qs;
     }
     *mhd_ret
@@ -146,7 +146,7 @@ TEH_DB_run_transaction (struct MHD_Connection *connection,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              TALER_EC_DB_SETUP_FAILED,
-                                             "could not establish database 
session");
+                                             NULL);
     return GNUNET_SYSERR;
   }
   for (unsigned int retries = 0;
@@ -165,7 +165,7 @@ TEH_DB_run_transaction (struct MHD_Connection *connection,
         *mhd_ret = TALER_MHD_reply_with_error (connection,
                                                MHD_HTTP_INTERNAL_SERVER_ERROR,
                                                TALER_EC_DB_START_FAILED,
-                                               "could not begin transaction");
+                                               NULL);
       return GNUNET_SYSERR;
     }
     qs = cb (cb_cls,
@@ -186,7 +186,7 @@ TEH_DB_run_transaction (struct MHD_Connection *connection,
         *mhd_ret = TALER_MHD_reply_with_error (connection,
                                                MHD_HTTP_INTERNAL_SERVER_ERROR,
                                                TALER_EC_DB_COMMIT_FAILED_HARD,
-                                               "could not commit database 
transaction");
+                                               NULL);
       return GNUNET_SYSERR;
     }
     /* make sure callback did not violate invariants! */
@@ -202,7 +202,7 @@ TEH_DB_run_transaction (struct MHD_Connection *connection,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            TALER_EC_DB_COMMIT_FAILED_ON_RETRY,
-                                           "repatedly failed to serialize 
database transaction");
+                                           NULL);
   return GNUNET_SYSERR;
 }
 
diff --git a/src/exchange/taler-exchange-httpd_deposit.c 
b/src/exchange/taler-exchange-httpd_deposit.c
index 0b810220..25c3d80c 100644
--- a/src/exchange/taler-exchange-httpd_deposit.c
+++ b/src/exchange/taler-exchange-httpd_deposit.c
@@ -161,7 +161,7 @@ deposit_precheck (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              TALER_EC_DEPOSIT_HISTORY_DB_ERROR,
-                                             "Could not check for existing 
identical deposit");
+                                             NULL);
       return GNUNET_DB_STATUS_HARD_ERROR;
     }
     return qs;
@@ -255,7 +255,7 @@ deposit_transaction (void *cls,
           connection,
           MHD_HTTP_INTERNAL_SERVER_ERROR,
           TALER_EC_DEPOSIT_HISTORY_DB_ERROR,
-          "could not fetch coin transaction history");
+          NULL);
       return qs;
     }
     if (GNUNET_OK !=
@@ -269,7 +269,7 @@ deposit_transaction (void *cls,
         connection,
         MHD_HTTP_INTERNAL_SERVER_ERROR,
         TALER_EC_DEPOSIT_HISTORY_DB_ERROR,
-        "could not calculate historic coin amount total");
+        NULL);
       return GNUNET_DB_STATUS_HARD_ERROR;
     }
     /* Check that cost of all transactions (including the current one) is
@@ -301,7 +301,7 @@ deposit_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            TALER_EC_DEPOSIT_STORE_DB_ERROR,
-                                           "Could not persist /deposit data");
+                                           NULL);
   }
   return qs;
 }
@@ -382,7 +382,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        
TALER_EC_DEPOSIT_REFUND_DEADLINE_AFTER_WIRE_DEADLINE,
-                                       "refund_deadline");
+                                       NULL);
   }
   if (GNUNET_OK !=
       TALER_JSON_merchant_wire_signature_hash (wire,
@@ -394,7 +394,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        
TALER_EC_DEPOSIT_INVALID_WIRE_FORMAT_JSON,
-                                       "wire");
+                                       NULL);
   }
   if (0 != GNUNET_memcmp (&deposit.h_wire,
                           &my_h_wire))
@@ -404,7 +404,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        
TALER_EC_DEPOSIT_INVALID_WIRE_FORMAT_CONTRACT_HASH_CONFLICT,
-                                       "h_wire");
+                                       NULL);
   }
 
   /* Check for idempotency: did we get this request before? */
@@ -457,7 +457,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
       return TALER_MHD_reply_with_error (connection,
                                          hc,
                                          ec,
-                                         "Could not find denomination key used 
in deposit");
+                                         NULL);
     }
     TALER_amount_ntoh (&deposit.deposit_fee,
                        &dki->issue.properties.fee_deposit);
@@ -471,7 +471,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_BAD_REQUEST,
                                          TALER_EC_DEPOSIT_CURRENCY_MISMATCH,
-                                         "contribution");
+                                         deposit.deposit_fee.currency);
     }
     /* check coin signature */
     if (GNUNET_YES !=
@@ -484,7 +484,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_UNAUTHORIZED,
                                          
TALER_EC_DEPOSIT_DENOMINATION_SIGNATURE_INVALID,
-                                         "ub_sig");
+                                         NULL);
     }
     TALER_amount_ntoh (&dc.value,
                        &dki->issue.properties.value);
@@ -498,7 +498,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        
TALER_EC_DEPOSIT_NEGATIVE_VALUE_AFTER_FEE,
-                                       "deposited amount smaller than 
depositing fee");
+                                       NULL);
   }
 
   /* check deposit signature */
@@ -530,7 +530,7 @@ TEH_handler_deposit (struct MHD_Connection *connection,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_UNAUTHORIZED,
                                          
TALER_EC_DEPOSIT_COIN_SIGNATURE_INVALID,
-                                         "coin_sig");
+                                         NULL);
     }
   }
 
diff --git a/src/exchange/taler-exchange-httpd_deposits_get.c 
b/src/exchange/taler-exchange-httpd_deposits_get.c
index a2226b7e..983177aa 100644
--- a/src/exchange/taler-exchange-httpd_deposits_get.c
+++ b/src/exchange/taler-exchange-httpd_deposits_get.c
@@ -234,7 +234,7 @@ deposits_get_transaction (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              
TALER_EC_DEPOSITS_GET_DB_FETCH_FAILED,
-                                             "failed to fetch transaction 
data");
+                                             NULL);
     }
     return qs;
   }
@@ -243,7 +243,7 @@ deposits_get_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_NOT_FOUND,
                                            TALER_EC_DEPOSITS_GET_NOT_FOUND,
-                                           "transaction unknown");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
   return qs;
@@ -289,7 +289,7 @@ handle_track_transaction_request (
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
                                        
TALER_EC_DEPOSITS_GET_DB_FEE_INCONSISTENT,
-                                       "fees are inconsistent");
+                                       NULL);
   return reply_deposit_details (connection,
                                 &tps->h_contract_terms,
                                 &tps->h_wire,
@@ -333,7 +333,7 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler 
*rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_DEPOSITS_INVALID_H_WIRE,
-                                       "wire hash malformed");
+                                       args[0]);
   }
   if (GNUNET_OK !=
       GNUNET_STRINGS_string_to_data (args[1],
@@ -345,7 +345,7 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler 
*rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_DEPOSITS_INVALID_MERCHANT_PUB,
-                                       "merchant public key malformed");
+                                       args[1]);
   }
   if (GNUNET_OK !=
       GNUNET_STRINGS_string_to_data (args[2],
@@ -357,7 +357,7 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler 
*rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        
TALER_EC_DEPOSITS_INVALID_H_CONTRACT_TERMS,
-                                       "contract terms hash malformed");
+                                       args[2]);
   }
   if (GNUNET_OK !=
       GNUNET_STRINGS_string_to_data (args[3],
@@ -369,7 +369,7 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler 
*rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_DEPOSITS_INVALID_COIN_PUB,
-                                       "coin public key malformed");
+                                       args[3]);
   }
   res = TALER_MHD_parse_request_arg_data (connection,
                                           "merchant_sig",
@@ -389,7 +389,7 @@ TEH_handler_deposits_get (const struct TEH_RequestHandler 
*rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_FORBIDDEN,
                                        
TALER_EC_DEPOSITS_GET_MERCHANT_SIGNATURE_INVALID,
-                                       "merchant_sig");
+                                       NULL);
   }
 
   return handle_track_transaction_request (connection,
diff --git a/src/exchange/taler-exchange-httpd_keystate.c 
b/src/exchange/taler-exchange-httpd_keystate.c
index 4439bb94..7f0f2012 100644
--- a/src/exchange/taler-exchange-httpd_keystate.c
+++ b/src/exchange/taler-exchange-httpd_keystate.c
@@ -2502,7 +2502,7 @@ TEH_handler_keys (const struct TEH_RequestHandler *rh,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_BAD_REQUEST,
                                          TALER_EC_KEYS_HAVE_NOT_NUMERIC,
-                                         "last_issue_date");
+                                         have_cherrypick);
     }
     /* The following multiplication may overflow; but this should not really
        be a problem, as giving back 'older' data than what the client asks for
@@ -2531,7 +2531,7 @@ TEH_handler_keys (const struct TEH_RequestHandler *rh,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_FORBIDDEN,
                                          TALER_EC_KEYS_HAVE_NOT_NUMERIC,
-                                         "now");
+                                         have_fakenow);
     }
     if (TEH_allow_keys_timetravel)
     {
@@ -2547,7 +2547,7 @@ TEH_handler_keys (const struct TEH_RequestHandler *rh,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_BAD_REQUEST,
                                          TALER_EC_KEYS_TIMETRAVEL_FORBIDDEN,
-                                         "timetravel not allowed by this 
exchange");
+                                         NULL);
     }
   }
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
@@ -2567,7 +2567,7 @@ TEH_handler_keys (const struct TEH_RequestHandler *rh,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_INTERNAL_SERVER_ERROR,
                                          TALER_EC_EXCHANGE_BAD_CONFIGURATION,
-                                         "no keys for requested time");
+                                         NULL);
     }
     krd = bsearch (&last_issue_date,
                    key_state->krd_array,
@@ -2599,7 +2599,7 @@ TEH_handler_keys (const struct TEH_RequestHandler *rh,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_INTERNAL_SERVER_ERROR,
                                          TALER_EC_KEYS_MISSING,
-                                         "no key response found");
+                                         NULL);
     }
     ret = MHD_queue_response (connection,
                               MHD_HTTP_OK,
diff --git a/src/exchange/taler-exchange-httpd_link.c 
b/src/exchange/taler-exchange-httpd_link.c
index 948c8eb0..3611db50 100644
--- a/src/exchange/taler-exchange-httpd_link.c
+++ b/src/exchange/taler-exchange-httpd_link.c
@@ -157,7 +157,7 @@ link_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            ctx->ec,
-                                           "coin_pub");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
   if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
@@ -165,7 +165,7 @@ link_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_NOT_FOUND,
                                            TALER_EC_LINK_COIN_UNKNOWN,
-                                           "coin_pub");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
   return qs;
@@ -202,7 +202,7 @@ TEH_handler_link (const struct TEH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_COINS_INVALID_COIN_PUB,
-                                       "coin public key malformed");
+                                       args[0]);
   }
   ctx.mlist = json_array ();
   if (NULL == ctx.mlist)
diff --git a/src/exchange/taler-exchange-httpd_melt.c 
b/src/exchange/taler-exchange-httpd_melt.c
index 35cd2359..4f5f4ceb 100644
--- a/src/exchange/taler-exchange-httpd_melt.c
+++ b/src/exchange/taler-exchange-httpd_melt.c
@@ -64,25 +64,25 @@ reply_melt_insufficient_funds (
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
                                        
TALER_EC_MELT_HISTORY_DB_ERROR_INSUFFICIENT_FUNDS,
-                                       "Failed to compile transaction 
history");
-  return TALER_MHD_reply_json_pack (connection,
-                                    MHD_HTTP_CONFLICT,
-                                    "{s:s, s:I, s:o, s:o, s:o, s:o, s:o}",
-                                    "hint",
-                                    "insufficient funds",
-                                    "code",
-                                    (json_int_t)
-                                    TALER_EC_MELT_INSUFFICIENT_FUNDS,
-                                    "coin_pub",
-                                    GNUNET_JSON_from_data_auto (coin_pub),
-                                    "original_value",
-                                    TALER_JSON_from_amount (coin_value),
-                                    "residual_value",
-                                    TALER_JSON_from_amount (residual),
-                                    "requested_value",
-                                    TALER_JSON_from_amount (requested),
-                                    "history",
-                                    history);
+                                       NULL);
+  return TALER_MHD_reply_json_pack (
+    connection,
+    MHD_HTTP_CONFLICT,
+    "{s:s, s:I, s:o, s:o, s:o, s:o, s:o}",
+    TALER_ErrorCode_get_hint (TALER_EC_MELT_INSUFFICIENT_FUNDS),
+    "code",
+    (json_int_t)
+    TALER_EC_MELT_INSUFFICIENT_FUNDS,
+    "coin_pub",
+    GNUNET_JSON_from_data_auto (coin_pub),
+    "original_value",
+    TALER_JSON_from_amount (coin_value),
+    "residual_value",
+    TALER_JSON_from_amount (residual),
+    "requested_value",
+    TALER_JSON_from_amount (requested),
+    "history",
+    history);
 }
 
 
@@ -202,7 +202,7 @@ refresh_check_melt (struct MHD_Connection *connection,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              TALER_EC_MELT_DB_FETCH_ERROR,
-                                             "failed to fetch old coin 
history");
+                                             NULL);
     return qs;
   }
   if (rmc->zombie_required)
@@ -229,7 +229,7 @@ refresh_check_melt (struct MHD_Connection *connection,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_BAD_REQUEST,
                                              
TALER_EC_MELT_COIN_EXPIRED_NO_ZOMBIE,
-                                             "denomination expired");
+                                             NULL);
       return GNUNET_DB_STATUS_HARD_ERROR;
     }
   }
@@ -244,7 +244,7 @@ refresh_check_melt (struct MHD_Connection *connection,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            
TALER_EC_MELT_COIN_HISTORY_COMPUTATION_FAILED,
-                                           "failed to compute coin transaction 
history");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
 
@@ -341,7 +341,7 @@ melt_transaction (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              TALER_EC_MELT_DB_FETCH_ERROR,
-                                             "failed to fetch melt index");
+                                             NULL);
     return qs;
   }
 
@@ -367,7 +367,7 @@ melt_transaction (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              
TALER_EC_MELT_DB_STORE_SESSION_ERROR,
-                                             "failed to persist melt data");
+                                             NULL);
       return GNUNET_DB_STATUS_HARD_ERROR;
     }
     return qs;
@@ -417,7 +417,7 @@ handle_melt (struct MHD_Connection *connection,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_FORBIDDEN,
                                          TALER_EC_MELT_COIN_SIGNATURE_INVALID,
-                                         "confirm_sig");
+                                         NULL);
     }
   }
 
@@ -509,7 +509,7 @@ check_for_denomination_key (struct MHD_Connection 
*connection,
           return TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              TALER_EC_MELT_DB_FETCH_ERROR,
-                                             "failed to find information about 
old coin");
+                                             NULL);
         }
         /* sanity check */
         GNUNET_break (0 ==
@@ -549,7 +549,7 @@ check_for_denomination_key (struct MHD_Connection 
*connection,
       return TALER_MHD_reply_with_error (connection,
                                          hc,
                                          ec,
-                                         "unknown denomination");
+                                         NULL);
     }
 
     TALER_amount_ntoh (&rmc->coin_refresh_fee,
@@ -566,7 +566,8 @@ check_for_denomination_key (struct MHD_Connection 
*connection,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_BAD_REQUEST,
                                          TALER_EC_MELT_CURRENCY_MISMATCH,
-                                         "value_with_fee");
+                                         rmc->refresh_session.amount_with_fee.
+                                         currency);
 
     }
     /* check coin is actually properly signed */
@@ -579,7 +580,7 @@ check_for_denomination_key (struct MHD_Connection 
*connection,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_FORBIDDEN,
                                          
TALER_EC_MELT_DENOMINATION_SIGNATURE_INVALID,
-                                         "denom_sig");
+                                         NULL);
     }
   }
   TEH_KS_release (key_state);
@@ -593,7 +594,7 @@ check_for_denomination_key (struct MHD_Connection 
*connection,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_MELT_FEES_EXCEED_CONTRIBUTION,
-                                       "melt amount smaller than melting fee");
+                                       NULL);
   }
   return handle_melt (connection,
                       rmc);
diff --git a/src/exchange/taler-exchange-httpd_recoup.c 
b/src/exchange/taler-exchange-httpd_recoup.c
index e53c1d9d..74d72565 100644
--- a/src/exchange/taler-exchange-httpd_recoup.c
+++ b/src/exchange/taler-exchange-httpd_recoup.c
@@ -156,7 +156,7 @@ recoup_transaction (void *cls,
         *mhd_ret = TALER_MHD_reply_with_error (connection,
                                                MHD_HTTP_INTERNAL_SERVER_ERROR,
                                                TALER_EC_RECOUP_DB_FETCH_FAILED,
-                                               "failed to fetch old coin of 
blind coin");
+                                               NULL);
       }
       return qs;
     }
@@ -175,7 +175,7 @@ recoup_transaction (void *cls,
         *mhd_ret = TALER_MHD_reply_with_error (connection,
                                                MHD_HTTP_INTERNAL_SERVER_ERROR,
                                                TALER_EC_RECOUP_DB_FETCH_FAILED,
-                                               "failed to fetch reserve of 
blinded coin");
+                                               NULL);
       }
       return qs;
     }
@@ -188,7 +188,7 @@ recoup_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_NOT_FOUND,
                                            TALER_EC_RECOUP_WITHDRAW_NOT_FOUND,
-                                           "envelope unknown");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
 
@@ -206,7 +206,7 @@ recoup_transaction (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              TALER_EC_RECOUP_DB_FETCH_FAILED,
-                                             "failed to fetch coin transaction 
history");
+                                             NULL);
     }
     return qs;
   }
@@ -241,7 +241,7 @@ recoup_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            TALER_EC_RECOUP_HISTORY_DB_ERROR,
-                                           "failed to calculate old coin 
transaction history");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
@@ -261,7 +261,7 @@ recoup_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            
TALER_EC_RECOUP_COIN_BALANCE_NEGATIVE,
-                                           "calculated negative coin balance");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
   if ( (0 == pc->amount.fraction) &&
@@ -328,7 +328,7 @@ recoup_transaction (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              TALER_EC_RECOUP_DB_PUT_FAILED,
-                                             "failed to persist recoup data");
+                                             NULL);
     }
     return qs;
   }
@@ -392,7 +392,7 @@ verify_and_execute_recoup (struct MHD_Connection 
*connection,
       return TALER_MHD_reply_with_error (connection,
                                          hc,
                                          ec,
-                                         "denomination not valid for recoup");
+                                         NULL);
     }
     TALER_amount_ntoh (&pc.value,
                        &dki->issue.properties.value);
@@ -407,7 +407,7 @@ verify_and_execute_recoup (struct MHD_Connection 
*connection,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_FORBIDDEN,
                                          
TALER_EC_RECOUP_DENOMINATION_SIGNATURE_INVALID,
-                                         "denom_sig");
+                                         NULL);
     }
 
     /* check recoup request signature */
@@ -431,7 +431,7 @@ verify_and_execute_recoup (struct MHD_Connection 
*connection,
         return TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_FORBIDDEN,
                                            TALER_EC_RECOUP_SIGNATURE_INVALID,
-                                           "coin_sig");
+                                           NULL);
       }
     }
     GNUNET_CRYPTO_hash (&coin->coin_pub.eddsa_pub,
@@ -449,7 +449,7 @@ verify_and_execute_recoup (struct MHD_Connection 
*connection,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_INTERNAL_SERVER_ERROR,
                                          TALER_EC_RECOUP_BLINDING_FAILED,
-                                         "coin_bks");
+                                         NULL);
     }
     TEH_KS_release (key_state);
   }
diff --git a/src/exchange/taler-exchange-httpd_refreshes_reveal.c 
b/src/exchange/taler-exchange-httpd_refreshes_reveal.c
index e752ce96..09d1a67b 100644
--- a/src/exchange/taler-exchange-httpd_refreshes_reveal.c
+++ b/src/exchange/taler-exchange-httpd_refreshes_reveal.c
@@ -257,7 +257,7 @@ refreshes_reveal_preflight (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            
TALER_EC_REVEAL_DB_FETCH_REVEAL_ERROR,
-                                           "failed to fetch reveal data");
+                                           NULL);
     rctx->preflight_ok = GNUNET_SYSERR;
     return GNUNET_DB_STATUS_HARD_ERROR;
   case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
@@ -309,7 +309,7 @@ refreshes_reveal_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_NOT_FOUND,
                                            TALER_EC_REVEAL_SESSION_UNKNOWN,
-                                           "rc");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
   if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
@@ -321,7 +321,7 @@ refreshes_reveal_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            
TALER_EC_REVEAL_DB_FETCH_SESSION_ERROR,
-                                           "failed to fetch valid challenge 
from database");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
 
@@ -409,16 +409,17 @@ refreshes_reveal_transaction (void *cls,
                             &rc_expected))
     {
       GNUNET_break_op (0);
-      *mhd_ret = TALER_MHD_reply_json_pack (connection,
-                                            MHD_HTTP_CONFLICT,
-                                            "{s:s, s:I, s:o}",
-                                            "hint", "commitment violation",
-                                            "code",
-                                            (json_int_t)
-                                            
TALER_EC_REVEAL_COMMITMENT_VIOLATION,
-                                            "rc_expected",
-                                            GNUNET_JSON_from_data_auto (
-                                              &rc_expected));
+      *mhd_ret = TALER_MHD_reply_json_pack (
+        connection,
+        MHD_HTTP_CONFLICT,
+        "{s:s, s:I, s:o}",
+        "hint",
+        TALER_ErrorCode_get_hint (TALER_EC_REVEAL_COMMITMENT_VIOLATION),
+        "code",
+        (json_int_t) TALER_EC_REVEAL_COMMITMENT_VIOLATION,
+        "rc_expected",
+        GNUNET_JSON_from_data_auto (
+          &rc_expected));
       return GNUNET_DB_STATUS_HARD_ERROR;
     }
   } /* end of checking "rc_expected" */
@@ -451,7 +452,7 @@ refreshes_reveal_transaction (void *cls,
         *mhd_ret = TALER_MHD_reply_with_error (connection,
                                                MHD_HTTP_INTERNAL_SERVER_ERROR,
                                                
TALER_EC_REVEAL_COST_CALCULATION_OVERFLOW,
-                                               "failed to add up refresh 
costs");
+                                               NULL);
         return GNUNET_DB_STATUS_HARD_ERROR;
       }
     }
@@ -462,7 +463,7 @@ refreshes_reveal_transaction (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              
TALER_EC_REVEAL_AMOUNT_INSUFFICIENT,
-                                             "melted coin value is 
insufficient to cover cost of operation");
+                                             NULL);
       return GNUNET_DB_STATUS_HARD_ERROR;
     }
   }
@@ -517,7 +518,7 @@ refreshes_reveal_persist (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            TALER_EC_REVEAL_DB_COMMIT_ERROR,
-                                           "failed to persist reveal data");
+                                           NULL);
   }
   return qs;
 }
@@ -582,7 +583,7 @@ resolve_refreshes_reveal_denominations (struct 
TEH_KS_StateHandle *key_state,
       return TALER_MHD_reply_with_error (connection,
                                          hc,
                                          ec,
-                                         "failed to find denomination key");
+                                         NULL);
     }
     /* #TEH_KS_DKU_WITHDRAW should warrant that we only get denomination
        keys where we did not yet forget the private key */
@@ -630,13 +631,13 @@ resolve_refreshes_reveal_denominations (struct 
TEH_KS_StateHandle *key_state,
         ret = TALER_MHD_reply_with_error (connection,
                                           MHD_HTTP_NOT_FOUND,
                                           TALER_EC_REVEAL_SESSION_UNKNOWN,
-                                          "rc");
+                                          NULL);
         break;
       case GNUNET_DB_STATUS_HARD_ERROR:
         ret = TALER_MHD_reply_with_error (connection,
                                           MHD_HTTP_INTERNAL_SERVER_ERROR,
                                           
TALER_EC_REVEAL_DB_FETCH_SESSION_ERROR,
-                                          "failed to fetch session data");
+                                          NULL);
         break;
       case GNUNET_DB_STATUS_SOFT_ERROR:
       default:
@@ -644,7 +645,7 @@ resolve_refreshes_reveal_denominations (struct 
TEH_KS_StateHandle *key_state,
         ret = TALER_MHD_reply_with_error (connection,
                                           MHD_HTTP_INTERNAL_SERVER_ERROR,
                                           TALER_EC_INTERNAL_INVARIANT_FAILURE,
-                                          "assertion failed (unexpected 
database serialization error)");
+                                          NULL);
         break;
       }
       goto cleanup;
@@ -689,7 +690,7 @@ resolve_refreshes_reveal_denominations (struct 
TEH_KS_StateHandle *key_state,
         ret = TALER_MHD_reply_with_error (connection,
                                           MHD_HTTP_FORBIDDEN,
                                           
TALER_EC_REVEAL_LINK_SIGNATURE_INVALID,
-                                          "link_sig");
+                                          NULL);
         goto cleanup;
       }
     }
@@ -716,7 +717,7 @@ resolve_refreshes_reveal_denominations (struct 
TEH_KS_StateHandle *key_state,
       ret = TALER_MHD_reply_with_error (connection,
                                         MHD_HTTP_INTERNAL_SERVER_ERROR,
                                         TALER_EC_REVEAL_SIGNING_ERROR,
-                                        "internal signing error");
+                                        NULL);
       goto cleanup;
     }
   }
@@ -831,7 +832,7 @@ handle_refreshes_reveal_json (struct MHD_Connection 
*connection,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        
TALER_EC_REVEAL_NEW_DENOMS_ARRAY_SIZE_EXCESSIVE,
-                                       "new_denoms_h");
+                                       NULL);
 
   }
   if (json_array_size (new_denoms_h_json) !=
@@ -945,7 +946,7 @@ TEH_handler_reveal (const struct TEH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_REVEAL_INVALID_RCH,
-                                       "refresh commitment hash malformed");
+                                       args[0]);
   }
   if (0 != strcmp (args[1],
                    "reveal"))
@@ -954,7 +955,7 @@ TEH_handler_reveal (const struct TEH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_OPERATION_INVALID,
-                                       "expected 'reveal' operation");
+                                       args[1]);
   }
 
   {
@@ -979,7 +980,7 @@ TEH_handler_reveal (const struct TEH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        
TALER_EC_REVEAL_CNC_TRANSFER_ARRAY_SIZE_INVALID,
-                                       "transfer_privs");
+                                       NULL);
   }
 
   {
diff --git a/src/exchange/taler-exchange-httpd_refund.c 
b/src/exchange/taler-exchange-httpd_refund.c
index 955f1c51..ea258d1b 100644
--- a/src/exchange/taler-exchange-httpd_refund.c
+++ b/src/exchange/taler-exchange-httpd_refund.c
@@ -125,9 +125,9 @@ refund_transaction (void *cls,
   {
     if (GNUNET_DB_STATUS_HARD_ERROR == qs)
       *mhd_ret = TALER_MHD_reply_with_error (connection,
-                                             MHD_HTTP_NOT_FOUND,
-                                             TALER_EC_REFUND_COIN_NOT_FOUND,
-                                             "database transaction failure");
+                                             MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                             
TALER_EC_REFUND_DATABASE_LOOKUP_ERROR,
+                                             NULL);
     return qs;
   }
   deposit_found = false;
@@ -163,7 +163,7 @@ refund_transaction (void *cls,
             *mhd_ret = TALER_MHD_reply_with_error (connection,
                                                    MHD_HTTP_GONE,
                                                    
TALER_EC_REFUND_MERCHANT_ALREADY_PAID,
-                                                   "money already sent to 
merchant");
+                                                   NULL);
             return GNUNET_DB_STATUS_HARD_ERROR;
           }
 
@@ -230,9 +230,11 @@ refund_transaction (void *cls,
           *mhd_ret = TALER_MHD_reply_json_pack (
             connection,
             MHD_HTTP_PRECONDITION_FAILED,
-            "{s:s, s:I, s:o}",
-            "hint",
+            "{s:s, s:s, s:I, s:o}",
+            "detail",
             "conflicting refund with different amount but same refund 
transaction ID",
+            "hint", TALER_ErrorCode_get_hint (
+              TALER_EC_REFUND_INCONSISTENT_AMOUNT),
             "code", (json_int_t) TALER_EC_REFUND_INCONSISTENT_AMOUNT,
             "history", TEH_RESPONSE_compile_transaction_history (
               &refund->coin.coin_pub,
@@ -306,7 +308,7 @@ refund_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_NOT_FOUND,
                                            TALER_EC_REFUND_DEPOSIT_NOT_FOUND,
-                                           "deposit unknown");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
 
@@ -321,7 +323,7 @@ refund_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_BAD_REQUEST,
                                            TALER_EC_REFUND_CURRENCY_MISMATCH,
-                                           "currencies involved do not match");
+                                           deposit_total.currency);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
 
@@ -340,13 +342,16 @@ refund_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_json_pack (
       connection,
       MHD_HTTP_CONFLICT,
-      "{s:s, s:I, s:o}",
-      "hint",
+      "{s:s, s:s, s:I, s:o}",
+      "detail",
       "total amount refunded exceeds total amount deposited for this coin",
-      "code", (json_int_t) TALER_EC_REFUND_CONFLICT_DEPOSIT_INSUFFICIENT,
-      "history", TEH_RESPONSE_compile_transaction_history (
-        &refund->coin.coin_pub,
-        tlx));
+      "hint",
+      TALER_ErrorCode_get_hint (TALER_EC_REFUND_CONFLICT_DEPOSIT_INSUFFICIENT),
+      "code",
+      (json_int_t) TALER_EC_REFUND_CONFLICT_DEPOSIT_INSUFFICIENT,
+      "history",
+      TEH_RESPONSE_compile_transaction_history (&refund->coin.coin_pub,
+                                                tlx));
     TEH_plugin->free_coin_transaction_list (TEH_plugin->cls,
                                             tlx);
     return GNUNET_DB_STATUS_HARD_ERROR;
@@ -365,7 +370,7 @@ refund_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            TALER_EC_REFUND_STORE_DB_ERROR,
-                                           "could not persist store 
information");
+                                           NULL);
     return qs;
   }
   /* Success or soft failure */
@@ -411,7 +416,7 @@ verify_and_execute_refund (struct MHD_Connection 
*connection,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_FORBIDDEN,
                                          
TALER_EC_REFUND_MERCHANT_SIGNATURE_INVALID,
-                                         "merchant_sig");
+                                         NULL);
     }
   }
 
@@ -425,11 +430,18 @@ verify_and_execute_refund (struct MHD_Connection 
*connection,
                                             &denom_hash);
     if (0 > qs)
     {
+      MHD_RESULT res;
+      char *dhs;
+
       GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs);
-      return TALER_MHD_reply_with_error (connection,
-                                         MHD_HTTP_NOT_FOUND,
-                                         TALER_EC_REFUND_COIN_NOT_FOUND,
-                                         "denomination of coin to be refunded 
not found in DB");
+      dhs = GNUNET_STRINGS_data_to_string_alloc (&denom_hash,
+                                                 sizeof (denom_hash));
+      res = TALER_MHD_reply_with_error (connection,
+                                        MHD_HTTP_NOT_FOUND,
+                                        TALER_EC_REFUND_COIN_NOT_FOUND,
+                                        dhs);
+      GNUNET_free (dhs);
+      return res;
     }
   }
 
@@ -465,7 +477,7 @@ verify_and_execute_refund (struct MHD_Connection 
*connection,
         return TALER_MHD_reply_with_error (connection,
                                            hc,
                                            ec,
-                                           "denomination not found, but coin 
known");
+                                           NULL);
       }
       TALER_amount_ntoh (&refund->details.refund_fee,
                          &dki->issue.properties.fee_refund);
diff --git a/src/exchange/taler-exchange-httpd_reserves_get.c 
b/src/exchange/taler-exchange-httpd_reserves_get.c
index cbc6b422..2272e6d0 100644
--- a/src/exchange/taler-exchange-httpd_reserves_get.c
+++ b/src/exchange/taler-exchange-httpd_reserves_get.c
@@ -51,7 +51,7 @@ reply_reserve_history_success (struct MHD_Connection 
*connection,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
                                        TALER_EC_RESERVE_STATUS_DB_ERROR,
-                                       "balance calculation failure");
+                                       NULL);
   json_balance = TALER_JSON_from_amount (&balance);
   return TALER_MHD_reply_json_pack (connection,
                                     MHD_HTTP_OK,
@@ -143,7 +143,7 @@ TEH_handler_reserves_get (const struct TEH_RequestHandler 
*rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_RESERVES_INVALID_RESERVE_PUB,
-                                       "reserve public key malformed");
+                                       args[0]);
   }
   rsc.rh = NULL;
   if (GNUNET_OK !=
@@ -156,14 +156,10 @@ TEH_handler_reserves_get (const struct TEH_RequestHandler 
*rh,
 
   /* generate proper response */
   if (NULL == rsc.rh)
-    return TALER_MHD_reply_json_pack (connection,
-                                      MHD_HTTP_NOT_FOUND,
-                                      "{s:s, s:s, s:I}",
-                                      "hint", "Reserve not found",
-                                      "parameter", "reserve_pub",
-                                      "code",
-                                      (json_int_t)
-                                      TALER_EC_RESERVE_STATUS_UNKNOWN);
+    return TALER_MHD_reply_with_error (connection,
+                                       MHD_HTTP_NOT_FOUND,
+                                       TALER_EC_RESERVE_STATUS_UNKNOWN,
+                                       args[0]);
   mhd_ret = reply_reserve_history_success (connection,
                                            rsc.rh);
   TEH_plugin->free_reserve_history (TEH_plugin->cls,
diff --git a/src/exchange/taler-exchange-httpd_responses.c 
b/src/exchange/taler-exchange-httpd_responses.c
index 4bcb9e7a..d7d11861 100644
--- a/src/exchange/taler-exchange-httpd_responses.c
+++ b/src/exchange/taler-exchange-httpd_responses.c
@@ -445,13 +445,13 @@ TEH_RESPONSE_reply_coin_insufficient_funds (
     GNUNET_break (0);
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
-                                       
TALER_EC_COIN_HISTORY_DB_ERROR_INSUFFICIENT_FUNDS,
-                                       "failed to convert transaction history 
to JSON");
+                                       TALER_EC_JSON_ALLOCATION_FAILURE,
+                                       "Failed to generated proof of 
insufficient funds");
   }
   return TALER_MHD_reply_json_pack (connection,
                                     MHD_HTTP_CONFLICT,
                                     "{s:s, s:I, s:o}",
-                                    "hint", "insufficient funds",
+                                    "hint", TALER_ErrorCode_get_hint (ec),
                                     "code", (json_int_t) ec,
                                     "history", history);
 }
diff --git a/src/exchange/taler-exchange-httpd_transfers_get.c 
b/src/exchange/taler-exchange-httpd_transfers_get.c
index 30018a49..7cf37b37 100644
--- a/src/exchange/taler-exchange-httpd_transfers_get.c
+++ b/src/exchange/taler-exchange-httpd_transfers_get.c
@@ -446,7 +446,7 @@ get_transfer_deposits (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              
TALER_EC_TRANSFERS_GET_DB_FETCH_FAILED,
-                                             "failed to fetch transaction 
data");
+                                             NULL);
     }
     return qs;
   }
@@ -456,7 +456,7 @@ get_transfer_deposits (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            
TALER_EC_TRANSFERS_GET_DB_INCONSISTENT,
-                                           "exchange database internally 
inconsistent");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
   if (GNUNET_NO == ctx->is_valid)
@@ -464,7 +464,7 @@ get_transfer_deposits (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_NOT_FOUND,
                                            
TALER_EC_TRANSFERS_GET_WTID_NOT_FOUND,
-                                           "wtid");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
   qs = TEH_plugin->get_wire_fee (TEH_plugin->cls,
@@ -485,7 +485,7 @@ get_transfer_deposits (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              
TALER_EC_TRANSFERS_GET_WIRE_FEE_NOT_FOUND,
-                                             "did not find wire fee");
+                                             NULL);
     }
     return qs;
   }
@@ -498,7 +498,7 @@ get_transfer_deposits (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_INTERNAL_SERVER_ERROR,
                                            
TALER_EC_TRANSFERS_GET_WIRE_FEE_INCONSISTENT,
-                                           "could not subtract wire fee");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
   return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
@@ -535,7 +535,7 @@ TEH_handler_transfers_get (const struct TEH_RequestHandler 
*rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_TRANSFERS_INVALID_WTID,
-                                       "wire transfer identifier malformed");
+                                       args[0]);
   }
   if (GNUNET_OK !=
       TEH_DB_run_transaction (connection,
diff --git a/src/exchange/taler-exchange-httpd_withdraw.c 
b/src/exchange/taler-exchange-httpd_withdraw.c
index c4c72d6a..f39f0897 100644
--- a/src/exchange/taler-exchange-httpd_withdraw.c
+++ b/src/exchange/taler-exchange-httpd_withdraw.c
@@ -66,7 +66,7 @@ reply_withdraw_insufficient_funds (
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
                                        
TALER_EC_WITHDRAW_HISTORY_DB_ERROR_INSUFFICIENT_FUNDS,
-                                       "reserve balance calculation failure");
+                                       NULL);
   if (0 !=
       TALER_amount_cmp (&balance,
                         ebalance))
@@ -76,18 +76,20 @@ reply_withdraw_insufficient_funds (
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
                                        
TALER_EC_WITHDRAW_RESERVE_BALANCE_CORRUPT,
-                                       "internal balance inconsistency error");
+                                       NULL);
   }
-  return TALER_MHD_reply_json_pack (connection,
-                                    MHD_HTTP_CONFLICT,
-                                    "{s:s, s:I, s:o, s:o}",
-                                    "hint", "insufficient funds",
-                                    "code",
-                                    (json_int_t)
-                                    TALER_EC_WITHDRAW_INSUFFICIENT_FUNDS,
-                                    "balance", TALER_JSON_from_amount (
-                                      &balance),
-                                    "history", json_history);
+  return TALER_MHD_reply_json_pack (
+    connection,
+    MHD_HTTP_CONFLICT,
+    "{s:s, s:I, s:o, s:o}",
+    "hint",
+    TALER_ErrorCode_get_hint (TALER_EC_WITHDRAW_INSUFFICIENT_FUNDS),
+    "code",
+    (json_int_t) TALER_EC_WITHDRAW_INSUFFICIENT_FUNDS,
+    "balance",
+    TALER_JSON_from_amount (&balance),
+    "history",
+    json_history);
 }
 
 
@@ -197,7 +199,7 @@ withdraw_transaction (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              TALER_EC_WITHDRAW_DB_FETCH_ERROR,
-                                             "failed to fetch withdraw data");
+                                             NULL);
     wc->collectable.sig = denom_sig;
     return qs;
   }
@@ -232,7 +234,7 @@ withdraw_transaction (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              TALER_EC_WITHDRAW_DB_FETCH_ERROR,
-                                             "failed to fetch reserve data");
+                                             NULL);
     return qs;
   }
   if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
@@ -240,7 +242,7 @@ withdraw_transaction (void *cls,
     *mhd_ret = TALER_MHD_reply_with_error (connection,
                                            MHD_HTTP_NOT_FOUND,
                                            TALER_EC_WITHDRAW_RESERVE_UNKNOWN,
-                                           "reserve_pub");
+                                           NULL);
     return GNUNET_DB_STATUS_HARD_ERROR;
   }
   if (0 < TALER_amount_cmp (&wc->amount_required,
@@ -274,7 +276,7 @@ withdraw_transaction (void *cls,
         *mhd_ret = TALER_MHD_reply_with_error (connection,
                                                MHD_HTTP_INTERNAL_SERVER_ERROR,
                                                
TALER_EC_WITHDRAW_DB_FETCH_ERROR,
-                                               "failed to fetch reserve 
history");
+                                               NULL);
       return GNUNET_DB_STATUS_HARD_ERROR;
     }
     *mhd_ret = reply_withdraw_insufficient_funds (connection,
@@ -299,7 +301,7 @@ withdraw_transaction (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              
TALER_EC_WITHDRAW_SIGNATURE_FAILED,
-                                             "Failed to create blind 
signature");
+                                             NULL);
       return GNUNET_DB_STATUS_HARD_ERROR;
     }
   }
@@ -319,7 +321,7 @@ withdraw_transaction (void *cls,
       *mhd_ret = TALER_MHD_reply_with_error (connection,
                                              MHD_HTTP_INTERNAL_SERVER_ERROR,
                                              TALER_EC_WITHDRAW_DB_STORE_ERROR,
-                                             "failed to persist withdraw 
data");
+                                             NULL);
     return qs;
   }
   return qs;
@@ -370,7 +372,7 @@ TEH_handler_withdraw (const struct TEH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_BAD_REQUEST,
                                        TALER_EC_RESERVES_INVALID_RESERVE_PUB,
-                                       "reserve public key malformed");
+                                       args[0]);
   }
 
   {
@@ -408,7 +410,7 @@ TEH_handler_withdraw (const struct TEH_RequestHandler *rh,
       return TALER_MHD_reply_with_error (connection,
                                          hc,
                                          ec,
-                                         "could not find denomination key");
+                                         NULL);
     }
   }
   GNUNET_assert (NULL != wc.dki->denom_priv.rsa_private_key);
@@ -430,7 +432,7 @@ TEH_handler_withdraw (const struct TEH_RequestHandler *rh,
       return TALER_MHD_reply_with_error (connection,
                                          MHD_HTTP_INTERNAL_SERVER_ERROR,
                                          TALER_EC_WITHDRAW_AMOUNT_FEE_OVERFLOW,
-                                         "amount overflow for value plus 
withdraw fee");
+                                         NULL);
     }
     TALER_amount_hton (&wc.wsrd.amount_with_fee,
                        &wc.amount_required);
@@ -459,7 +461,7 @@ TEH_handler_withdraw (const struct TEH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_FORBIDDEN,
                                        
TALER_EC_WITHDRAW_RESERVE_SIGNATURE_INVALID,
-                                       "reserve_sig");
+                                       NULL);
   }
 
 #if OPTIMISTIC_SIGN
@@ -476,7 +478,7 @@ TEH_handler_withdraw (const struct TEH_RequestHandler *rh,
     return TALER_MHD_reply_with_error (connection,
                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
                                        TALER_EC_WITHDRAW_SIGNATURE_FAILED,
-                                       "Failed to sign");
+                                       NULL);
   }
 #endif
 
diff --git a/src/include/taler_mhd_lib.h b/src/include/taler_mhd_lib.h
index 4b34f41d..09e22f9e 100644
--- a/src/include/taler_mhd_lib.h
+++ b/src/include/taler_mhd_lib.h
@@ -133,14 +133,14 @@ TALER_MHD_reply_json_pack (struct MHD_Connection 
*connection,
  * @param connection the MHD connection to use
  * @param ec error code uniquely identifying the error
  * @param http_status HTTP status code to use
- * @param hint human readable hint about the error
+ * @param detail additional optional detail about the error
  * @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 *hint);
+                            const char *detail);
 
 
 /**
@@ -169,12 +169,12 @@ TALER_MHD_make_json_pack (const char *fmt,
  * Create a response indicating an internal error.
  *
  * @param ec error code to return
- * @param hint hint about the internal error's nature
+ * @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 *hint);
+                      const char *detail);
 
 
 /**
diff --git a/src/json/json.c b/src/json/json.c
index 09cc757c..26685719 100644
--- a/src/json/json.c
+++ b/src/json/json.c
@@ -651,7 +651,8 @@ TALER_JSON_get_error_hint (const json_t *json)
     GNUNET_break_op (0);
     return NULL;
   }
-  jc = json_object_get (json, "hint");
+  jc = json_object_get (json,
+                        "hint");
   if (NULL == jc)
     return NULL; /* no hint, is allowed */
   if (! json_is_string (jc))
diff --git a/src/mhd/mhd_legal.c b/src/mhd/mhd_legal.c
index 0f2433c2..d505f662 100644
--- a/src/mhd/mhd_legal.c
+++ b/src/mhd/mhd_legal.c
@@ -24,6 +24,7 @@
 #include <gnunet/gnunet_json_lib.h>
 #include <jansson.h>
 #include <microhttpd.h>
+#include "taler_util.h"
 #include "taler_mhd_lib.h"
 
 
diff --git a/src/mhd/mhd_parsing.c b/src/mhd/mhd_parsing.c
index 2a086e11..a9f62749 100644
--- a/src/mhd/mhd_parsing.c
+++ b/src/mhd/mhd_parsing.c
@@ -76,11 +76,11 @@ TALER_MHD_parse_post_json (struct MHD_Connection 
*connection,
   case GNUNET_JSON_PR_OUT_OF_MEMORY:
     GNUNET_break (NULL == *json);
     return (MHD_NO ==
-            TALER_MHD_reply_with_error
-              (connection,
+            TALER_MHD_reply_with_error (
+              connection,
               MHD_HTTP_INTERNAL_SERVER_ERROR,
               TALER_EC_PARSER_OUT_OF_MEMORY,
-              "out of memory")) ? GNUNET_SYSERR : GNUNET_NO;
+              NULL)) ? GNUNET_SYSERR : GNUNET_NO;
 
   case GNUNET_JSON_PR_CONTINUE:
     GNUNET_break (NULL == *json);
@@ -96,7 +96,7 @@ TALER_MHD_parse_post_json (struct MHD_Connection *connection,
             TALER_MHD_reply_with_error (connection,
                                         MHD_HTTP_BAD_REQUEST,
                                         TALER_EC_JSON_INVALID,
-                                        "invalid JSON uploaded"))
+                                        NULL))
            ? GNUNET_NO : GNUNET_SYSERR;
   case GNUNET_JSON_PR_SUCCESS:
     GNUNET_break (NULL != *json);
@@ -204,15 +204,15 @@ TALER_MHD_parse_json_data (struct MHD_Connection 
*connection,
     if (NULL == error_json_name)
       error_json_name = "<no field>";
     ret = (MHD_YES ==
-           TALER_MHD_reply_json_pack (connection,
-                                      MHD_HTTP_BAD_REQUEST,
-                                      "{s:s, s:I, s:s, s:I}",
-                                      "hint", "JSON parse error",
-                                      "code",
-                                      (json_int_t)
-                                      TALER_EC_JSON_INVALID_WITH_DETAILS,
-                                      "field", error_json_name,
-                                      "line", (json_int_t) error_line))
+           TALER_MHD_reply_json_pack (
+             connection,
+             MHD_HTTP_BAD_REQUEST,
+             "{s:s, s:I, s:s, s:I}",
+             "hint", TALER_ErrorCode_get_hint (
+               TALER_EC_JSON_INVALID_WITH_DETAILS),
+             "code", (json_int_t) TALER_EC_JSON_INVALID_WITH_DETAILS,
+             "field", error_json_name,
+             "line", (json_int_t) error_line))
           ? GNUNET_NO : GNUNET_SYSERR;
     return ret;
   }
@@ -256,15 +256,15 @@ TALER_MHD_parse_internal_json_data (struct MHD_Connection 
*connection,
     if (NULL == error_json_name)
       error_json_name = "<no field>";
     ret = (MHD_YES ==
-           TALER_MHD_reply_json_pack (connection,
-                                      MHD_HTTP_INTERNAL_SERVER_ERROR,
-                                      "{s:s, s:I, s:s, s:I}",
-                                      "hint", "JSON parse error",
-                                      "code",
-                                      (json_int_t)
-                                      TALER_EC_INTERNAL_INVARIANT_FAILURE,
-                                      "field", error_json_name,
-                                      "line", (json_int_t) error_line))
+           TALER_MHD_reply_json_pack (
+             connection,
+             MHD_HTTP_INTERNAL_SERVER_ERROR,
+             "{s:s, s:I, s:s, s:I}",
+             "hint", TALER_ErrorCode_get_hint (
+               TALER_EC_INTERNAL_INVARIANT_FAILURE),
+             "code", (json_int_t) TALER_EC_INTERNAL_INVARIANT_FAILURE,
+             "field", error_json_name,
+             "line", (json_int_t) error_line))
           ? GNUNET_NO : GNUNET_SYSERR;
     return ret;
   }
@@ -311,14 +311,15 @@ TALER_MHD_parse_json_array (struct MHD_Connection 
*connection,
   if (NULL == root)
   {
     ret = (MHD_YES ==
-           TALER_MHD_reply_json_pack (connection,
-                                      MHD_HTTP_BAD_REQUEST,
-                                      "{s:s, s:I, s:I}",
-                                      "hint", "expected array",
-                                      "code",
-                                      (json_int_t)
-                                      TALER_EC_JSON_INVALID_WITH_DETAILS,
-                                      "dimension", dim))
+           TALER_MHD_reply_json_pack (
+             connection,
+             MHD_HTTP_BAD_REQUEST,
+             "{s:s, s:I, s:s, s:I}",
+             "hint", TALER_ErrorCode_get_hint (
+               TALER_EC_JSON_INVALID_WITH_DETAILS),
+             "code", (json_int_t) TALER_EC_JSON_INVALID_WITH_DETAILS,
+             "detail", "expected array",
+             "dimension", dim))
           ? GNUNET_NO : GNUNET_SYSERR;
     return ret;
   }
@@ -331,14 +332,15 @@ TALER_MHD_parse_json_array (struct MHD_Connection 
*connection,
     if (NULL == error_json_name)
       error_json_name = "<no field>";
     ret = (MHD_YES ==
-           TALER_MHD_reply_json_pack (connection,
-                                      MHD_HTTP_BAD_REQUEST,
-                                      "{s:s, s:I, s:I}",
-                                      "hint", error_json_name,
-                                      "code",
-                                      (json_int_t)
-                                      TALER_EC_JSON_INVALID_WITH_DETAILS,
-                                      "line", (json_int_t) error_line))
+           TALER_MHD_reply_json_pack (
+             connection,
+             MHD_HTTP_BAD_REQUEST,
+             "{s:s, s:s, s:I, s:I}",
+             "detail", error_json_name,
+             "hint", TALER_ErrorCode_get_hint (
+               TALER_EC_JSON_INVALID_WITH_DETAILS),
+             "code", (json_int_t) TALER_EC_JSON_INVALID_WITH_DETAILS,
+             "line", (json_int_t) error_line))
           ? GNUNET_NO : GNUNET_SYSERR;
     return ret;
   }
diff --git a/src/mhd/mhd_responses.c b/src/mhd/mhd_responses.c
index 45a9932d..5ed82cd2 100644
--- a/src/mhd/mhd_responses.c
+++ b/src/mhd/mhd_responses.c
@@ -404,16 +404,17 @@ TALER_MHD_make_json_pack (const char *fmt,
  * Create a response indicating an internal error.
  *
  * @param ec error code to return
- * @param hint hint about the internal error's nature
+ * @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 *hint)
+                      const char *detail)
 {
-  return TALER_MHD_make_json_pack ("{s:I, s:s}",
+  return TALER_MHD_make_json_pack ("{s:I, s:s, s:s?}",
                                    "code", (json_int_t) ec,
-                                   "hint", hint);
+                                   "hint", TALER_ErrorCode_get_hint (ec),
+                                   "detail", detail);
 }
 
 
@@ -423,20 +424,21 @@ TALER_MHD_make_error (enum TALER_ErrorCode ec,
  * @param connection the MHD connection to use
  * @param ec error code uniquely identifying the error
  * @param http_status HTTP status code to use
- * @param hint human readable hint about the error
+ * @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 *hint)
+                            const char *detail)
 {
   return TALER_MHD_reply_json_pack (connection,
                                     http_status,
-                                    "{s:I, s:s}",
+                                    "{s:I, s:s, s:s?}",
                                     "code", (json_int_t) ec,
-                                    "hint", hint);
+                                    "hint", TALER_ErrorCode_get_hint (ec),
+                                    "detail", detail);
 }
 
 

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]