Merge pull request #377 from vadimi/master
Panic template execution errors to show error pages accordingly
Showing
2 changed files
with
20 additions
and
2 deletions
| ... | @@ -138,6 +138,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { | ... | @@ -138,6 +138,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { |
| 138 | err := BeeTemplates[c.TplNames].ExecuteTemplate(newbytes, c.TplNames, c.Data) | 138 | err := BeeTemplates[c.TplNames].ExecuteTemplate(newbytes, c.TplNames, c.Data) |
| 139 | if err != nil { | 139 | if err != nil { |
| 140 | Trace("template Execute err:", err) | 140 | Trace("template Execute err:", err) |
| 141 | return nil, err | ||
| 141 | } | 142 | } |
| 142 | tplcontent, _ := ioutil.ReadAll(newbytes) | 143 | tplcontent, _ := ioutil.ReadAll(newbytes) |
| 143 | c.Data["LayoutContent"] = template.HTML(string(tplcontent)) | 144 | c.Data["LayoutContent"] = template.HTML(string(tplcontent)) |
| ... | @@ -145,6 +146,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { | ... | @@ -145,6 +146,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { |
| 145 | err = BeeTemplates[c.Layout].ExecuteTemplate(ibytes, c.Layout, c.Data) | 146 | err = BeeTemplates[c.Layout].ExecuteTemplate(ibytes, c.Layout, c.Data) |
| 146 | if err != nil { | 147 | if err != nil { |
| 147 | Trace("template Execute err:", err) | 148 | Trace("template Execute err:", err) |
| 149 | return nil, err | ||
| 148 | } | 150 | } |
| 149 | icontent, _ := ioutil.ReadAll(ibytes) | 151 | icontent, _ := ioutil.ReadAll(ibytes) |
| 150 | return icontent, nil | 152 | return icontent, nil |
| ... | @@ -163,6 +165,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { | ... | @@ -163,6 +165,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { |
| 163 | err := BeeTemplates[c.TplNames].ExecuteTemplate(ibytes, c.TplNames, c.Data) | 165 | err := BeeTemplates[c.TplNames].ExecuteTemplate(ibytes, c.TplNames, c.Data) |
| 164 | if err != nil { | 166 | if err != nil { |
| 165 | Trace("template Execute err:", err) | 167 | Trace("template Execute err:", err) |
| 168 | return nil, err | ||
| 166 | } | 169 | } |
| 167 | icontent, _ := ioutil.ReadAll(ibytes) | 170 | icontent, _ := ioutil.ReadAll(ibytes) |
| 168 | return icontent, nil | 171 | return icontent, nil | ... | ... |
| ... | @@ -26,7 +26,10 @@ const ( | ... | @@ -26,7 +26,10 @@ const ( |
| 26 | FinishRouter | 26 | FinishRouter |
| 27 | ) | 27 | ) |
| 28 | 28 | ||
| 29 | var HTTPMETHOD = []string{"get", "post", "put", "delete", "patch", "options", "head"} | 29 | var ( |
| 30 | HTTPMETHOD = []string{"get", "post", "put", "delete", "patch", "options", "head"} | ||
| 31 | errorType = reflect.TypeOf((*error)(nil)).Elem() | ||
| 32 | ) | ||
| 30 | 33 | ||
| 31 | type controllerInfo struct { | 34 | type controllerInfo struct { |
| 32 | pattern string | 35 | pattern string |
| ... | @@ -729,7 +732,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) | ... | @@ -729,7 +732,7 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) |
| 729 | if !w.started && !context.Input.IsWebsocket() { | 732 | if !w.started && !context.Input.IsWebsocket() { |
| 730 | if AutoRender { | 733 | if AutoRender { |
| 731 | method = vc.MethodByName("Render") | 734 | method = vc.MethodByName("Render") |
| 732 | method.Call(in) | 735 | callMethodWithError(method, in) |
| 733 | } | 736 | } |
| 734 | } | 737 | } |
| 735 | } | 738 | } |
| ... | @@ -920,3 +923,15 @@ func (w *responseWriter) WriteHeader(code int) { | ... | @@ -920,3 +923,15 @@ func (w *responseWriter) WriteHeader(code int) { |
| 920 | w.started = true | 923 | w.started = true |
| 921 | w.writer.WriteHeader(code) | 924 | w.writer.WriteHeader(code) |
| 922 | } | 925 | } |
| 926 | |||
| 927 | // call method and panic with error if error is in result params | ||
| 928 | func callMethodWithError(method reflect.Value, params []reflect.Value) { | ||
| 929 | results := method.Call(params) | ||
| 930 | if len(results) > 0 { | ||
| 931 | for _, result := range results { | ||
| 932 | if result.Type() == errorType && !result.IsNil() { | ||
| 933 | panic(result.Interface().(error)) | ||
| 934 | } | ||
| 935 | } | ||
| 936 | } | ||
| 937 | } | ... | ... |
-
Please register or sign in to post a comment