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 }{URL: r.URL.Path}) 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)
	}

}