diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-10-20 21:01:33 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-10-20 21:01:33 +0200 |
commit | b9b230e7079bb9e1eb937ef07e1b6b7408176f3d (patch) | |
tree | 06afaf42b210dc9b34ef3ec63b9fffa6b9227c6b /src/backend | |
parent | ae8bc763a4e93aa295272ca3e1d6c9785cc7562b (diff) | |
download | merchant-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.c | 4 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_track-transaction.c | 21 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_track-transfer.c | 25 |
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")); } } |