Files
oslstats/internal/handlers/errorpage.go
2026-02-09 19:30:47 +11:00

81 lines
2.2 KiB
Go

package handlers
import (
"net/http"
"git.haelnorr.com/h/golib/hws"
"git.haelnorr.com/h/oslstats/internal/notify"
baseview "git.haelnorr.com/h/oslstats/internal/view/baseview"
)
func ErrorPage(hwsError hws.HWSError) (hws.ErrorPage, error) {
// Determine if this status code should show technical details
showDetails := shouldShowDetails(hwsError.StatusCode)
// Get the user-friendly message
message := hwsError.Message
if message == "" {
// Fallback to default messages if no custom message provided
message = getDefaultMessage(hwsError.StatusCode)
}
// Get technical details if applicable
var details string
if showDetails && hwsError.Error != nil {
details = notify.FormatErrorDetails(hwsError.Error)
}
// Render appropriate template
if details != "" {
return baseview.ErrorPageWithDetails(
hwsError.StatusCode,
http.StatusText(hwsError.StatusCode),
message,
details,
), nil
}
return baseview.ErrorPage(
hwsError.StatusCode,
http.StatusText(hwsError.StatusCode),
message,
), nil
}
// shouldShowDetails determines if a status code should display technical details
func shouldShowDetails(statusCode int) bool {
switch statusCode {
case 400, 418, 500, 503: // Bad Request, Internal Server Error, Service Unavailable
return true
case 401, 403, 404: // Unauthorized, Forbidden, Not Found
return false
default:
// For unknown codes, show details for 5xx errors
return statusCode >= 500
}
}
// getDefaultMessage provides fallback messages for status codes
func getDefaultMessage(statusCode int) string {
messages := map[int]string{
400: "The request you made was malformed or unexpected.",
401: "You need to login to view this page.",
403: "You do not have permission to view this page.",
404: "The page or resource you have requested does not exist.",
418: "I'm a teapot!",
500: `An error occurred on the server. Please try again, and if this
continues to happen contact an administrator.`,
503: "The server is currently down for maintenance and should be back soon. =)",
}
msg, exists := messages[statusCode]
if !exists {
if statusCode >= 500 {
return "A server error occurred. Please try again later."
}
return "An error occurred while processing your request."
}
return msg
}