diff options
Diffstat (limited to 'page/render.go')
| -rw-r--r-- | page/render.go | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/page/render.go b/page/render.go new file mode 100644 index 0000000..4378675 --- /dev/null +++ b/page/render.go @@ -0,0 +1,77 @@ +package page + +import ( + "net/http" + "path/filepath" + "strings" +) + +// Render is a lower level option, allowing you to specify local +// variables and the status code in which to return +func Render(w http.ResponseWriter, r *http.Request, + path string, vars map[string]interface{}, statusCode int) { + + u := r.URL.Path + if u == "/" { + u = "/index" + } + u = filepath.Join(".", u) + + // Sepcifically use the specified path for the page + p := NewPage(path) + + if vars != nil { + p.SetVars(vars) + } + + err := p.Render(w) + if err != nil { + if strings.HasSuffix(err.Error(), "no such file or directory") { + Logger.Printf("%s %s %d %s", + r.RemoteAddr, + r.Method, + http.StatusNotFound, + u) + p = NewPage("404") + w.WriteHeader(http.StatusNotFound) + err := p.Render(w) + if err != nil { + Logger.Printf("%s %s path: %s while trying 404: %s", + r.RemoteAddr, + r.Method, + u, + err) + http.Error(w, "Internal server error", + http.StatusInternalServerError) + return + } + return + } else { + Logger.Printf("%s %s path: %s encountered: %s", + r.RemoteAddr, + r.Method, + u, + err) + http.Error(w, "Internal server error", + http.StatusInternalServerError) + return + } + } + + Logger.Printf("%s %s %d %s", r.RemoteAddr, r.Method, statusCode, u) +} + +// RenderWithVars allows you to specify a specific page and whether or not +// you wish to override vars. If left nil they will not be overridden. +// Also see RenderForPath if you don't need to override them +func RenderWithVars(w http.ResponseWriter, r *http.Request, + path string, vars map[string]interface{}) { + + Render(w, r, path, vars, http.StatusOK) +} + +// RenderForPath takes the path to a page and finish up the rendering +// Allowing you to place logic on what page is rendered by your handlers +func RenderForPath(w http.ResponseWriter, r *http.Request, path string) { + RenderWithVars(w, r, path, nil) +} |
