diff --git a/internal/webdavd/file.go b/internal/webdavd/file.go index e4779f2d..3a7fb81b 100644 --- a/internal/webdavd/file.go +++ b/internal/webdavd/file.go @@ -443,7 +443,7 @@ func (f *webDavFile) Patch(patches []webdav.Proppatch) ([]webdav.Propstat, error for _, p := range patch.Props { if status == http.StatusForbidden && !hasError { if !patch.Remove && util.Contains(lastModifiedProps, p.XMLName.Local) { - parsed, err := http.ParseTime(string(p.InnerXML)) + parsed, err := parseTime(string(p.InnerXML)) if err != nil { f.Connection.Log(logger.LevelWarn, "unsupported last modification time: %q, err: %v", string(p.InnerXML), err) diff --git a/internal/webdavd/internal_test.go b/internal/webdavd/internal_test.go index 5992a7dc..dbd414c6 100644 --- a/internal/webdavd/internal_test.go +++ b/internal/webdavd/internal_test.go @@ -1611,6 +1611,15 @@ func TestMisc(t *testing.T) { certMgr = oldCertMgr } +func TestParseTime(t *testing.T) { + res, err := parseTime("Sat, 4 Feb 2023 17:00:50 GMT") + require.NoError(t, err) + require.Equal(t, int64(1675530050), res.Unix()) + res, err = parseTime("Wed, 04 Nov 2020 13:25:51 GMT") + require.NoError(t, err) + require.Equal(t, int64(1604496351), res.Unix()) +} + func TestConfigsFromProvider(t *testing.T) { configDir := "." err := dataprovider.UpdateConfigs(nil, "", "", "") diff --git a/internal/webdavd/webdavd.go b/internal/webdavd/webdavd.go index 16c762d5..cfc081d1 100644 --- a/internal/webdavd/webdavd.go +++ b/internal/webdavd/webdavd.go @@ -18,8 +18,10 @@ package webdavd import ( "fmt" "net" + "net/http" "os" "path/filepath" + "time" "github.com/go-chi/chi/v5/middleware" @@ -43,6 +45,12 @@ const ( var ( certMgr *common.CertManager serviceStatus ServiceStatus + timeFormats = []string{ + http.TimeFormat, + "Mon, _2 Jan 2006 15:04:05 GMT", + time.RFC850, + time.ANSIC, + } ) // ServiceStatus defines the service status @@ -352,3 +360,13 @@ func getConfigPath(name, configDir string) string { } return name } + +func parseTime(text string) (t time.Time, err error) { + for _, layout := range timeFormats { + t, err = time.Parse(layout, text) + if err == nil { + return + } + } + return +}