webdav: fix identification of directories for Bitrix Site Manager - #2716

Bitrix Site Manager emits `<D:resourcetype><collection/></D:resourcetype>`
missing the namespace on the `collection` tag.  This causes the item
to be identified as a file instead of a directory.

To work around this look at the Microsoft extension prop
`iscollection` which seems to be emitted as well.
This commit is contained in:
Nick Craig-Wood 2018-11-19 13:12:24 +00:00
parent a838add230
commit 08c4854e00
2 changed files with 12 additions and 6 deletions

View file

@ -66,12 +66,13 @@ type Response struct {
// Note that status collects all the status values for which we just // Note that status collects all the status values for which we just
// check the first is OK. // check the first is OK.
type Prop struct { type Prop struct {
Status []string `xml:"DAV: status"` Status []string `xml:"DAV: status"`
Name string `xml:"DAV: prop>displayname,omitempty"` Name string `xml:"DAV: prop>displayname,omitempty"`
Type *xml.Name `xml:"DAV: prop>resourcetype>collection,omitempty"` Type *xml.Name `xml:"DAV: prop>resourcetype>collection,omitempty"`
Size int64 `xml:"DAV: prop>getcontentlength,omitempty"` IsCollection *int `xml:"DAV: prop>iscollection,omitempty"` // this is a Microsoft extension see #2716
Modified Time `xml:"DAV: prop>getlastmodified,omitempty"` Size int64 `xml:"DAV: prop>getcontentlength,omitempty"`
Checksums []string `xml:"prop>checksums>checksum,omitempty"` Modified Time `xml:"DAV: prop>getlastmodified,omitempty"`
Checksums []string `xml:"prop>checksums>checksum,omitempty"`
} }
// Parse a status of the form "HTTP/1.1 200 OK" or "HTTP/1.1 200" // Parse a status of the form "HTTP/1.1 200 OK" or "HTTP/1.1 200"

View file

@ -172,6 +172,11 @@ func itemIsDir(item *api.Response) bool {
} }
fs.Debugf(nil, "Unknown resource type %q/%q on %q", t.Space, t.Local, item.Props.Name) fs.Debugf(nil, "Unknown resource type %q/%q on %q", t.Space, t.Local, item.Props.Name)
} }
// the iscollection prop is a Microsoft extension, but if present it is a reliable indicator
// if the above check failed - see #2716
if t := item.Props.IsCollection; t != nil {
return *t != 0
}
return false return false
} }