package static import ( "net/http" "os" ) type Static struct { dirIndexFile string } func New(file string) *Static { r := Static{dirIndexFile: file} return &r } func (this *Static) Response(dir string, w http.ResponseWriter, r *http.Request, before func(w http.ResponseWriter, r *http.Request), after func(w http.ResponseWriter, r *http.Request)) bool { if r.URL.Path == "/" { f, err := os.Open(dir + string(os.PathSeparator) + this.dirIndexFile) if err == nil { defer f.Close() st, err := os.Stat(dir + string(os.PathSeparator) + this.dirIndexFile) if err != nil { return false } if st.Mode().IsDir() { return false } if before != nil { before(w, r) } http.ServeFile(w, r, dir+string(os.PathSeparator)+this.dirIndexFile) if after != nil { after(w, r) } return true } } else { f, err := os.Open(dir + r.URL.Path) if err == nil { defer f.Close() st, err := os.Stat(dir + r.URL.Path) if err != nil { return false } if st.Mode().IsDir() { if r.URL.Path[len(r.URL.Path)-1] == '/' { fi, err := os.Open(dir + r.URL.Path + string(os.PathSeparator) + this.dirIndexFile) if err == nil { defer fi.Close() sti, err := os.Stat(dir + r.URL.Path + string(os.PathSeparator) + this.dirIndexFile) if err != nil { return false } if sti.Mode().IsDir() { return false } if before != nil { before(w, r) } http.ServeFile(w, r, dir+r.URL.Path+string(os.PathSeparator)+this.dirIndexFile) if after != nil { after(w, r) } return true } } return false } if before != nil { before(w, r) } http.ServeFile(w, r, dir+r.URL.Path) if after != nil { after(w, r) } return true } } return false }