From bcb2f845ea24fe5314ee6ea7af45d42cbde191a3 Mon Sep 17 00:00:00 2001 From: QooQooDass Date: Mon, 1 Jul 2024 11:58:17 +0900 Subject: [PATCH] [#noissue] Handle html error response --- .../v3/packages/hooks/src/api/swrConfigs.ts | 28 ++++++++- .../components/Error/ErrorDetailDialog.tsx | 62 +++++++++++-------- 2 files changed, 62 insertions(+), 28 deletions(-) diff --git a/web-frontend/src/main/v3/packages/hooks/src/api/swrConfigs.ts b/web-frontend/src/main/v3/packages/hooks/src/api/swrConfigs.ts index 753f679aa612..f8b945ee6a46 100644 --- a/web-frontend/src/main/v3/packages/hooks/src/api/swrConfigs.ts +++ b/web-frontend/src/main/v3/packages/hooks/src/api/swrConfigs.ts @@ -1,6 +1,30 @@ import { ErrorResponse } from '@pinpoint-fe/constants'; import { SWRConfiguration } from 'swr'; +export const parseErrorResponse = async (response: Response) => { + const contentType = response.headers.get('content-type'); + + if (contentType?.includes('json')) { + return await response.json(); + } else if (contentType?.includes('text/html')) { + const htmlText = await response.text(); + const parser = new DOMParser(); + const DOM = parser.parseFromString(htmlText, 'text/html'); + const titleElement = DOM.querySelector('h1'); + const traceElement = DOM.querySelector('pre'); + const title = titleElement?.textContent || ''; + const trace = traceElement?.textContent || ''; + + return { + data: {}, + instance: title, + trace, + } as ErrorResponse; + } else { + return new Error('Unsupported content type.'); + } +}; + export const swrConfigs: SWRConfiguration = { suspense: true, revalidateIfStale: false, @@ -12,11 +36,11 @@ export const swrConfigs: SWRConfiguration = { const response = await fetch(urlWithQueryParams); if (!response.ok) { - const error: ErrorResponse = await response.json(); + const error = await parseErrorResponse(response); if (error.data) { // Server API error - throw error; + throw { ...error, url }; } else { // Network error throw new Error('An error occurred while fetching the data.'); diff --git a/web-frontend/src/main/v3/packages/ui/src/components/Error/ErrorDetailDialog.tsx b/web-frontend/src/main/v3/packages/ui/src/components/Error/ErrorDetailDialog.tsx index c18af2808ae2..96e88cd08141 100644 --- a/web-frontend/src/main/v3/packages/ui/src/components/Error/ErrorDetailDialog.tsx +++ b/web-frontend/src/main/v3/packages/ui/src/components/Error/ErrorDetailDialog.tsx @@ -16,7 +16,7 @@ import { HighLightCode } from '../HighLightCode'; import { RxChevronDown, RxChevronUp } from 'react-icons/rx'; export interface ErrorDetailDialogProps { - error: ErrorResponse; + error: ErrorResponse & { url: string }; contentOption?: PopoverPrimitive.PopoverContentProps; contentClassName?: string; } @@ -28,7 +28,7 @@ export const ErrorDetailDialog = ({ }: ErrorDetailDialogProps) => { const [headerOpen, setHeaderOpen] = React.useState(false); const [paremetersOpen, setParametersOpen] = React.useState(false); - const [stackTraceOpen, setStackTraceOpen] = React.useState(false); + const [stackTraceOpen, setStackTraceOpen] = React.useState(true); return ( @@ -48,7 +48,15 @@ export const ErrorDetailDialog = ({
Error Details -

{error?.instance}

+
+ + {error?.instance} + +

{error?.message}

@@ -56,7 +64,7 @@ export const ErrorDetailDialog = ({
Method
-
{error.data.requestInfo.method}
+
{error.data.requestInfo?.method}
- {Object.keys(error.data.requestInfo.headers) - .sort() - .map((key) => { - return ( - -
{key}
-
{error.data.requestInfo.headers[key]}
-
- ); - })} + {error.data.requestInfo?.headers && + Object.keys(error.data.requestInfo.headers) + .sort() + .map((key) => { + return ( + +
{key}
+
{error.data.requestInfo.headers[key]}
+
+ ); + })}
@@ -93,18 +102,19 @@ export const ErrorDetailDialog = ({
- {Object.keys(error.data.requestInfo.parameters) - .sort() - .map((key) => { - return ( - -
{key}
-
- {error.data.requestInfo.parameters[key]} -
-
- ); - })} + {error.data.requestInfo?.parameters && + Object.keys(error.data.requestInfo.parameters) + .sort() + .map((key) => { + return ( + +
{key}
+
+ {error.data.requestInfo.parameters[key]} +
+
+ ); + })}