// A mostly self explanatory package, it handles website specific // HTTP requests package http import ( "fmt" "log" "net/http" "os" "path/filepath" "strings" "riedstra.dev/mitch/go-website/local" "riedstra.dev/mitch/go-website/page" "github.com/gorilla/mux" ) // NewPage is required to specify how we acquire a new page from a given URL // since an interface is used, you can swap this out with a different // library to load pages from different sources var NewPage func(string) page.Page = func(u string) page.Page { return &local.Page{Path: u} } // ReindexRedirectTo is the path that we'll redirect to when a call to rebuild // index is called var ReindexRedirectTo = "/fullIndex" func GetHandler() *mux.Router { if NewPage == nil { fmt.Fprintln(os.Stderr, "Warning, global NewPage method is not defined!") } r := mux.NewRouter() r.HandleFunc("/rebuildIndex/", RebuildIndexHandler) r.PathPrefix("/static/").Handler(StaticHandler()) r.PathPrefix("/").HandlerFunc(PageHandler) return r } func PageHandler(w http.ResponseWriter, r *http.Request) { u := r.URL.Path if u == "/" { u = "/index" } u = filepath.Join(".", u) log.Println(u) p := NewPage(u) err := p.Render(w) if err != nil { if strings.HasSuffix(err.Error(), "no such file or directory") { log.Printf("Page '%s' not found, trying 404", u) p = NewPage("404") w.WriteHeader(404) err := p.Render(w) if err != nil { log.Println(err) http.Error(w, "Internal server error", 500) return } return } else { log.Println(err) http.Error(w, "Internal server error", 500) return } } } func RebuildIndexHandler(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { p := NewPage("index") _ = p.RebuildIndex() http.Redirect(w, r, ReindexRedirectTo, 302) } } func StaticHandler() http.Handler { return http.StripPrefix("/static/", http.FileServer(http.Dir("static"))) }