From 7330f0daf907133876baf8831c44ec34cec326e5 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 18 Apr 2023 14:58:34 -0300 Subject: [PATCH] catch json parsing problem and report nicely --- packages/taler-util/src/http-common.ts | 83 ++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 5 deletions(-) diff --git a/packages/taler-util/src/http-common.ts b/packages/taler-util/src/http-common.ts index 1329c8a55..9aaad12c7 100644 --- a/packages/taler-util/src/http-common.ts +++ b/packages/taler-util/src/http-common.ts @@ -139,7 +139,22 @@ type ResponseOrError = export async function readTalerErrorResponse( httpResponse: HttpResponse, ): Promise { - const errJson = await httpResponse.json(); + let errJson; + try { + errJson = await httpResponse.json(); + } catch (e: any) { + throw TalerError.fromDetail( + TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, + { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + validationError: e.toString(), + }, + "Couldn't parse JSON format from error response", + ); + } + const talerErrorCode = errJson.code; if (typeof talerErrorCode !== "number") { logger.warn( @@ -163,7 +178,21 @@ export async function readTalerErrorResponse( export async function readUnexpectedResponseDetails( httpResponse: HttpResponse, ): Promise { - const errJson = await httpResponse.json(); + let errJson; + try { + errJson = await httpResponse.json(); + } catch (e: any) { + throw TalerError.fromDetail( + TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, + { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + validationError: e.toString(), + }, + "Couldn't parse JSON format from error response", + ); + } const talerErrorCode = errJson.code; if (typeof talerErrorCode !== "number") { return makeErrorDetail( @@ -198,7 +227,21 @@ export async function readSuccessResponseJsonOrErrorCode( talerErrorResponse: await readTalerErrorResponse(httpResponse), }; } - const respJson = await httpResponse.json(); + let respJson; + try { + respJson = await httpResponse.json(); + } catch (e: any) { + throw TalerError.fromDetail( + TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, + { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + validationError: e.toString(), + }, + "Couldn't parse JSON format from response", + ); + } let parsedResponse: T; try { parsedResponse = codec.decode(respJson); @@ -267,7 +310,22 @@ export async function readSuccessResponseTextOrErrorCode( httpResponse: HttpResponse, ): Promise> { if (!(httpResponse.status >= 200 && httpResponse.status < 300)) { - const errJson = await httpResponse.json(); + let errJson; + try { + errJson = await httpResponse.json(); + } catch (e: any) { + throw TalerError.fromDetail( + TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, + { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + validationError: e.toString(), + }, + "Couldn't parse JSON format from error response", + ); + } + const talerErrorCode = errJson.code; if (typeof talerErrorCode !== "number") { throw TalerError.fromDetail( @@ -296,7 +354,22 @@ export async function checkSuccessResponseOrThrow( httpResponse: HttpResponse, ): Promise { if (!(httpResponse.status >= 200 && httpResponse.status < 300)) { - const errJson = await httpResponse.json(); + let errJson; + try { + errJson = await httpResponse.json(); + } catch (e: any) { + throw TalerError.fromDetail( + TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, + { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + validationError: e.toString(), + }, + "Couldn't parse JSON format from error response", + ); + } + const talerErrorCode = errJson.code; if (typeof talerErrorCode !== "number") { throw TalerError.fromDetail(