gnunet-svn
[Top][All Lists]
Advanced

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

[taler-wallet-core] branch master updated: fix #8681


From: gnunet
Subject: [taler-wallet-core] branch master updated: fix #8681
Date: Mon, 01 Apr 2024 19:05:00 +0200

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

sebasjm pushed a commit to branch master
in repository wallet-core.

The following commit(s) were added to refs/heads/master by this push:
     new 2c1f3ffec fix #8681
2c1f3ffec is described below

commit 2c1f3ffec19e95716a57647f35c7bd68e8565e5a
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Mon Apr 1 14:03:50 2024 -0300

    fix #8681
---
 packages/taler-util/src/MerchantApiClient.ts       |   9 +-
 packages/taler-util/src/bank-api-client.ts         |   3 +-
 .../taler-util/src/http-client/authentication.ts   |   7 +-
 .../taler-util/src/http-client/bank-conversion.ts  |  10 +-
 packages/taler-util/src/http-client/bank-core.ts   | 159 ++++++++++-----------
 .../taler-util/src/http-client/bank-integration.ts |  22 +--
 .../taler-util/src/http-client/bank-revenue.ts     |   4 +-
 packages/taler-util/src/http-client/bank-wire.ts   |  12 +-
 packages/taler-util/src/http-client/exchange.ts    |  12 +-
 packages/taler-util/src/http-client/merchant.ts    | 121 ++++++++--------
 packages/taler-util/src/operation.ts               |  19 ++-
 packages/taler-util/src/taler-error-codes.ts       |   3 +
 packages/taler-util/src/taleruri.ts                |  63 ++++++--
 .../src/cta/Withdraw/state.ts                      |  24 ++--
 14 files changed, 254 insertions(+), 214 deletions(-)

diff --git a/packages/taler-util/src/MerchantApiClient.ts 
b/packages/taler-util/src/MerchantApiClient.ts
index fa9a00176..c27f1d582 100644
--- a/packages/taler-util/src/MerchantApiClient.ts
+++ b/packages/taler-util/src/MerchantApiClient.ts
@@ -25,6 +25,7 @@ import {
   createPlatformHttpLib,
   expectSuccessResponseOrThrow,
   readSuccessResponseJsonOrThrow,
+  readTalerErrorResponse,
 } from "./http.js";
 import { FacadeCredentials } from "./libeufin-api-types.js";
 import { LibtoolVersion } from "./libtool-version.js";
@@ -305,7 +306,7 @@ export class MerchantApiClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -321,7 +322,7 @@ export class MerchantApiClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -342,7 +343,7 @@ export class MerchantApiClient {
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForMerchantConfig());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -362,7 +363,7 @@ export class MerchantApiClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
diff --git a/packages/taler-util/src/bank-api-client.ts 
b/packages/taler-util/src/bank-api-client.ts
index 9c35af948..51359129d 100644
--- a/packages/taler-util/src/bank-api-client.ts
+++ b/packages/taler-util/src/bank-api-client.ts
@@ -45,6 +45,7 @@ import {
   createPlatformHttpLib,
   HttpRequestLibrary,
   readSuccessResponseJsonOrThrow,
+  readTalerErrorResponse,
 } from "@gnu-taler/taler-util/http";
 
 const logger = new Logger("bank-api-client.ts");
@@ -420,7 +421,7 @@ export class TalerCorebankApiClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
diff --git a/packages/taler-util/src/http-client/authentication.ts 
b/packages/taler-util/src/http-client/authentication.ts
index f77df2ed0..b8affee7b 100644
--- a/packages/taler-util/src/http-client/authentication.ts
+++ b/packages/taler-util/src/http-client/authentication.ts
@@ -22,6 +22,7 @@ import {
   HttpRequestLibrary,
   createPlatformHttpLib,
   makeBasicAuthHeader,
+  readTalerErrorResponse,
 } from "../http.js";
 import { LibtoolVersion } from "../libtool-version.js";
 import {
@@ -82,7 +83,7 @@ export class TalerAuthenticationHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -111,7 +112,7 @@ export class TalerAuthenticationHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -130,7 +131,7 @@ export class TalerAuthenticationHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 }
diff --git a/packages/taler-util/src/http-client/bank-conversion.ts 
b/packages/taler-util/src/http-client/bank-conversion.ts
index 3db9df101..cb14d8b34 100644
--- a/packages/taler-util/src/http-client/bank-conversion.ts
+++ b/packages/taler-util/src/http-client/bank-conversion.ts
@@ -18,7 +18,7 @@
  * Imports.
  */
 import { AmountJson, Amounts } from "../amounts.js";
-import { HttpRequestLibrary } from "../http-common.js";
+import { HttpRequestLibrary, readTalerErrorResponse } from "../http-common.js";
 import { HttpStatusCode } from "../http-status-codes.js";
 import { createPlatformHttpLib } from "../http.js";
 import { LibtoolVersion } from "../libtool-version.js";
@@ -94,7 +94,7 @@ export class TalerBankConversionHttpClient {
       case HttpStatusCode.NotImplemented:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -138,7 +138,7 @@ export class TalerBankConversionHttpClient {
       case HttpStatusCode.NotImplemented:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -185,7 +185,7 @@ export class TalerBankConversionHttpClient {
       case HttpStatusCode.NotImplemented:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -217,7 +217,7 @@ export class TalerBankConversionHttpClient {
       case HttpStatusCode.NotImplemented:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 }
diff --git a/packages/taler-util/src/http-client/bank-core.ts 
b/packages/taler-util/src/http-client/bank-core.ts
index 7a98b6281..3ef58b2f4 100644
--- a/packages/taler-util/src/http-client/bank-core.ts
+++ b/packages/taler-util/src/http-client/bank-core.ts
@@ -29,6 +29,7 @@ import {
 import {
   HttpRequestLibrary,
   createPlatformHttpLib,
+  readTalerErrorResponse,
 } from "@gnu-taler/taler-util/http";
 import {
   FailCasesByMethod,
@@ -127,7 +128,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForCoreBankConfig());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -165,31 +166,30 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.Unauthorized:
         return opKnownHttpFailure(resp.status, resp);
       case HttpStatusCode.Conflict: {
-        const body = await resp.json();
-        const details = codecForTalerErrorDetail().decode(body);
+        const details = await readTalerErrorResponse(resp);
         switch (details.code) {
           case TalerErrorCode.BANK_REGISTER_USERNAME_REUSE:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_REGISTER_PAYTO_URI_REUSE:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_UNALLOWED_DEBIT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_RESERVED_USERNAME_CONFLICT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_NON_ADMIN_PATCH_DEBT_LIMIT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_NON_ADMIN_SET_TAN_CHANNEL:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_TAN_CHANNEL_NOT_SUPPORTED:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_MISSING_TAN_INFO:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
   /**
@@ -219,19 +219,18 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       case HttpStatusCode.Conflict: {
-        const body = await resp.json();
-        const details = codecForTalerErrorDetail().decode(body);
+        const details = await readTalerErrorResponse(resp);
         switch (details.code) {
           case TalerErrorCode.BANK_RESERVED_USERNAME_CONFLICT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_ACCOUNT_BALANCE_NOT_ZERO:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -267,25 +266,24 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       case HttpStatusCode.Conflict: {
-        const body = await resp.json();
-        const details = codecForTalerErrorDetail().decode(body);
+        const details = await readTalerErrorResponse(resp);
         switch (details.code) {
           case TalerErrorCode.BANK_NON_ADMIN_PATCH_LEGAL_NAME:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_NON_ADMIN_PATCH_CASHOUT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_NON_ADMIN_PATCH_DEBT_LIMIT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_TAN_CHANNEL_NOT_SUPPORTED:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_MISSING_TAN_INFO:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -321,19 +319,18 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.Unauthorized:
         return opKnownHttpFailure(resp.status, resp);
       case HttpStatusCode.Conflict: {
-        const body = await resp.json();
-        const details = codecForTalerErrorDetail().decode(body);
+        const details = await readTalerErrorResponse(resp);
         switch (details.code) {
           case TalerErrorCode.BANK_NON_ADMIN_PATCH_MISSING_OLD_PASSWORD:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_PATCH_BAD_OLD_PASSWORD:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -361,7 +358,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opFixedSuccess({ public_accounts: [] });
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -393,7 +390,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.Unauthorized:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -417,7 +414,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -455,7 +452,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -482,7 +479,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.Unauthorized:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -520,23 +517,22 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       case HttpStatusCode.Conflict: {
-        const body = await resp.json();
-        const details = codecForTalerErrorDetail().decode(body);
+        const details = await readTalerErrorResponse(resp);
         switch (details.code) {
           case TalerErrorCode.BANK_ADMIN_CREDITOR:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_SAME_ACCOUNT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_UNKNOWN_CREDITOR:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_UNALLOWED_DEBIT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -574,7 +570,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.Unauthorized:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -609,21 +605,20 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       case HttpStatusCode.Conflict: {
-        const body = await resp.json();
-        const details = codecForTalerErrorDetail().decode(body);
+        const details = await readTalerErrorResponse(resp);
         switch (details.code) {
           case TalerErrorCode.BANK_CONFIRM_ABORT_CONFLICT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_CONFIRM_INCOMPLETE:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_UNALLOWED_DEBIT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -653,7 +648,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -687,7 +682,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -725,35 +720,33 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       case HttpStatusCode.Conflict: {
-        const body = await resp.json();
-        const details = codecForTalerErrorDetail().decode(body);
+        const details = await readTalerErrorResponse(resp);
         switch (details.code) {
           case TalerErrorCode.BANK_TRANSFER_REQUEST_UID_REUSED:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_BAD_CONVERSION:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_UNALLOWED_DEBIT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_CONFIRM_INCOMPLETE:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       case HttpStatusCode.BadGateway: {
-        const body = await resp.json();
-        const details = codecForTalerErrorDetail().decode(body);
+        const details = await readTalerErrorResponse(resp);
         switch (details.code) {
           case TalerErrorCode.BANK_TAN_CHANNEL_SCRIPT_FAILED:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       case HttpStatusCode.NotImplemented:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -780,7 +773,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotImplemented:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -805,7 +798,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotImplemented:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -830,7 +823,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotImplemented:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -861,17 +854,16 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       case HttpStatusCode.BadGateway: {
-        const body = await resp.json();
-        const details = codecForTalerErrorDetail().decode(body);
+        const details = await readTalerErrorResponse(resp);
         switch (details.code) {
           case TalerErrorCode.BANK_TAN_CHANNEL_SCRIPT_FAILED:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -903,21 +895,20 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       case HttpStatusCode.Conflict: {
-        const body = await resp.json();
-        const details = codecForTalerErrorDetail().decode(body);
+        const details = await readTalerErrorResponse(resp);
         switch (details.code) {
           case TalerErrorCode.BANK_TAN_CHALLENGE_EXPIRED:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_TAN_CHALLENGE_FAILED:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       case HttpStatusCode.TooManyRequests:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -960,7 +951,7 @@ export class TalerCoreBankHttpClient {
       case HttpStatusCode.Unauthorized:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
diff --git a/packages/taler-util/src/http-client/bank-integration.ts 
b/packages/taler-util/src/http-client/bank-integration.ts
index f63fa4445..75e6a627a 100644
--- a/packages/taler-util/src/http-client/bank-integration.ts
+++ b/packages/taler-util/src/http-client/bank-integration.ts
@@ -14,7 +14,7 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { HttpRequestLibrary } from "../http-common.js";
+import { HttpRequestLibrary, readTalerErrorResponse } from "../http-common.js";
 import { HttpStatusCode } from "../http-status-codes.js";
 import { createPlatformHttpLib } from "../http.js";
 import { LibtoolVersion } from "../libtool-version.js";
@@ -79,7 +79,7 @@ export class TalerBankIntegrationHttpClient {
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForIntegrationBankConfig());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -110,7 +110,7 @@ export class TalerBankIntegrationHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -136,23 +136,23 @@ export class TalerBankIntegrationHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       case HttpStatusCode.Conflict: {
-        const body = await resp.json();
+        const body = await readTalerErrorResponse(resp);
         const details = codecForTalerErrorDetail().decode(body);
         switch (details.code) {
           case 
TalerErrorCode.BANK_WITHDRAWAL_OPERATION_RESERVE_SELECTION_CONFLICT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_DUPLICATE_RESERVE_PUB_SUBJECT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_UNKNOWN_ACCOUNT:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           case TalerErrorCode.BANK_ACCOUNT_IS_NOT_EXCHANGE:
-            return opKnownTalerFailure(details.code, resp);
+            return opKnownTalerFailure(details.code, details);
           default:
-            return opUnknownFailure(resp, body);
+            return opUnknownFailure(resp, details);
         }
       }
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -173,7 +173,7 @@ export class TalerBankIntegrationHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 }
diff --git a/packages/taler-util/src/http-client/bank-revenue.ts 
b/packages/taler-util/src/http-client/bank-revenue.ts
index 3b6b3c258..d2f0c7000 100644
--- a/packages/taler-util/src/http-client/bank-revenue.ts
+++ b/packages/taler-util/src/http-client/bank-revenue.ts
@@ -14,7 +14,7 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { HttpRequestLibrary, makeBasicAuthHeader } from "../http-common.js";
+import { HttpRequestLibrary, makeBasicAuthHeader, readTalerErrorResponse } 
from "../http-common.js";
 import { HttpStatusCode } from "../http-status-codes.js";
 import { createPlatformHttpLib } from "../http.js";
 import {
@@ -98,7 +98,7 @@ export class TalerRevenueHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 }
diff --git a/packages/taler-util/src/http-client/bank-wire.ts 
b/packages/taler-util/src/http-client/bank-wire.ts
index 54211fef7..a8c976a80 100644
--- a/packages/taler-util/src/http-client/bank-wire.ts
+++ b/packages/taler-util/src/http-client/bank-wire.ts
@@ -14,7 +14,7 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { HttpRequestLibrary, makeBasicAuthHeader } from "../http-common.js";
+import { HttpRequestLibrary, makeBasicAuthHeader, readTalerErrorResponse } 
from "../http-common.js";
 import { HttpStatusCode } from "../http-status-codes.js";
 import { createPlatformHttpLib } from "../http.js";
 import {
@@ -77,7 +77,7 @@ export class TalerWireGatewayHttpClient {
   //   });
   //   switch (resp.status) {
   //     case HttpStatusCode.Ok: return opSuccess(resp, 
codecForCoreBankConfig())
-  //     default: return opUnknownFailure(resp, await resp.text())
+  //     default: return opUnknownFailure(resp, await 
readTalerErrorResponse(resp))
   //   }
   // }
 
@@ -108,7 +108,7 @@ export class TalerWireGatewayHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -147,7 +147,7 @@ export class TalerWireGatewayHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -186,7 +186,7 @@ export class TalerWireGatewayHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -220,7 +220,7 @@ export class TalerWireGatewayHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 }
diff --git a/packages/taler-util/src/http-client/exchange.ts 
b/packages/taler-util/src/http-client/exchange.ts
index c61ba1f8d..befde4d20 100644
--- a/packages/taler-util/src/http-client/exchange.ts
+++ b/packages/taler-util/src/http-client/exchange.ts
@@ -1,4 +1,4 @@
-import { HttpRequestLibrary } from "../http-common.js";
+import { HttpRequestLibrary, readTalerErrorResponse } from "../http-common.js";
 import { HttpStatusCode } from "../http-status-codes.js";
 import { createPlatformHttpLib } from "../http.js";
 import { LibtoolVersion } from "../libtool-version.js";
@@ -72,7 +72,7 @@ export class TalerExchangeHttpClient {
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForExchangeConfig());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
   /**
@@ -89,7 +89,7 @@ export class TalerExchangeHttpClient {
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForExchangeKeys());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -136,7 +136,7 @@ export class TalerExchangeHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -169,7 +169,7 @@ export class TalerExchangeHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -203,7 +203,7 @@ export class TalerExchangeHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 }
diff --git a/packages/taler-util/src/http-client/merchant.ts 
b/packages/taler-util/src/http-client/merchant.ts
index 7efa90a5f..5fd001555 100644
--- a/packages/taler-util/src/http-client/merchant.ts
+++ b/packages/taler-util/src/http-client/merchant.ts
@@ -62,6 +62,7 @@ import {
   HttpRequestLibrary,
   HttpResponse,
   createPlatformHttpLib,
+  readTalerErrorResponse,
 } from "@gnu-taler/taler-util/http";
 import { opSuccessFromHttp, opUnknownFailure } from "../operation.js";
 import {
@@ -127,7 +128,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForMerchantConfig());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -154,7 +155,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -193,7 +194,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.GatewayTimeout:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -255,7 +256,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotAcceptable:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -280,7 +281,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -308,7 +309,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -336,7 +337,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -371,7 +372,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -399,7 +400,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -423,7 +424,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForQueryInstancesResponse());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -456,7 +457,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -500,7 +501,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.GatewayTimeout:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -532,7 +533,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -561,7 +562,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -586,7 +587,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -611,7 +612,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -636,7 +637,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -666,7 +667,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -698,7 +699,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -725,7 +726,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -750,7 +751,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -778,7 +779,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Gone:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -805,7 +806,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -848,7 +849,7 @@ export class TalerMerchantInstanceHttpClient {
           codecForOutOfStockResponse(),
         );
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -894,7 +895,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForOrderHistory());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -944,7 +945,7 @@ export class TalerMerchantInstanceHttpClient {
           codecForOutOfStockResponse(),
         );
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -976,7 +977,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1003,7 +1004,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1039,7 +1040,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1071,7 +1072,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1111,7 +1112,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForTansferList());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1138,7 +1139,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1168,7 +1169,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1199,7 +1200,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1223,7 +1224,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1258,7 +1259,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1282,7 +1283,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1311,7 +1312,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1342,7 +1343,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1366,7 +1367,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1390,7 +1391,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1414,7 +1415,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1433,7 +1434,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1480,7 +1481,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1512,7 +1513,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1537,7 +1538,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1561,7 +1562,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1585,7 +1586,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1615,7 +1616,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1644,7 +1645,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1669,7 +1670,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1694,7 +1695,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1718,7 +1719,7 @@ export class TalerMerchantInstanceHttpClient {
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1786,7 +1787,7 @@ export class TalerMerchantManagementHttpClient extends 
TalerMerchantInstanceHttp
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1816,7 +1817,7 @@ export class TalerMerchantManagementHttpClient extends 
TalerMerchantInstanceHttp
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1845,7 +1846,7 @@ export class TalerMerchantManagementHttpClient extends 
TalerMerchantInstanceHttp
       case HttpStatusCode.NotFound:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1868,7 +1869,7 @@ export class TalerMerchantManagementHttpClient extends 
TalerMerchantInstanceHttp
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForInstancesResponse());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1892,7 +1893,7 @@ export class TalerMerchantManagementHttpClient extends 
TalerMerchantInstanceHttp
       case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForQueryInstancesResponse());
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1924,7 +1925,7 @@ export class TalerMerchantManagementHttpClient extends 
TalerMerchantInstanceHttp
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 
@@ -1968,7 +1969,7 @@ export class TalerMerchantManagementHttpClient extends 
TalerMerchantInstanceHttp
       case HttpStatusCode.Conflict:
         return opKnownHttpFailure(resp.status, resp);
       default:
-        return opUnknownFailure(resp, await resp.text());
+        return opUnknownFailure(resp, await readTalerErrorResponse(resp));
     }
   }
 }
diff --git a/packages/taler-util/src/operation.ts 
b/packages/taler-util/src/operation.ts
index 07a216fe9..771f5860b 100644
--- a/packages/taler-util/src/operation.ts
+++ b/packages/taler-util/src/operation.ts
@@ -138,22 +138,21 @@ export async function opKnownHttpFailure<T extends 
HttpStatusCode>(
   return { type: "fail", case: s, detail };
 }
 
-export async function opKnownTalerFailure<T extends TalerErrorCode>(
+export function opKnownTalerFailure<T extends TalerErrorCode>(
   s: T,
-  resp: HttpResponse,
-): Promise<OperationFail<T>> {
-  const detail = await readTalerErrorResponse(resp);
+  detail: TalerErrorDetail,
+): OperationFail<T> {
   return { type: "fail", case: s, detail };
 }
 
-export function opUnknownFailure(resp: HttpResponse, text: string): never {
+export function opUnknownFailure(resp: HttpResponse, error: TalerErrorDetail): 
never {
   throw TalerError.fromDetail(
     TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR,
     {
       requestUrl: resp.requestUrl,
       requestMethod: resp.requestMethod,
       httpStatusCode: resp.status,
-      errorResponse: text,
+      errorResponse: error,
     },
     `Unexpected HTTP status ${resp.status} in response`,
   );
@@ -184,10 +183,10 @@ export type ResultByMethod<
   p extends keyof TT,
 > = TT[p] extends (...args: any[]) => infer Ret
   ? Ret extends Promise<infer Result>
-    ? Result extends OperationResult<any, any>
-      ? Result
-      : never
-    : never //api always use Promises
+  ? Result extends OperationResult<any, any>
+  ? Result
+  : never
+  : never //api always use Promises
   : never; //error cases just for functions
 
 export type FailCasesByMethod<TT extends object, p extends keyof TT> = Exclude<
diff --git a/packages/taler-util/src/taler-error-codes.ts 
b/packages/taler-util/src/taler-error-codes.ts
index 2c65255df..822388e2b 100644
--- a/packages/taler-util/src/taler-error-codes.ts
+++ b/packages/taler-util/src/taler-error-codes.ts
@@ -22,6 +22,9 @@
  */
 
 export enum TalerErrorCode {
+  TALER_URI_PREFIX = 1111,
+  TALER_URI_UNKOWN_ACTION = 1111,
+  TALER_URI_NO_ENOUGH_COMPONENT = 1112,
   /**
    * Special code to indicate success (no error).
    * Returned with an HTTP status code of #MHD_HTTP_UNINITIALIZED (0).
diff --git a/packages/taler-util/src/taleruri.ts 
b/packages/taler-util/src/taleruri.ts
index 97b82c061..b56295c3f 100644
--- a/packages/taler-util/src/taleruri.ts
+++ b/packages/taler-util/src/taleruri.ts
@@ -27,7 +27,8 @@ import { Codec, Context, DecodingError, renderContext } from 
"./codec.js";
 import { canonicalizeBaseUrl } from "./helpers.js";
 import { AmountString } from "./taler-types.js";
 import { URL, URLSearchParams } from "./url.js";
-
+import { opFixedSuccess, opKnownTalerFailure } from "./operation.js";
+import { TalerErrorCode } from "./taler-error-codes.js";
 /**
  * A parsed taler URI.
  */
@@ -130,15 +131,17 @@ export interface WithdrawExchangeUri {
  * Parse a taler[+http]://withdraw URI.
  * Return undefined if not passed a valid URI.
  */
-export function parseWithdrawUri(s: string): WithdrawUriResult | undefined {
-  const pi = parseProtoInfo(s, "withdraw");
-  if (!pi) {
-    return undefined;
+export function parseWithdrawUriWithError(s: string) {
+  const pi = parseProtoInfoWithError(s, "withdraw");
+  if (pi.type === "fail") {
+    return pi;
   }
-  const parts = pi.rest.split("/");
+  const parts = pi.body.rest.split("/");
 
   if (parts.length < 2) {
-    return undefined;
+    return opKnownTalerFailure(TalerErrorCode.TALER_URI_NO_ENOUGH_COMPONENT, {
+      code: TalerErrorCode.TALER_URI_NO_ENOUGH_COMPONENT
+    });
   }
 
   const host = parts[0].toLowerCase();
@@ -153,11 +156,22 @@ export function parseWithdrawUri(s: string): 
WithdrawUriResult | undefined {
   const withdrawId = parts[parts.length - 1];
   const p = [host, ...pathSegments].join("/");
 
-  return {
+  const result: WithdrawUriResult = {
     type: TalerUriAction.Withdraw,
-    bankIntegrationApiBaseUrl: canonicalizeBaseUrl(`${pi.innerProto}://${p}/`),
+    bankIntegrationApiBaseUrl: 
canonicalizeBaseUrl(`${pi.body.innerProto}://${p}/`),
     withdrawalOperationId: withdrawId,
-  };
+  }
+  return opFixedSuccess(result);
+}
+
+/**
+ * 
+ * @deprecated use parseWithdrawUriWithError
+ */
+export function parseWithdrawUri(s: string): WithdrawUriResult | undefined {
+  const r = parseWithdrawUriWithError(s);
+  if (r.type === "fail") return undefined;
+  return r.body;
 }
 
 /**
@@ -215,6 +229,35 @@ function parseProtoInfo(
   }
 }
 
+function parseProtoInfoWithError(
+  s: string,
+  action: string,
+) {
+  if (!s.toLocaleLowerCase().startsWith("taler://") ||
+    !s.toLocaleLowerCase().startsWith("taler+http://";)) {
+    return opKnownTalerFailure(TalerErrorCode.TALER_URI_PREFIX, {
+      code: TalerErrorCode.TALER_URI_PREFIX,
+    });
+  }
+  const pfxPlain = `taler://${action}/`;
+  const pfxHttp = `taler+http://${action}/`;
+  if (s.toLowerCase().startsWith(pfxPlain)) {
+    return opFixedSuccess({
+      innerProto: "https",
+      rest: s.substring(pfxPlain.length),
+    });
+  } else if (s.toLowerCase().startsWith(pfxHttp)) {
+    return opFixedSuccess({
+      innerProto: "http",
+      rest: s.substring(pfxHttp.length),
+    });
+  } else {
+    return opKnownTalerFailure(TalerErrorCode.TALER_URI_UNKOWN_ACTION, {
+      code: TalerErrorCode.TALER_URI_UNKOWN_ACTION,
+    });
+  }
+}
+
 type Parser = (s: string) => TalerUri | undefined;
 const parsers: { [A in TalerUriAction]: Parser } = {
   [TalerUriAction.Pay]: parsePayUri,
diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts 
b/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts
index 05aef690e..51859d6a7 100644
--- a/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts
+++ b/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts
@@ -54,7 +54,7 @@ export function useComponentStateFromParams({
       : undefined;
     const exchangeByTalerUri = uri?.exchangeBaseUrl;
     let ex: ExchangeFullDetails | undefined;
-    if (exchangeByTalerUri && uri.exchangePub) {
+    if (exchangeByTalerUri) {
       await api.wallet.call(WalletApiOperation.AddExchange, {
         exchangeBaseUrl: exchangeByTalerUri,
         masterPub: uri.exchangePub,
@@ -141,8 +141,8 @@ export function useComponentStateFromParams({
         confirm: {
           onClick: isValid
             ? pushAlertOnError(async () => {
-                onAmountChanged(Amounts.stringify(amount));
-              })
+              onAmountChanged(Amounts.stringify(amount));
+            })
             : undefined,
         },
         amount: {
@@ -439,12 +439,12 @@ function exchangeSelectionState(
     //TODO: calculate based on exchange info
     const ageRestriction = ageRestrictionEnabled
       ? {
-          list: ageRestrictionOptions,
-          value: String(ageRestricted),
-          onChange: pushAlertOnError(async (v: string) =>
-            setAgeRestricted(parseInt(v, 10)),
-          ),
-        }
+        list: ageRestrictionOptions,
+        value: String(ageRestricted),
+        onChange: pushAlertOnError(async (v: string) =>
+          setAgeRestricted(parseInt(v, 10)),
+        ),
+      }
       : undefined;
 
     const altCurrencies = amountHook.response.accounts
@@ -463,9 +463,9 @@ function exchangeSelectionState(
     const conversionInfo = !convAccount
       ? undefined
       : {
-          spec: convAccount.currencySpecification!,
-          amount: Amounts.parseOrThrow(convAccount.transferAmount!),
-        };
+        spec: convAccount.currencySpecification!,
+        amount: Amounts.parseOrThrow(convAccount.transferAmount!),
+      };
 
     return {
       status: "success",

-- 
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]