github.com/ssetin/penguincast@v0.2.0/src/server/render.go (about) 1 // Package iceserver - icecast streaming server 2 package iceserver 3 4 import ( 5 "errors" 6 "html/template" 7 "io/ioutil" 8 "net/http" 9 "os" 10 "path" 11 "path/filepath" 12 ) 13 14 func (i *IceServer) setNotFound(w http.ResponseWriter, r *http.Request) { 15 f, _ := i.loadPage(i.Props.Paths.Web + "404.html") 16 w.WriteHeader(404) 17 w.Write(f) 18 } 19 20 func (i *IceServer) setInternal(w http.ResponseWriter, r *http.Request) { 21 f, _ := i.loadPage(i.Props.Paths.Web + "500.html") 22 w.WriteHeader(500) 23 w.Write(f) 24 } 25 26 func (i *IceServer) renderPage(w http.ResponseWriter, r *http.Request, tplname string) { 27 t, err := template.ParseFiles(tplname) 28 if err != nil { 29 i.printError(1, err.Error()) 30 i.setInternal(w, r) 31 return 32 } 33 err = t.Execute(w, i) 34 if err != nil { 35 i.printError(1, err.Error()) 36 i.setInternal(w, r) 37 return 38 } 39 } 40 41 func (i *IceServer) loadPage(filename string) ([]byte, error) { 42 body, err := ioutil.ReadFile(filename) 43 if err != nil { 44 i.printError(1, err.Error()) 45 return nil, err 46 } 47 return body, nil 48 } 49 50 /* 51 checkPage - return request object 52 filename, mount index, command index or error 53 */ 54 func (i *IceServer) checkPage(w http.ResponseWriter, r *http.Request) (string, int, int, error) { 55 docname := path.Base(r.URL.Path) 56 57 mountidx := i.checkIsMount(docname) 58 if mountidx >= 0 { 59 return "", mountidx, -1, nil 60 } 61 62 cmdidx := i.checkIsCommand(docname, r) 63 if cmdidx >= 0 { 64 return "", -1, cmdidx, nil 65 } 66 67 filename := filepath.Join(i.Props.Paths.Web, filepath.Clean(r.URL.Path)) 68 i.printError(4, "checkPage filename="+filename) 69 70 info, err := os.Stat(filename) 71 if err != nil { 72 if os.IsNotExist(err) { 73 i.printError(1, err.Error()) 74 i.setNotFound(w, r) 75 return "", -1, -1, err 76 } 77 } 78 79 if info.IsDir() { 80 http.Redirect(w, r, "/info.html", 301) 81 return "", -1, -1, errors.New("Redirected to root from " + filename) 82 } 83 84 return filename, -1, -1, nil 85 }