56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
package controllers
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
"git.kirsle.net/apps/gophertype/pkg/console"
|
|
"git.kirsle.net/apps/gophertype/pkg/models"
|
|
"git.kirsle.net/apps/gophertype/pkg/responses"
|
|
)
|
|
|
|
// CatchAllHandler handles the "/" and wildcard routes that are not
|
|
// picked up by any other controllers. It serves static files and Go
|
|
// templates from the builtin web root or the user root.
|
|
func CatchAllHandler(w http.ResponseWriter, r *http.Request) {
|
|
path := r.URL.Path
|
|
console.Debug("Wildcard path: %s", path)
|
|
|
|
// Is it a blog fragment?
|
|
if _, err := models.Posts.LoadFragment(path); err == nil {
|
|
PostFragment(w, r)
|
|
return
|
|
}
|
|
|
|
// No dot-files allowed.
|
|
if strings.Contains(path, "/.") {
|
|
console.Error("Path '%s' contains a dotfile; forbidden", path)
|
|
responses.Forbidden(w, r, "You're not supposed to be here.")
|
|
return
|
|
}
|
|
|
|
// Resolve the target path.
|
|
filepath, err := responses.ResolveFile(path)
|
|
if err != nil {
|
|
responses.NotFound(w, r)
|
|
return
|
|
}
|
|
|
|
// Files under /_builtin can only be taken literally.
|
|
if strings.HasPrefix(filepath, "_builtin/") {
|
|
responses.SendFile(w, r, filepath)
|
|
return
|
|
}
|
|
|
|
// Is it a Go template?
|
|
if strings.HasSuffix(filepath, ".gohtml") {
|
|
responses.RenderTemplate(w, r, filepath, nil)
|
|
return
|
|
} else if strings.HasSuffix(filepath, ".md") {
|
|
responses.RenderMarkdown(w, r, filepath)
|
|
return
|
|
}
|
|
|
|
responses.SendFile(w, r, filepath)
|
|
}
|