From 31f862c526c35c7ce2ec2e6de3dc5cc19b5e748e Mon Sep 17 00:00:00 2001 From: vadimi Date: Sun, 15 Dec 2013 13:17:27 -0500 Subject: [PATCH] Panic template execution errors to show error pages accordingly --- controller.go | 3 +++ router.go | 31 +++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/controller.go b/controller.go index 261de3df..f5c59d7b 100644 --- a/controller.go +++ b/controller.go @@ -138,6 +138,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { err := BeeTemplates[c.TplNames].ExecuteTemplate(newbytes, c.TplNames, c.Data) if err != nil { Trace("template Execute err:", err) + return nil, err } tplcontent, _ := ioutil.ReadAll(newbytes) c.Data["LayoutContent"] = template.HTML(string(tplcontent)) @@ -145,6 +146,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { err = BeeTemplates[c.Layout].ExecuteTemplate(ibytes, c.Layout, c.Data) if err != nil { Trace("template Execute err:", err) + return nil, err } icontent, _ := ioutil.ReadAll(ibytes) return icontent, nil @@ -163,6 +165,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { err := BeeTemplates[c.TplNames].ExecuteTemplate(ibytes, c.TplNames, c.Data) if err != nil { Trace("template Execute err:", err) + return nil, err } icontent, _ := ioutil.ReadAll(ibytes) return icontent, nil diff --git a/router.go b/router.go index 362a249e..8449e2d6 100644 --- a/router.go +++ b/router.go @@ -26,7 +26,10 @@ const ( FinishRouter ) -var HTTPMETHOD = []string{"get", "post", "put", "delete", "patch", "options", "head"} +var ( + HTTPMETHOD = []string{"get", "post", "put", "delete", "patch", "options", "head"} + errorType = reflect.TypeOf((*error)(nil)).Elem() +) type controllerInfo struct { pattern string @@ -441,7 +444,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) } } - return false + return false } if context.Input.IsWebsocket() { @@ -481,7 +484,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) middleware.Exception("403", rw, r, "403 Forbidden") goto Admin } - + //This block obtained from (https://github.com/smithfox/beego) - it should probably get merged into astaxie/beego after a pull request isStaticFileToCompress := false if StaticExtensionsToGzip != nil && len(StaticExtensionsToGzip) > 0 { @@ -513,7 +516,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) } else { http.ServeFile(w, r, file) } - + w.started = true goto Admin } @@ -729,7 +732,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) if !w.started && !context.Input.IsWebsocket() { if AutoRender { method = vc.MethodByName("Render") - method.Call(in) + callMethodWithError(method, in) } } } @@ -885,9 +888,9 @@ func (p *ControllerRegistor) getErrorHandler(errorCode string) func(rw http.Resp //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 { - writer http.ResponseWriter - started bool - status int + writer http.ResponseWriter + started bool + status int contentEncoding string } @@ -920,3 +923,15 @@ func (w *responseWriter) WriteHeader(code int) { w.started = true w.writer.WriteHeader(code) } + +// call method and panic with error if error is in result params +func callMethodWithError(method reflect.Value, params []reflect.Value) { + results := method.Call(params) + if len(results) > 0 { + for _, result := range results { + if result.Type() == errorType && !result.IsNil() { + panic(result.Interface().(error)) + } + } + } +}