@@ -3,48 +3,55 @@ package main
33import (
44 "fmt"
55 "net/http"
6- "os "
6+ "net/url "
77 "strings"
88
99 "golang.org/x/net/webdav"
1010)
1111
1212func 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