74 lines
1.2 KiB
Go
74 lines
1.2 KiB
Go
// Copyright (C) 2022 Marius Schellenberger
|
|
|
|
package srv
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
"cachefs/pkg/fs"
|
|
|
|
"github.com/go-logr/logr"
|
|
"golang.org/x/net/webdav"
|
|
)
|
|
|
|
type WebDavServer struct {
|
|
log logr.Logger
|
|
h http.Handler
|
|
}
|
|
|
|
func NewWebDavServer(fs *fs.WebDavFS, log logr.Logger) http.Handler {
|
|
return &WebDavServer{
|
|
log,
|
|
&webdav.Handler{
|
|
FileSystem: fs,
|
|
LockSystem: webdav.NewMemLS(),
|
|
},
|
|
}
|
|
}
|
|
|
|
func (dav *WebDavServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
s := &statusInterceptor{w: w}
|
|
if r.Method == http.MethodGet && !skipDavLog(r.RequestURI) {
|
|
defer func() {
|
|
if s.Status() == http.StatusPartialContent {
|
|
return
|
|
}
|
|
dav.log.Info("access",
|
|
"client", r.RemoteAddr,
|
|
"method", r.Method,
|
|
"status", s.Status(),
|
|
"uri", r.RequestURI,
|
|
)
|
|
}()
|
|
}
|
|
dav.h.ServeHTTP(s, r)
|
|
}
|
|
|
|
var skipDavFiles = []string{
|
|
"favicon.ico",
|
|
"AlbumArtSmall.jpg",
|
|
"AlbumArt.jpg",
|
|
"Album.jpg",
|
|
"cover.jpg",
|
|
"cover.png",
|
|
"cover.gif",
|
|
"front.jpg",
|
|
"front.png",
|
|
"front.gif",
|
|
"front.bmp",
|
|
"thumb.jpg",
|
|
}
|
|
|
|
func skipDavLog(path string) bool {
|
|
i := strings.LastIndex(path, "/")
|
|
if i > 0 {
|
|
path = path[i+1:]
|
|
}
|
|
for _, v := range skipDavFiles {
|
|
if path == v {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|