github.com/prysmaticlabs/prysm@v1.4.4/validator/web/handler.go (about)

     1  package web
     2  
     3  import (
     4  	"mime"
     5  	"net/http"
     6  	"net/url"
     7  	"path"
     8  )
     9  
    10  const prefix = "external/prysm_web_ui/prysm-web-ui"
    11  
    12  // Handler serves web requests from the bundled site data.
    13  var Handler = func(res http.ResponseWriter, req *http.Request) {
    14  	u, err := url.ParseRequestURI(req.RequestURI)
    15  	if err != nil {
    16  		log.WithError(err).Error("Cannot parse request URI")
    17  		return
    18  	}
    19  	p := u.Path
    20  	if p == "/" {
    21  		p = "/index.html"
    22  	}
    23  	p = path.Join(prefix, p)
    24  
    25  	if d, ok := site[p]; ok {
    26  		m := mime.TypeByExtension(path.Ext(p))
    27  		res.Header().Add("Content-Type", m)
    28  		res.WriteHeader(200)
    29  		if _, err := res.Write(d); err != nil {
    30  			log.WithError(err).Error("Failed to write http response")
    31  		}
    32  	} else if d, ok := site[path.Join(prefix, "index.html")]; ok {
    33  		// Angular routing expects that routes are rewritten to serve index.html. For example, if
    34  		// requesting /login, this should serve the single page app index.html.
    35  		m := mime.TypeByExtension(".html")
    36  		res.Header().Add("Content-Type", m)
    37  		res.WriteHeader(200)
    38  		if _, err := res.Write(d); err != nil {
    39  			log.WithError(err).Error("Failed to write http response")
    40  		}
    41  	} else { // If index.html is not present, serve 404. This should never happen.
    42  		log.WithField("URI", req.RequestURI).Error("Path not found")
    43  		res.WriteHeader(404)
    44  		if _, err := res.Write([]byte("Not found")); err != nil {
    45  			log.WithError(err).Error("Failed to write http response")
    46  		}
    47  	}
    48  }