package main import ( "html/template" "log" "net/http" "sort" "strings" ) type TemplateHandler struct { handler http.Handler } func (t *TemplateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Header().Set("Server", "uhttpd") // We use our custom handler to prettify directories. Files are served via default. if !strings.HasSuffix(r.URL.Path, "/") { t.handler.ServeHTTP(w, r) return } rec := NewRecorder() defer rec.Body.Reset() // passing the recorder instead of the real ResponseWriter t.handler.ServeHTTP(rec, r) // let the standard lib handle all the caching if rec.Code > 300 && rec.Code < 400 { log.Println("Code: ", rec.Code) t.handler.ServeHTTP(w, r) return } // we copy the original headers first for k, v := range rec.Header() { w.Header()[k] = v } // not found if rec.Code == 404 { w.Header().Set("Content-Type", "text/html") w.WriteHeader(404) tmpl := template.New("404") tmpl, err := tmpl.Parse(get404()) if err != nil { log.Println(err.Error()) w.WriteHeader(500) w.Write([]byte(err.Error())) return } err = tmpl.Execute(w, struct { URL string Favicon template.HTML }{URL: r.URL.Path, Favicon: getFavicon()}) if err != nil { log.Println(err.Error()) w.WriteHeader(500) w.Write([]byte(err.Error())) return } return } // we serve a file instead of a html page if !strings.Contains(w.Header().Get("Content-Type"), "text/html") { w.Write(rec.Body.Bytes()) return } data := rec.Body.String() // we serve the directoy page if strings.HasPrefix(data, "
") {
execTemplate(w, r, data)
} else {
w.Write(rec.Body.Bytes())
}
}
func execTemplate(w http.ResponseWriter, r *http.Request, data string) {
links := getToken(data)
sort.Sort(LinksAsSlice(links)) // see sort.go
tmpl := template.New("page")
tmpl, err := tmpl.Parse(getTemplate())
if err != nil {
log.Println(err.Error())
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
err = tmpl.Execute(w, struct {
Links []Link
URL string
Favicon template.HTML
AllowUpload bool
}{Links: links, URL: r.URL.Path, Favicon: getFavicon(), AllowUpload: _allow_upload})
if err != nil {
log.Println(err)
}
}