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 // 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) }