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 }