mirror of
				https://github.com/Theodor-Springmann-Stiftung/lenz-web.git
				synced 2025-11-04 12:15:32 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package filesystem
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"html"
 | 
						|
	"net/http"
 | 
						|
	"os"
 | 
						|
	"path"
 | 
						|
	"sort"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/gofiber/fiber/v2"
 | 
						|
	"github.com/gofiber/fiber/v2/utils"
 | 
						|
)
 | 
						|
 | 
						|
func getFileExtension(p string) string {
 | 
						|
	n := strings.LastIndexByte(p, '.')
 | 
						|
	if n < 0 {
 | 
						|
		return ""
 | 
						|
	}
 | 
						|
	return p[n:]
 | 
						|
}
 | 
						|
 | 
						|
func dirList(c *fiber.Ctx, f http.File) error {
 | 
						|
	fileinfos, err := f.Readdir(-1)
 | 
						|
	if err != nil {
 | 
						|
		return fmt.Errorf("failed to read dir: %w", err)
 | 
						|
	}
 | 
						|
 | 
						|
	fm := make(map[string]os.FileInfo, len(fileinfos))
 | 
						|
	filenames := make([]string, 0, len(fileinfos))
 | 
						|
	for _, fi := range fileinfos {
 | 
						|
		name := fi.Name()
 | 
						|
		fm[name] = fi
 | 
						|
		filenames = append(filenames, name)
 | 
						|
	}
 | 
						|
 | 
						|
	basePathEscaped := html.EscapeString(c.Path())
 | 
						|
	_, _ = fmt.Fprintf(c, "<html><head><title>%s</title><style>.dir { font-weight: bold }</style></head><body>", basePathEscaped)
 | 
						|
	_, _ = fmt.Fprintf(c, "<h1>%s</h1>", basePathEscaped)
 | 
						|
	_, _ = fmt.Fprint(c, "<ul>")
 | 
						|
 | 
						|
	if len(basePathEscaped) > 1 {
 | 
						|
		parentPathEscaped := html.EscapeString(utils.TrimRight(c.Path(), '/') + "/..")
 | 
						|
		_, _ = fmt.Fprintf(c, `<li><a href="%s" class="dir">..</a></li>`, parentPathEscaped)
 | 
						|
	}
 | 
						|
 | 
						|
	sort.Strings(filenames)
 | 
						|
	for _, name := range filenames {
 | 
						|
		pathEscaped := html.EscapeString(path.Join(c.Path() + "/" + name))
 | 
						|
		fi := fm[name]
 | 
						|
		auxStr := "dir"
 | 
						|
		className := "dir"
 | 
						|
		if !fi.IsDir() {
 | 
						|
			auxStr = fmt.Sprintf("file, %d bytes", fi.Size())
 | 
						|
			className = "file"
 | 
						|
		}
 | 
						|
		_, _ = fmt.Fprintf(c, `<li><a href="%s" class="%s">%s</a>, %s, last modified %s</li>`,
 | 
						|
			pathEscaped, className, html.EscapeString(name), auxStr, fi.ModTime())
 | 
						|
	}
 | 
						|
	_, _ = fmt.Fprint(c, "</ul></body></html>")
 | 
						|
 | 
						|
	c.Type("html")
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 |