Skip to content

Commit e4ff952

Browse files
committed
rewrite webdav
1 parent d6cefc6 commit e4ff952

1 file changed

Lines changed: 42 additions & 35 deletions

File tree

webdav.go

Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,55 @@ package main
33
import (
44
"fmt"
55
"net/http"
6-
"os"
6+
"net/url"
77
"strings"
88

99
"golang.org/x/net/webdav"
1010
)
1111

1212
func initWebdav(mux *http.ServeMux) {
13-
rootWebdav := &webdav.Handler{
14-
FileSystem: webdav.Dir("/"),
15-
LockSystem: webdav.NewMemLS(),
16-
}
17-
http.HandleFunc("/dav/", func(w http.ResponseWriter, r *http.Request) {
18-
// fix got dir but got file
19-
r.URL.Path = strings.TrimPrefix(r.URL.Path, "/dav")
20-
rewriteURLIfDir(r)
21-
if denyNotAllowedDir(w, r) {
13+
fs := webdav.Dir("/")
14+
lock := webdav.NewMemLS()
15+
16+
const prefix = "/dav/"
17+
http.HandleFunc(prefix, func(w http.ResponseWriter, r *http.Request) {
18+
19+
var hprefix = prefix
20+
21+
fpath := strings.TrimPrefix(r.URL.Path, "/dav")
22+
deny := db.IsDeny(fpath)
23+
if deny {
24+
w.WriteHeader(403)
25+
fmt.Fprintf(w, "the folder is deny access.")
2226
return
2327
}
24-
rootWebdav.ServeHTTP(w, r)
28+
// fix webdav dir list content include itself when prefix is not the real request path
29+
realURI := r.Header.Get("Httprelay-Proxy-Url")
30+
if realURI == "" {
31+
realURI = r.Header.Get("X-Forwarded-Uri")
32+
}
33+
if realURI != "" {
34+
uri, err := url.Parse(realURI)
35+
if err != nil {
36+
w.WriteHeader(400)
37+
fmt.Fprintf(w, "real uri parse failed")
38+
return
39+
}
40+
ss := strings.Split(uri.Path, prefix)
41+
if len(ss) < 2 {
42+
w.WriteHeader(400)
43+
fmt.Fprintf(w, "real uri parse failed.2")
44+
return
45+
}
46+
hprefix = ss[0] + prefix
47+
r.URL.Path = ss[0] + r.URL.Path
48+
fmt.Println(ss[0])
49+
}
50+
srv := &webdav.Handler{
51+
FileSystem: fs,
52+
LockSystem: lock,
53+
Prefix: hprefix,
54+
}
55+
srv.ServeHTTP(w, r)
2556
})
2657
}
27-
28-
func rewriteURLIfDir(r *http.Request) {
29-
if strings.HasSuffix(r.URL.Path, "/") {
30-
return
31-
}
32-
stat, err := os.Stat(r.URL.Path)
33-
if err != nil {
34-
return
35-
}
36-
if stat.IsDir() {
37-
r.URL.Path += "/"
38-
return
39-
}
40-
}
41-
42-
func denyNotAllowedDir(w http.ResponseWriter, r *http.Request) (done bool) {
43-
deny := db.IsDeny(r.URL.Path)
44-
if deny {
45-
w.WriteHeader(403)
46-
fmt.Fprintf(w, "the folder is deny access.")
47-
return true
48-
}
49-
return
50-
}

0 commit comments

Comments
 (0)