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  }