leech/route/route.go
2024-04-27 13:50:34 +02:00

64 lines
1.5 KiB
Go

package route
import (
"leech/config"
"leech/html"
"os"
"path"
"sort"
"strings"
"github.com/gofiber/fiber/v2"
)
func HandleList(c *fiber.Ctx) error {
req := c.Params("req")
c.Set(fiber.HeaderContentType, fiber.MIMETextHTML)
if req == "" {
keys := make([]string, 0, len(config.Config.ServeDirs))
for k := range config.Config.ServeDirs {
keys = append(keys, k)
}
sort.Slice(keys, func(i, j int) bool {
return i < j
})
entries := make([]html.Entry, 0, len(config.Config.ServeDirs))
for _, key := range keys {
entries = append(entries, html.Entry{
Name: key,
Size: -1,
IsDir: true,
})
}
return c.SendString(html.FileListPage(req, entries))
} else {
pathSlice := strings.Split(req, ".")
pathBase, ok := config.Config.ServeDirs[pathSlice[0]]
if ok {
pathSlice[0] = pathBase
completePath := path.Join(pathSlice...)
files, err := os.ReadDir(completePath)
if err != nil {
return c.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
entries := []html.Entry{}
for _, f := range files {
dirEntryInfo, err := f.Info()
if err != nil {
return c.Status(fiber.StatusInternalServerError).SendString("Internal server error!")
}
entries = append(entries, html.Entry{
Name: f.Name(),
Size: dirEntryInfo.Size(),
IsDir: f.IsDir(),
})
}
return c.SendString(html.FileListPage(req, entries))
} else {
return c.Status(fiber.StatusNotFound).SendString("Sorry can't find that!")
}
}
}