not found page
This commit is contained in:
@@ -123,8 +123,7 @@ func (s *webpageRouter) serveTemplate(c *gin.Context) (response.Response, error)
|
||||
r := c.Request
|
||||
ctx := r.Context()
|
||||
|
||||
b, err := s.templater.Execute(
|
||||
strings.Trim(r.URL.Path, "/"),
|
||||
args := []any{
|
||||
"Request",
|
||||
r,
|
||||
// add services and data here
|
||||
@@ -142,24 +141,36 @@ func (s *webpageRouter) serveTemplate(c *gin.Context) (response.Response, error)
|
||||
middleware.GetIdentity(ctx),
|
||||
"Auth",
|
||||
newTemplateAuthenticator(r),
|
||||
)
|
||||
}
|
||||
|
||||
b, err := s.templater.Execute(strings.Trim(r.URL.Path, "/"), args...)
|
||||
if err != nil {
|
||||
return s.handleTemplateError(err)
|
||||
if isFileNotFoundError(err) || isInvalidWildcardValue(err) {
|
||||
werr := response.NotFound().
|
||||
Wrap(ErrTemplateNotFound{
|
||||
err: err,
|
||||
}).
|
||||
Msg("resource not found")
|
||||
|
||||
nfb, nferr := s.templater.Execute("not-found", args...)
|
||||
if nferr != nil {
|
||||
s.log.Error("failed to render not-found page: %v", nferr)
|
||||
return nil, werr
|
||||
}
|
||||
|
||||
return nil, werr.
|
||||
HTML(nfb)
|
||||
}
|
||||
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return response.HTML(b), nil
|
||||
}
|
||||
|
||||
func (s *webpageRouter) handleTemplateError(err error) (response.Response, error) {
|
||||
if isFileNotFoundError(err) {
|
||||
return nil, response.NotFound().
|
||||
Wrap(ErrTemplateNotFound{
|
||||
err: err,
|
||||
}).
|
||||
Msg("resource not found")
|
||||
}
|
||||
|
||||
return nil, err
|
||||
func isInvalidWildcardValue(err error) bool {
|
||||
var te *templater.ErrInvalidWildcardValue
|
||||
return errors.As(err, &te)
|
||||
}
|
||||
|
||||
func isFileNotFoundError(err error) bool {
|
||||
|
||||
@@ -14,6 +14,7 @@ type (
|
||||
err error
|
||||
msg string
|
||||
status int
|
||||
html []byte
|
||||
}
|
||||
)
|
||||
|
||||
@@ -77,6 +78,11 @@ func (e ErrorResponse) Wrap(err error) ErrorResponse {
|
||||
return e
|
||||
}
|
||||
|
||||
func (e ErrorResponse) HTML(h []byte) ErrorResponse {
|
||||
e.html = h
|
||||
return e
|
||||
}
|
||||
|
||||
// error implementation
|
||||
|
||||
func (e ErrorResponse) Error() string {
|
||||
@@ -130,6 +136,19 @@ func (e ErrorResponse) GetMsg() (string, bool) {
|
||||
return "", false
|
||||
}
|
||||
|
||||
func (e ErrorResponse) GetHTML() ([]byte, bool) {
|
||||
if len(e.html) != 0 {
|
||||
return e.html, true
|
||||
}
|
||||
|
||||
ce, ok := GetError(e.err)
|
||||
if ok {
|
||||
return ce.GetHTML()
|
||||
}
|
||||
|
||||
return nil, false
|
||||
}
|
||||
|
||||
func GetError(err error) (e ErrorResponse, ok bool) {
|
||||
ok = errors.As(err, &e)
|
||||
return e, ok
|
||||
|
||||
@@ -52,7 +52,14 @@ func Write(c *gin.Context, res Response) {
|
||||
}
|
||||
|
||||
func WriteError(c *gin.Context, err error) {
|
||||
c.String(GetStatusFromError(err), err.Error())
|
||||
status := GetStatusFromError(err)
|
||||
if h, ok := GetHTMLFromError(err); ok {
|
||||
c.Status(status)
|
||||
c.Header("Content-Type", "text/html")
|
||||
c.Writer.Write(h)
|
||||
} else {
|
||||
c.String(status, err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func GetStatusFromError(err error) int {
|
||||
@@ -66,3 +73,12 @@ func GetStatusFromError(err error) int {
|
||||
|
||||
return status
|
||||
}
|
||||
|
||||
func GetHTMLFromError(err error) ([]byte, bool) {
|
||||
e, ok := GetError(err)
|
||||
if !ok {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
return e.GetHTML()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user