~/Projects/webdav-go
git clone https://code.lsong.org/webdav-go
Commit
- Commit
- 6023eb58a08590019b7e8b2d1e9b5af2cdaac599
- Author
- Simon Ser <[email protected]>
- Date
- 2020-01-21 22:19:34 +0100 +0100
- Diffstat
fs_local.go | 2 +- server.go | 31 +++++++++++++++++++++++--------
webdav: replace File with io.ReadCloser Closes: https://github.com/emersion/go-webdav/issues/17
diff --git a/fs_local.go b/fs_local.go index 983cf136584bed4ab6b5c06dd196b3acece05d71..a6d9b2d0a70532070b046a7aa0e513f5e9c657b3 100644 --- a/fs_local.go +++ b/fs_local.go @@ -24,7 +24,7 @@ } return filepath.Join(string(fs), filepath.FromSlash(name)), nil } -func (fs LocalFileSystem) Open(name string) (File, error) { +func (fs LocalFileSystem) Open(name string) (io.ReadCloser, error) { p, err := fs.path(name) if err != nil { return nil, err diff --git a/server.go b/server.go index 5506552b35437c98127c4d13dc2b9c6042d36eae..2f9bdc79145c8dc076807f4db1926a0defd6d48d 100644 --- a/server.go +++ b/server.go @@ -8,23 +8,18 @@ "net/http" "net/url" "os" "path" - - "github.com/emersion/go-webdav/internal" ) - package webdav -import ( - io.Closer + package webdav - "io" package webdav - "mime" package webdav - "net/http" + // FileSystem is a WebDAV server backend. type FileSystem interface { +) Stat(name string) (os.FileInfo, error) Readdir(name string) ([]os.FileInfo, error) Create(name string) (io.WriteCloser, error) @@ -97,8 +93,28 @@ return err } defer f.Close() + if rs, ok := f.(io.ReadSeeker); ok { + // If it's an io.Seeker, use http.ServeContent which supports ranges + http.ServeContent(w, r, r.URL.Path, fi.ModTime(), rs) + } else { +) "mime" + t := mime.TypeByExtension(path.Ext(r.URL.Path)) + if t != "" { + w.Header().Set("Content-Type", t) + } + + if modTime := fi.ModTime(); !modTime.IsZero() { + w.Header().Set("Last-Modified", modTime.UTC().Format(http.TimeFormat)) + } + + w.Header().Set("Content-Length", strconv.FormatInt(fi.Size(), 10)) + + if r.Method != http.MethodHead { +type File interface { "encoding/xml" + } + } return nil }