ReadDir will fail on non collections
This commit is contained in:
parent
4f95c70fb3
commit
f728828956
11
client.go
11
client.go
@ -72,13 +72,16 @@ func (c *Client) ReadDir(path string) ([]os.FileInfo, error) {
|
||||
path = FixSlashes(path)
|
||||
files := make([]os.FileInfo, 0)
|
||||
skipSelf := true
|
||||
parse := func(resp interface{}) {
|
||||
parse := func(resp interface{}) error {
|
||||
r := resp.(*response)
|
||||
|
||||
if skipSelf {
|
||||
skipSelf = false
|
||||
if p := getProps(r, "200"); p != nil && p.Type.Local == "collection" {
|
||||
r.Props = nil
|
||||
return
|
||||
return nil
|
||||
}
|
||||
return newPathError("ReadDir", path, 405)
|
||||
}
|
||||
|
||||
if p := getProps(r, "200"); p != nil {
|
||||
@ -101,6 +104,7 @@ func (c *Client) ReadDir(path string) ([]os.FileInfo, error) {
|
||||
}
|
||||
|
||||
r.Props = nil
|
||||
return nil
|
||||
}
|
||||
|
||||
err := c.propfind(path, false,
|
||||
@ -114,9 +118,12 @@ func (c *Client) ReadDir(path string) ([]os.FileInfo, error) {
|
||||
</d:propfind>`,
|
||||
&response{},
|
||||
parse)
|
||||
|
||||
if err != nil {
|
||||
if _, ok := err.(*os.PathError); !ok {
|
||||
err = &os.PathError{"ReadDir", path, err}
|
||||
}
|
||||
}
|
||||
return files, err
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ func (c *Client) options(path string) (*http.Response, error) {
|
||||
return c.c.Do(rq)
|
||||
}
|
||||
|
||||
func (c *Client) propfind(path string, self bool, body string, resp interface{}, parse func(resp interface{})) error {
|
||||
func (c *Client) propfind(path string, self bool, body string, resp interface{}, parse func(resp interface{}) error) error {
|
||||
rq, err := c.req("PROPFIND", path, strings.NewReader(body))
|
||||
if err != nil {
|
||||
return err
|
||||
@ -82,7 +82,5 @@ func (c *Client) propfind(path string, self bool, body string, resp interface{},
|
||||
return errors.New(fmt.Sprintf("%s - %s %s", rs.Status, rq.Method, rq.URL.String()))
|
||||
}
|
||||
|
||||
parseXML(rs.Body, resp, parse)
|
||||
|
||||
return nil
|
||||
return parseXML(rs.Body, resp, parse)
|
||||
}
|
||||
|
7
utils.go
7
utils.go
@ -65,16 +65,19 @@ func parseModified(s *string) time.Time {
|
||||
return time.Unix(0, 0)
|
||||
}
|
||||
|
||||
func parseXML(data io.Reader, resp interface{}, parse func(resp interface{})) {
|
||||
func parseXML(data io.Reader, resp interface{}, parse func(resp interface{}) error) error {
|
||||
decoder := xml.NewDecoder(data)
|
||||
for t, _ := decoder.Token(); t != nil; t, _ = decoder.Token() {
|
||||
switch se := t.(type) {
|
||||
case xml.StartElement:
|
||||
if se.Name.Local == "response" {
|
||||
if e := decoder.DecodeElement(resp, &se); e == nil {
|
||||
parse(resp)
|
||||
if err := parse(resp); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user