diff --git a/src/duplicacy_webdavstorage.go b/src/duplicacy_webdavstorage.go index 176145d..480b711 100644 --- a/src/duplicacy_webdavstorage.go +++ b/src/duplicacy_webdavstorage.go @@ -14,7 +14,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math/rand" "net/http" //"net/http/httputil" @@ -214,53 +213,56 @@ type WebDAVMultiStatus struct { func (storage *WebDAVStorage) getProperties(uri string, depth int, properties ...string) (map[string]WebDAVProperties, error) { - propfind := "" - for _, p := range properties { - propfind += fmt.Sprintf("<%s/>", p) - } - propfind += "" + maxTries := 3 + for tries := 0; ; tries++ { + propfind := "" + for _, p := range properties { + propfind += fmt.Sprintf("<%s/>", p) + } + propfind += "" - body := fmt.Sprintf(`%s`, propfind) + body := fmt.Sprintf(`%s`, propfind) - readCloser, _, err := storage.sendRequest("PROPFIND", uri, depth, []byte(body)) - if err != nil { - return nil, err - } - defer readCloser.Close() - content, err := ioutil.ReadAll(readCloser) - if err != nil { - return nil, err - } + readCloser, _, err := storage.sendRequest("PROPFIND", uri, depth, []byte(body)) + if err != nil { + return nil, err + } + defer readCloser.Close() - object := WebDAVMultiStatus{} - err = xml.Unmarshal(content, &object) - if err != nil { - return nil, err - } - - if object.Responses == nil || len(object.Responses) == 0 { - return nil, errors.New("no WebDAV responses") - } - - responses := make(map[string]WebDAVProperties) - - for _, responseTag := range object.Responses { - - if responseTag.PropStat == nil || responseTag.PropStat.Prop == nil || responseTag.PropStat.Prop.PropList == nil { - return nil, errors.New("no WebDAV properties") + object := WebDAVMultiStatus{} + err = xml.NewDecoder(readCloser).Decode(&object) + if err != nil { + if strings.Contains(err.Error(), "unexpected EOF") && tries < maxTries { + LOG_WARN("WEBDAV_RETRY", "Retrying on %v", err) + continue + } + return nil, err } - properties := make(WebDAVProperties) - for _, prop := range responseTag.PropStat.Prop.PropList { - properties[prop.XMLName.Local] = prop.Value + if object.Responses == nil || len(object.Responses) == 0 { + return nil, errors.New("no WebDAV responses") } - responseKey := responseTag.Href - responses[responseKey] = properties + responses := make(map[string]WebDAVProperties) + for _, responseTag := range object.Responses { + + if responseTag.PropStat == nil || responseTag.PropStat.Prop == nil || responseTag.PropStat.Prop.PropList == nil { + return nil, errors.New("no WebDAV properties") + } + + properties := make(WebDAVProperties) + for _, prop := range responseTag.PropStat.Prop.PropList { + properties[prop.XMLName.Local] = prop.Value + } + + responseKey := responseTag.Href + responses[responseKey] = properties + + } + + return responses, nil } - - return responses, nil } // ListFiles return the list of files and subdirectories under 'dir'. A subdirectories returned must have a trailing '/', with