From cfe7129c4ecaa3057d5e47040f0a9efd8ed0317e Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 7 Apr 2023 18:46:25 -0300 Subject: adding unreadable http response case and removing deprecated fields --- packages/web-util/src/utils/request.ts | 118 ++++++++++----------------------- 1 file changed, 35 insertions(+), 83 deletions(-) (limited to 'packages/web-util/src') diff --git a/packages/web-util/src/utils/request.ts b/packages/web-util/src/utils/request.ts index d05a4ec84..8c77814f7 100644 --- a/packages/web-util/src/utils/request.ts +++ b/packages/web-util/src/utils/request.ts @@ -20,6 +20,7 @@ import { base64encode } from "./base64.js"; export enum ErrorType { CLIENT, SERVER, + UNREADABLE, TIMEOUT, UNEXPECTED, } @@ -97,12 +98,9 @@ export async function defaultRequestHandler( url: _url.href, hasToken: !!options.token, status: 0, + options, }; const error: HttpRequestTimeoutError = { - clientError: true, - isNotfound: false, - isUnauthorized: false, - error: undefined, info, type: ErrorType.TIMEOUT, message: "Request timeout", @@ -124,6 +122,7 @@ export async function defaultRequestHandler( _url.href, payload, !!options.token, + options, ); return result; } else { @@ -132,6 +131,7 @@ export async function defaultRequestHandler( _url.href, payload, !!options.token, + options, ); throw new RequestError(error); } @@ -152,6 +152,7 @@ export interface RequestInfo { hasToken: boolean; payload: any; status: number; + options: RequestOptions; } interface HttpResponseLoading { @@ -185,103 +186,60 @@ export type HttpError = | HttpRequestTimeoutError | HttpResponseClientError | HttpResponseServerError + | HttpResponseUnreadableError | HttpResponseUnexpectedError; export interface HttpResponseServerError { ok?: false; loading?: false; - /** - * @deprecated use status - */ - clientError?: false; - /** - * @deprecated use status - */ - serverError: true; type: ErrorType.SERVER; - /** - * @deprecated use payload - */ - error: ErrorDetail; payload: ErrorDetail; status: HttpStatusCode; message: string; - info?: RequestInfo; + info: RequestInfo; } interface HttpRequestTimeoutError { ok?: false; loading?: false; - /** - * @deprecated use type - */ - clientError: true; - /** - * @deprecated use type - */ - serverError?: false; type: ErrorType.TIMEOUT; - info?: RequestInfo; - error: undefined; + info: RequestInfo; - isUnauthorized: false; - isNotfound: false; message: string; } interface HttpResponseClientError { ok?: false; loading?: false; - /** - * @deprecated use type - */ - clientError: true; - /** - * @deprecated use type - */ - serverError?: false; type: ErrorType.CLIENT; - info?: RequestInfo; - /** - * @deprecated use status - */ - isUnauthorized: boolean; - /** - * @deprecated use status - */ - isNotfound: boolean; + info: RequestInfo; status: HttpStatusCode; - /** - * @deprecated use payload - */ - error: ErrorDetail; payload: ErrorDetail; message: string; } interface HttpResponseUnexpectedError { ok?: false; - loading?: false; - /** - * @deprecated use type - */ - clientError?: false; - /** - * @deprecated use type - */ - serverError?: false; + loading: false; type: ErrorType.UNEXPECTED; - info?: RequestInfo; + info: RequestInfo; status?: HttpStatusCode; - /** - * @deprecated use exception - */ - error: unknown; exception: unknown; message: string; } +interface HttpResponseUnreadableError { + ok?: false; + loading: false; + type: ErrorType.UNREADABLE; + + info: RequestInfo; + status: HttpStatusCode; + exception: unknown; + body: string; + message: string; +} export class RequestError extends Error { /** * @deprecated use cause @@ -317,6 +275,7 @@ async function buildRequestOk( url: string, payload: any, hasToken: boolean, + options: RequestOptions, ): Promise> { const dataTxt = await response.text(); const data = dataTxt ? JSON.parse(dataTxt) : undefined; @@ -327,6 +286,7 @@ async function buildRequestOk( payload, url, hasToken, + options, status: response.status, }, }; @@ -337,9 +297,11 @@ async function buildRequestFailed( url: string, payload: any, hasToken: boolean, + options: RequestOptions, ): Promise< | HttpResponseClientError | HttpResponseServerError + | HttpResponseUnreadableError | HttpResponseUnexpectedError > { const status = response?.status; @@ -348,62 +310,52 @@ async function buildRequestFailed( payload, url, hasToken, + options, status: status || 0, }; + const dataTxt = await response.text(); try { - const dataTxt = await response.text(); const data = dataTxt ? JSON.parse(dataTxt) : undefined; if (status && status >= 400 && status < 500) { const error: HttpResponseClientError = { - clientError: true, - isNotfound: status === 404, - isUnauthorized: status === 401, type: ErrorType.CLIENT, status, info, message: data?.hint, - error: data, // remove this payload: data, }; return error; } if (status && status >= 500 && status < 600) { const error: HttpResponseServerError = { - serverError: true, type: ErrorType.SERVER, status, info, message: `${data?.hint} (code ${data?.code})`, - error: data, //remove this payload: data, }; return error; } return { info, + loading: false, type: ErrorType.UNEXPECTED, status, - error: {}, // remove this exception: undefined, - message: "NOT DEFINED", + message: `http status code not handled: ${status}`, }; } catch (ex) { - const error: HttpResponseUnexpectedError = { + const error: HttpResponseUnreadableError = { info, + loading: false, status, - type: ErrorType.UNEXPECTED, - error: ex, + type: ErrorType.UNREADABLE, exception: ex, - message: "NOT DEFINED", + body: dataTxt, + message: "Could not parse body as json", }; return error; } } - -// export function isAxiosError( -// error: AxiosError | any, -// ): error is AxiosError { -// return error && error.isAxiosError; -// } -- cgit v1.2.3