1package webui
2
3import (
4 "net/http"
5 "os"
6)
7
8// implement a http.FileSystem that will serve a default file when the looked up
9// file doesn't exist. Useful for Single-Page App that implement routing client
10// side, where the server has to return the root index.html file for every route.
11type fileSystemWithDefault struct {
12 http.FileSystem
13 defaultFile string
14}
15
16func (fswd *fileSystemWithDefault) Open(name string) (http.File, error) {
17 f, err := fswd.FileSystem.Open(name)
18 if os.IsNotExist(err) {
19 return fswd.FileSystem.Open(fswd.defaultFile)
20 }
21 return f, err
22}
23
24func NewHandler() http.Handler {
25 assetsHandler := &fileSystemWithDefault{
26 FileSystem: WebUIAssets,
27 defaultFile: "index.html",
28 }
29
30 return http.FileServer(assetsHandler)
31}