Liu Song’s Projects


~/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
 }