diff --git a/middleware/error.go b/middleware/error.go index 566b658a..d154a09b 100644 --- a/middleware/error.go +++ b/middleware/error.go @@ -13,8 +13,8 @@ var ( VERSION string ) var tpl = ` - - + + beego application error @@ -28,10 +28,10 @@ var tpl = ` #content .stack pre{padding-left: 10px;} table {} td.t {text-align: right; padding-right: 5px; color: #888;} - + - + - + ` func ShowErr(err interface{}, rw http.ResponseWriter, r *http.Request, Stack string) { @@ -262,6 +262,10 @@ func InternalServerError(rw http.ResponseWriter, r *http.Request) { t.Execute(rw, data) } +func SimpleServerError(rw http.ResponseWriter, r *http.Request) { + http.Error(rw, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) +} + func Errorhandler(err string, h http.HandlerFunc) { ErrorMaps[err] = h } diff --git a/router.go b/router.go index 294dbecd..0cd668a0 100644 --- a/router.go +++ b/router.go @@ -368,8 +368,8 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) if _, ok := err.(middleware.HTTPException); ok { // catch intented errors, only for HTTP 4XX and 5XX } else { - errstr := fmt.Sprint(err) - if handler, ok := middleware.ErrorMaps[errstr]; ok && ErrorsShow { + if ErrorsShow { + handler := p.getErrorHandler(fmt.Sprint(err)) handler(rw, r) } else { if !RecoverPanic { @@ -865,6 +865,24 @@ Admin: } } +// there always should be error handler that sets error code accordingly for all unhandled errors +// in order to have custom UI for error page it's necessary to override "500" error +func (p *ControllerRegistor) getErrorHandler(errorCode string) func(rw http.ResponseWriter, r *http.Request) { + handler := middleware.SimpleServerError + ok := true + if errorCode != "" { + handler, ok = middleware.ErrorMaps[errorCode] + if !ok { + handler, ok = middleware.ErrorMaps["500"] + } + if !ok || handler == nil { + handler = middleware.SimpleServerError + } + } + + return handler +} + //responseWriter is a wrapper for the http.ResponseWriter //started set to true if response was written to then don't execute other handler type responseWriter struct {