diff --git a/main.go b/main.go index d2e99c4..4273ff9 100644 --- a/main.go +++ b/main.go @@ -5,23 +5,67 @@ import ( "io/fs" "log" "net/http" + "path/filepath" ) //go:embed public/* var publicFS embed.FS func main() { - // Получаем подпапку 'public' из embed.FS - pub, err := fs.Sub(publicFS, "public") + // Используем подпапку 'public' из embed.FS + content, err := fs.Sub(publicFS, "public") if err != nil { log.Fatal(err) } - // Создаем файловый сервер с корнем в подпапке public - fileServer := http.FileServer(http.FS(pub)) + // Создаем файловый сервер с нашим обработчиком расширений + fileServer := http.FileServer(neuterFileSystem{http.FS(content)}) http.Handle("/", fileServer) - - log.Println("Server starting on :8080") + log.Println("Server started on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) } + +// neuterFileSystem предотвращает листинг директорий и добавляет .html к URL без расширения +type neuterFileSystem struct { + fs http.FileSystem +} + +func (n neuterFileSystem) Open(path string) (http.File, error) { + f, err := n.fs.Open(path) + if err != nil { + f, err = n.fs.Open(path + ".html") + } + + if err != nil { + log.Println(err) + + return nil, err + } + + // Проверяем, не директория ли это + s, err := f.Stat() + if err != nil { + log.Println(err) + + return nil, err + } + + if s.IsDir() { + // Пробуем открыть index.html в директории + index := filepath.Join(path, "index.html") + if _, err := n.fs.Open(index); err != nil { + closeErr := f.Close() + if closeErr != nil { + log.Println(err) + + return nil, closeErr + } + log.Println(err) + + return nil, err + } + } + + return f, nil +}