From d9ac388761314579f6c2e8ebd16ef1bcb625ed00 Mon Sep 17 00:00:00 2001 From: dalbodeule <11470513+dalbodeule@users.noreply.github.com> Date: Wed, 3 Dec 2025 01:38:11 +0900 Subject: [PATCH] [feat](server): add 502 Bad Gateway support and improve error page handling - Introduced handling for `502 Bad Gateway` errors with a dedicated HTML template. - Updated `writeErrorPage` logic to include 502 and other new status mappings for custom templates. - Improved error page rendering by mapping 4xx/5xx status codes to appropriate templates. --- cmd/server/main.go | 32 ++++++++++++++++++++++---- internal/errorpages/templates/502.html | 32 ++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 internal/errorpages/templates/502.html diff --git a/cmd/server/main.go b/cmd/server/main.go index f71258b..356cbeb 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -277,8 +277,8 @@ var hopGateOwnedHeaders = map[string]struct{}{ "Referrer-Policy": {}, } -// writeErrorPage 는 주요 HTTP 에러 코드(400/404/500/525)에 대해 정적 HTML 에러 페이지를 렌더링합니다. (ko) -// writeErrorPage renders static HTML error pages for key HTTP error codes (400/404/500/525). (en) +// writeErrorPage 는 주요 HTTP 에러 코드(400/404/500/502/504/525)에 대해 정적 HTML 에러 페이지를 렌더링합니다. (ko) +// writeErrorPage renders static HTML error pages for key HTTP error codes (400/404/500/502/504/525). (en) // // 템플릿 로딩 우선순위: (ko) // 1. HOP_ERROR_PAGES_DIR/.html (또는 ./errors/.html) (ko) @@ -294,9 +294,31 @@ func writeErrorPage(w http.ResponseWriter, r *http.Request, status int) { setSecurityAndIdentityHeaders(w, r) } - // Delegates actual HTML rendering to internal/errorpages. (en) - // 실제 HTML 렌더링은 internal/errorpages 패키지에 위임합니다. (ko) - errorpages.Render(w, r, status) + // 4xx / 5xx 대역에 대한 템플릿 매핑 규칙: (ko) + // - 400 series: 400.html 로 렌더링 (단, 404 는 404.html 사용) (ko) + // - 500 series: 500.html 로 렌더링 (단, 502/504/525 는 개별 템플릿 사용) (ko) + // + // Mapping rules for 4xx / 5xx ranges: (en) + // - 400 series: render using 400.html (except 404 uses 404.html). (en) + // - 500 series: render using 500.html (except 502/504/525 which have dedicated templates). (en) + mapped := status + switch { + case status >= 400 && status < 500: + if status != http.StatusBadRequest && status != http.StatusNotFound { + mapped = http.StatusBadRequest + } + case status >= 500 && status < 600: + if status != http.StatusInternalServerError && + status != http.StatusBadGateway && + status != errorpages.StatusGatewayTimeout && + status != errorpages.StatusTLSHandshakeFailed { + mapped = http.StatusInternalServerError + } + } + + // Delegates actual HTML rendering to internal/errorpages with mapped status. (en) + // 실제 HTML 렌더링은 매핑된 상태 코드로 internal/errorpages 패키지에 위임합니다. (ko) + errorpages.Render(w, r, mapped) } // setSecurityAndIdentityHeaders 는 HopGate 에서 공통으로 추가하는 보안/식별 헤더를 설정합니다. (ko) diff --git a/internal/errorpages/templates/502.html b/internal/errorpages/templates/502.html new file mode 100644 index 0000000..fc46425 --- /dev/null +++ b/internal/errorpages/templates/502.html @@ -0,0 +1,32 @@ + + + + + 502 Bad Gateway - HopGate + + + + +
+
+ HopGate +

HopGate

+
+ +
+ 502 + Bad Gateway +
+ +

+ HopGate could not get a valid response from the backend service.
+ HopGate가 백엔드 서비스로부터 유효한 응답을 받지 못했습니다. +

+ +
+ This may happen when the origin is down, misconfigured, or responding with invalid data.
+ 원본 서버가 다운되었거나 설정이 잘못되었거나, 잘못된 응답을 보내는 경우 발생할 수 있습니다. +
+
+ + \ No newline at end of file