summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2016-10-20 21:01:33 +0200
committerChristian Grothoff <christian@grothoff.org>2016-10-20 21:01:33 +0200
commitb9b230e7079bb9e1eb937ef07e1b6b7408176f3d (patch)
tree06afaf42b210dc9b34ef3ec63b9fffa6b9227c6b /src/backend
parentae8bc763a4e93aa295272ca3e1d6c9785cc7562b (diff)
downloadmerchant-b9b230e7079bb9e1eb937ef07e1b6b7408176f3d.tar.gz
merchant-b9b230e7079bb9e1eb937ef07e1b6b7408176f3d.tar.bz2
merchant-b9b230e7079bb9e1eb937ef07e1b6b7408176f3d.zip
modify merchant logic to support exchange-APIs returning taler-specific error codes from C API as well, plus fixing a few cases where the merchant HTTP API did not yet return the error codes properly (#4497/4705)
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/taler-merchant-httpd_pay.c4
-rw-r--r--src/backend/taler-merchant-httpd_track-transaction.c21
-rw-r--r--src/backend/taler-merchant-httpd_track-transfer.c25
3 files changed, 35 insertions, 15 deletions
diff --git a/src/backend/taler-merchant-httpd_pay.c b/src/backend/taler-merchant-httpd_pay.c
index e2ad6628..edda009f 100644
--- a/src/backend/taler-merchant-httpd_pay.c
+++ b/src/backend/taler-merchant-httpd_pay.c
@@ -337,6 +337,7 @@ abort_deposit (struct PayContext *pc)
* @param http_status HTTP response code, #MHD_HTTP_OK
* (200) for successful deposit; 0 if the exchange's reply is bogus (fails
* to follow the protocol)
+ * @param ec taler-specific error code, #TALER_EC_NONE on success
* @param sign_key which key did the exchange use to sign the @a proof
* @param proof the received JSON reply,
* should be kept as proof (and, in case of errors, be forwarded to
@@ -345,6 +346,7 @@ abort_deposit (struct PayContext *pc)
static void
deposit_cb (void *cls,
unsigned int http_status,
+ enum TALER_ErrorCode ec,
const struct TALER_ExchangePublicKeyP *sign_key,
const json_t *proof)
{
@@ -366,12 +368,12 @@ deposit_cb (void *cls,
if (NULL == proof)
{
/* We can't do anything meaningful here, the exchange did something wrong */
- /* FIXME: any useful information we can include? */
resume_pay_with_response (pc,
MHD_HTTP_SERVICE_UNAVAILABLE,
TMH_RESPONSE_make_json_pack ("{s:s, s:I, s:I, s:s}",
"error", "exchange failed",
"code", (json_int_t) TALER_EC_PAY_EXCHANGE_FAILED,
+ "exchange-code", (json_int_t) ec,
"exchange-http-status", (json_int_t) http_status,
"hint", "The exchange provided an unexpected response"));
}
diff --git a/src/backend/taler-merchant-httpd_track-transaction.c b/src/backend/taler-merchant-httpd_track-transaction.c
index 50572f2b..a76ef56c 100644
--- a/src/backend/taler-merchant-httpd_track-transaction.c
+++ b/src/backend/taler-merchant-httpd_track-transaction.c
@@ -331,6 +331,7 @@ trace_coins (struct TrackTransactionContext *tctx);
*
* @param cls closure
* @param http_status HTTP status code we got, 0 on exchange protocol violation
+ * @param ec taler-specific error code
* @param exchange_pub public key of the exchange used for signing
* @param json original json reply (may include signatures, those have then been
* validated already)
@@ -345,6 +346,7 @@ trace_coins (struct TrackTransactionContext *tctx);
static void
wire_deposits_cb (void *cls,
unsigned int http_status,
+ enum TALER_ErrorCode ec,
const struct TALER_ExchangePublicKeyP *exchange_pub,
const json_t *json,
const struct GNUNET_HashCode *h_wire,
@@ -363,8 +365,10 @@ wire_deposits_cb (void *cls,
resume_track_transaction_with_response
(tctx,
MHD_HTTP_FAILED_DEPENDENCY,
- TMH_RESPONSE_make_json_pack ("{s:I, s:O}",
- "exchange_status", (json_int_t) http_status,
+ TMH_RESPONSE_make_json_pack ("{s:I, s:I, s:I, s:O}",
+ "code", (json_int_t) TALER_EC_TRACK_TRANSACTION_WIRE_TRANSFER_TRACE_ERROR,
+ "exchange-http-status", (json_int_t) http_status,
+ "exchange-code", (json_int_t) ec,
"details", json));
return;
}
@@ -454,6 +458,7 @@ proof_cb (void *cls,
*
* @param cls closure with a `struct TrackCoinContext`
* @param http_status HTTP status code we got, 0 on exchange protocol violation
+ * @param ec taler-specific error code, #TALER_EC_NONE on success
* @param exchange_pub public key of the exchange used for signing @a json
* @param json original json reply (may include signatures, those have then been
* validated already), should be a `TrackTransactionResponse`
@@ -466,6 +471,7 @@ proof_cb (void *cls,
static void
wtid_cb (void *cls,
unsigned int http_status,
+ enum TALER_ErrorCode ec,
const struct TALER_ExchangePublicKeyP *exchange_pub,
const json_t *json,
const struct TALER_WireTransferIdentifierRawP *wtid,
@@ -487,8 +493,10 @@ wtid_cb (void *cls,
(MHD_HTTP_ACCEPTED == http_status)
? MHD_HTTP_ACCEPTED
: MHD_HTTP_FAILED_DEPENDENCY,
- TMH_RESPONSE_make_json_pack ("{s:I, s:O}",
- "exchange_status", (json_int_t) http_status,
+ TMH_RESPONSE_make_json_pack ("{s:I, s:I, s:I, s:O}",
+ "code", (json_int_t) TALER_EC_TRACK_TRANSACTION_COIN_TRACE_ERROR,
+ "exchange-http-status", (json_int_t) http_status,
+ "exchange-code", (json_int_t) ec,
"details", json));
return;
}
@@ -505,8 +513,9 @@ wtid_cb (void *cls,
GNUNET_break_op (0);
resume_track_transaction_with_response
(tcc->tctx,
- MHD_HTTP_CONFLICT,
- TMH_RESPONSE_make_json_pack ("{s:s, s:O, s:o, s:o}",
+ MHD_HTTP_FAILED_DEPENDENCY,
+ TMH_RESPONSE_make_json_pack ("{s:I, s:s, s:O, s:o, s:o}",
+ "code", (json_int_t) TALER_EC_TRACK_TRANSACTION_CONFLICTING_REPORTS,
"error", "conflicting transfer data from exchange",
"transaction_tracking_claim", json,
"wtid_tracking_claim", pcc.p_ret,
diff --git a/src/backend/taler-merchant-httpd_track-transfer.c b/src/backend/taler-merchant-httpd_track-transfer.c
index f12728dc..1909092e 100644
--- a/src/backend/taler-merchant-httpd_track-transfer.c
+++ b/src/backend/taler-merchant-httpd_track-transfer.c
@@ -258,6 +258,7 @@ check_transfer (void *cls,
*
* @param cls closure
* @param http_status HTTP status code we got, 0 on exchange protocol violation
+ * @param ec taler-specific error code for the operation, #TALER_EC_NONE on success
* @param exchange_pub public key of the exchange used to sign @a json
* @param json original json reply (may include signatures, those have then been
* validated already)
@@ -271,6 +272,7 @@ check_transfer (void *cls,
static void
wire_transfer_cb (void *cls,
unsigned int http_status,
+ enum TALER_ErrorCode ec,
const struct TALER_ExchangePublicKeyP *exchange_pub,
const json_t *json,
const struct GNUNET_HashCode *h_wire,
@@ -292,8 +294,10 @@ wire_transfer_cb (void *cls,
resume_track_transfer_with_response
(rctx,
MHD_HTTP_FAILED_DEPENDENCY,
- TMH_RESPONSE_make_json_pack ("{s:I, s:O}",
- "exchange_status", (json_int_t) http_status,
+ TMH_RESPONSE_make_json_pack ("{s:I, s:I, s:I, s:O}",
+ "code", (json_int_t) TALER_EC_TRACK_TRANSFER_EXCHANGE_ERROR,
+ "exchange-code", (json_int_t) ec,
+ "exchange-http-status", (json_int_t) http_status,
"details", json));
return;
}
@@ -311,7 +315,8 @@ wire_transfer_cb (void *cls,
resume_track_transfer_with_response
(rctx,
MHD_HTTP_INTERNAL_SERVER_ERROR,
- TMH_RESPONSE_make_json_pack ("{s:s}",
+ TMH_RESPONSE_make_json_pack ("{s:I, s:s}",
+ "code", (json_int_t) TALER_EC_TRACK_TRANSFER_DB_STORE_TRANSER_ERROR,
"details", "failed to store response from exchange to local database"));
return;
}
@@ -334,7 +339,8 @@ wire_transfer_cb (void *cls,
resume_track_transfer_with_response
(rctx,
MHD_HTTP_INTERNAL_SERVER_ERROR,
- TMH_RESPONSE_make_json_pack ("{s:s}",
+ TMH_RESPONSE_make_json_pack ("{s:I, s:s}",
+ "code", (json_int_t) TALER_EC_TRACK_TRANSFER_DB_FETCH_DEPOSIT_ERROR,
"details", "failed to obtain deposit data from local database"));
return;
}
@@ -355,7 +361,8 @@ wire_transfer_cb (void *cls,
resume_track_transfer_with_response
(rctx,
MHD_HTTP_INTERNAL_SERVER_ERROR,
- TMH_RESPONSE_make_json_pack ("{s:s, s:I, s:s}",
+ TMH_RESPONSE_make_json_pack ("{s:I, s:s, s:I, s:s}",
+ "code", (json_int_t) TALER_EC_TRACK_TRANSFER_DB_INTERNAL_LOGIC_ERROR,
"details", "internal logic error",
"line", (json_int_t) __LINE__,
"file", __FILE__));
@@ -368,7 +375,7 @@ wire_transfer_cb (void *cls,
GNUNET_assert (NULL != rctx->response);
resume_track_transfer_with_response
(rctx,
- MHD_HTTP_CONFLICT,
+ MHD_HTTP_FAILED_DEPENDENCY,
rctx->response);
rctx->response = NULL;
return;
@@ -386,7 +393,8 @@ wire_transfer_cb (void *cls,
resume_track_transfer_with_response
(rctx,
MHD_HTTP_INTERNAL_SERVER_ERROR,
- TMH_RESPONSE_make_json_pack ("{s:s}",
+ TMH_RESPONSE_make_json_pack ("{s:I, s:s}",
+ "code", (json_int_t) TALER_EC_TRACK_TRANSFER_DB_STORE_COIN_ERROR,
"details", "failed to store response from exchange to local database"));
return;
}
@@ -425,7 +433,8 @@ process_track_transfer_with_exchange (void *cls,
resume_track_transfer_with_response
(rctx,
MHD_HTTP_INTERNAL_SERVER_ERROR,
- TMH_RESPONSE_make_json_pack ("{s:s}",
+ TMH_RESPONSE_make_json_pack ("{s:I, s:s}",
+ "code", (json_int_t) TALER_EC_TRACK_TRANSFER_REQUEST_ERROR,
"error", "failed to run /track/transfer on exchange"));
}
}