diff --git a/.gitignore b/.gitignore index f4417f8..44e149b 100644 --- a/.gitignore +++ b/.gitignore @@ -21,9 +21,11 @@ _testmain.go *.exe -# vim swp files +# vim files *.swp *.swo +tags +tags.* # Desktop Services Store on macOS .DS_Store diff --git a/pkg/server/web/handlers.go b/pkg/server/web/handlers.go index 15c65ec..385c2b1 100644 --- a/pkg/server/web/handlers.go +++ b/pkg/server/web/handlers.go @@ -1,9 +1,11 @@ package web import ( + "html/template" "net/http" "os" + "github.com/inbucket/inbucket/pkg/config" "github.com/rs/zerolog/log" ) @@ -82,3 +84,21 @@ func requestLoggingWrapper(next http.Handler) http.Handler { next.ServeHTTP(w, req) }) } + +// spaTemplateHandler creates a handler to serve the index.html template for our SPA. +func spaTemplateHandler(tmpl *template.Template, basePath string, + webConfig config.Web) http.Handler { + tmplData := struct { + BasePath string + }{ + BasePath: basePath, + } + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + err := tmpl.Execute(w, tmplData) + if err != nil { + log.Error().Str("module", "web").Str("remote", req.RemoteAddr).Str("proto", req.Proto). + Str("method", req.Method).Str("path", req.RequestURI).Err(err). + Msg("Error rendering SPA index template") + } + }) +} diff --git a/pkg/server/web/server.go b/pkg/server/web/server.go index 08a19e9..b4ce078 100644 --- a/pkg/server/web/server.go +++ b/pkg/server/web/server.go @@ -5,10 +5,12 @@ import ( "context" "encoding/json" "expvar" + "html/template" "net" "net/http" "net/http/pprof" "net/url" + "os" "path/filepath" "time" @@ -86,9 +88,26 @@ func Initialize( Router.Path(prefix("/favicon.png")).Handler( fileHandler(filepath.Join(conf.Web.UIDir, "favicon.png"))) + // Parse index.html template, allowing for configuration to be passed to the SPA. + indexPath := filepath.Join(conf.Web.UIDir, "index.html") + indexTmpl, err := template.ParseFiles(indexPath) + if err != nil { + msg := "Failed to parse HTML template" + cwd, _ := os.Getwd() + log.Error(). + Str("module", "web"). + Str("phase", "startup"). + Str("path", indexPath). + Str("cwd", cwd). + Err(err). + Msg(msg) + // Create a dummy template to allow tests to pass. + indexTmpl, _ = template.New("index.html").Parse(msg) + } + // SPA managed paths. spaHandler := cookieHandler(appConfigCookie(conf.Web), - fileHandler(filepath.Join(conf.Web.UIDir, "index.html"))) + spaTemplateHandler(indexTmpl, prefix("/"), conf.Web)) Router.Path(prefix("/")).Handler(spaHandler) Router.Path(prefix("/monitor")).Handler(spaHandler) Router.Path(prefix("/status")).Handler(spaHandler) diff --git a/ui/public/index-dev.html b/ui/public/index-dev.html new file mode 100644 index 0000000..c75f6c0 --- /dev/null +++ b/ui/public/index-dev.html @@ -0,0 +1,21 @@ + + +
+ +