diff --git a/client.go b/client.go index fd6187b..8d6acc2 100644 --- a/client.go +++ b/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 - r.Props = nil - return + if p := getProps(r, "200"); p != nil && p.Type.Local == "collection" { + r.Props = nil + 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,8 +118,11 @@ func (c *Client) ReadDir(path string) ([]os.FileInfo, error) { `, &response{}, parse) + if err != nil { - err = &os.PathError{"ReadDir", path, err} + if _, ok := err.(*os.PathError); !ok { + err = &os.PathError{"ReadDir", path, err} + } } return files, err } diff --git a/requests.go b/requests.go index fbcfd71..882ce39 100644 --- a/requests.go +++ b/requests.go @@ -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) } diff --git a/utils.go b/utils.go index fb21849..8aae29d 100644 --- a/utils.go +++ b/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 }