diff options
| author | Mitchell Riedstra <mitch@riedstra.dev> | 2022-06-19 23:57:04 -0400 |
|---|---|---|
| committer | Mitchell Riedstra <mitch@riedstra.dev> | 2022-06-19 23:57:04 -0400 |
| commit | bf7d9c79cae53f64fcd04527248987bd4e7ca3c4 (patch) | |
| tree | 0c763f6545cee4a287f5e6fa0a45489a85454325 /page/render.go | |
| parent | 235b8f871fdfa35f9595268d194d28a3de655ec0 (diff) | |
| download | go-website-0.0.17a.tar.gz go-website-0.0.17a.tar.xz | |
0.0.17a / Alpha. Introduce users and page editing.v0.0.17a
Breaking changes:
inc/base.html is now tpl/base.md by default. This can be overridden
on the command line.
404.md is now tpl/404.md. This can be overridden with templatedirectory
in the configuration file.
Additional files:
`auth.json` file that stores credentials and settings for
authorization cookie.
Further notes:
This will likely receive some major updates and changes over
the next few commits. The scaffolidng is now in place for
user accounts, login handling, and page editing.
It's all extremely basic at the moment, on the idea list:
Listing of all markdown files
File uploader and general content management
Flags to turn on/off git integration for edits.
Download / Upload of all markdown files as a backup/restore.
It's of course, all subject to change.
Diffstat (limited to 'page/render.go')
| -rw-r--r-- | page/render.go | 137 |
1 files changed, 108 insertions, 29 deletions
diff --git a/page/render.go b/page/render.go index 6cbabf9..d35ba38 100644 --- a/page/render.go +++ b/page/render.go @@ -1,20 +1,104 @@ package page import ( + "bytes" "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) { +func getURLPath(r *http.Request) string { u := r.URL.Path if u == "/" { u = "/index" } + return u +} + +// Render5xx is automatically called if any render fails, +// additionally you can call it for your own uses. It will +// try to use the 5xx template but will fall back to a plain +// page if that fails. +func Render5xx(w http.ResponseWriter, r *http.Request, + vars map[string]interface{}, statusCode int) { + u := getURLPath(r) + + Logger.Printf("%s %s %d %s", + r.RemoteAddr, + r.Method, + statusCode, + u) + + p := NewPage(TemplateDirectory + "/5xx") + + buf := &bytes.Buffer{} + + err := p.Render(buf) + if err != nil { + Logger.Printf("%s %s path: %s while trying 5xx: %s", + r.RemoteAddr, + r.Method, + u, + err) + http.Error(w, "Internal server error", statusCode) + + return + } + + w.WriteHeader(statusCode) + + _, _ = w.Write(buf.Bytes()) + + Logger.Printf("%s %s %d %s", r.RemoteAddr, r.Method, statusCode, u) +} + +// Render4xx is mostly used to render a 404 page, pulls from 404 template. +// automatically called by Render if a page is missing. +func Render4xx(w http.ResponseWriter, r *http.Request, + vars map[string]interface{}, statusCode int) { + u := getURLPath(r) + + Logger.Printf("%s %s %d %s", + r.RemoteAddr, + r.Method, + statusCode, + u) + + p := NewPage(TemplateDirectory + "/4xx") + + buf := &bytes.Buffer{} + + err := p.Render(buf) + if err != nil { + Logger.Printf("%s %s path: %s while trying 404: %s", + r.RemoteAddr, + r.Method, + u, + err) + Render5xx(w, r, vars, http.StatusInternalServerError) + + return + } + + w.WriteHeader(statusCode) + + _, err = w.Write(buf.Bytes()) + if err != nil { + Render5xx(w, r, nil, http.StatusInternalServerError) + + return + } + + Logger.Printf("%s %s %d %s", r.RemoteAddr, r.Method, statusCode, u) +} + +// 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 := getURLPath(r) + u = filepath.Join(".", u) // Sepcifically use the specified path for the page @@ -24,42 +108,37 @@ func Render(w http.ResponseWriter, r *http.Request, p.Vars = vars } - err := p.Render(w) + buf := &bytes.Buffer{} + + err := p.Render(buf) 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) + Render4xx(w, r, vars, http.StatusNotFound) - p = NewPage("404") - - w.WriteHeader(http.StatusNotFound) + return + } - 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) + Logger.Printf("%s %s path: %s rendering encountered: %s", + r.RemoteAddr, + r.Method, + u, + err) + Render5xx(w, r, vars, http.StatusInternalServerError) - return - } + return + } - return - } + w.WriteHeader(statusCode) - Logger.Printf("%s %s path: %s encountered: %s", + _, err = w.Write(buf.Bytes()) + if err != nil { + Logger.Printf("%s %s %d %s: while writing buf: %s", r.RemoteAddr, r.Method, + statusCode, u, err) - http.Error(w, "Internal server error", - http.StatusInternalServerError) + Render5xx(w, r, nil, http.StatusInternalServerError) return } |
