Go: x/net/webdav: falha em links quebrados

Criado em 27 jun. 2016  ·  3Comentários  ·  Fonte: golang/go

Ao tentar listar um diretório que contém um link quebrado, recebo um erro não informativo:

$ cadaver webdav://localhost:5555/api/v1/content                                                                                                                                         
dav:/api/v1/content/> ls etc
Listing collection `/api/v1/content/etc/': failed:
XML parse error at line 1: junk after document element

Isto é o que eu recebo do servidor webdav:

2016/06/27 14:52:42 http: multiple response.WriteHeader calls

O erro vem de file.go [1] onde ele chama stat no arquivo de link quebrado, mas acho que talvez deva ser tratado em webdav.go walkFn [2].

Não tenho certeza do que deve ser impresso / retornado, mas espero obter a listagem completa do diretório (ou seja, o webdav não deve esmagar isso na minha opinião) com este link marcado como quebrado de alguma forma.

[1] https://github.com/golang/net/blob/master/webdav/file.go#L779
[2] https://github.com/golang/net/blob/master/webdav/webdav.go#L527

/cc @simon3z

Comentários muito úteis

Acabei de encontrar este problema para. Eu consertei localmente apenas retornando nil ao receber um erro aqui https://github.com/golang/net/blob/master/webdav/webdav.go#L557.

Testei o mesmo caso de uso com a implementação do Apache e no caso de um link simbólico quebrado, ele é descartado silenciosamente.

Não sei se é uma solução boa o suficiente, mas o comportamento de hoje também está incorreto.
Aqui está um traço wireshark da resposta defeituosa

Host: 10.21.59.204
Depth: 1
Content-Type: application/xml
Apply-To-Redirect-Ref: T
Accept-Encoding: gzip, deflate
User-Agent: gvfs/1.28.2
Accept-Language: en-us, en;q=0.9
Connection: Keep-Alive
Content-Length: 235

<?xml version="1.0" encoding="utf-8" ?>
 <D:propfind xmlns:D="DAV:">
  <D:prop>
<D:creationdate/>
<D:displayname/>
<D:getcontentlength/>
<D:getcontenttype/>
<D:getetag/>
<D:getlastmodified/>
<D:resourcetype/>
  </D:prop>
 </D:propfind>HTTP/1.1 207 status code 207
Content-Type: text/xml; charset=utf-8
Date: Wed, 15 Mar 2017 09:00:40 GMT
Content-Length: 610

<?xml version="1.0" encoding="UTF-8"?><D:multistatus xmlns:D="DAV:"><D:response><D:href>/dav</D:href><D:propstat><D:prop><D:displayname></D:displayname><D:getlastmodified>Wed, 15 Mar 2017 08:59:55 GMT</D:getlastmodified><D:resourcetype><D:collection xmlns:D="DAV:"/></D:resourcetype></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat><D:propstat><D:prop><D:creationdate></D:creationdate><D:getcontentlength></D:getcontentlength><D:getcontenttype></D:getcontenttype><D:getetag></D:getetag></D:prop><D:status>HTTP/1.1 404 Not Found</D:status></D:propstat></D:response></D:multistatus>Internal Server Error

No Webdav Spec diz-se que

No caso de allprop e propname, se um principal não tiver o
direito de saber se uma determinada propriedade existe, então a propriedade
devem ser silenciosamente excluídos da resposta.

Não sei se isso se aplica ao nosso caso de uso

Todos 3 comentários

Acabei de encontrar este problema para. Eu consertei localmente apenas retornando nil ao receber um erro aqui https://github.com/golang/net/blob/master/webdav/webdav.go#L557.

Testei o mesmo caso de uso com a implementação do Apache e no caso de um link simbólico quebrado, ele é descartado silenciosamente.

Não sei se é uma solução boa o suficiente, mas o comportamento de hoje também está incorreto.
Aqui está um traço wireshark da resposta defeituosa

Host: 10.21.59.204
Depth: 1
Content-Type: application/xml
Apply-To-Redirect-Ref: T
Accept-Encoding: gzip, deflate
User-Agent: gvfs/1.28.2
Accept-Language: en-us, en;q=0.9
Connection: Keep-Alive
Content-Length: 235

<?xml version="1.0" encoding="utf-8" ?>
 <D:propfind xmlns:D="DAV:">
  <D:prop>
<D:creationdate/>
<D:displayname/>
<D:getcontentlength/>
<D:getcontenttype/>
<D:getetag/>
<D:getlastmodified/>
<D:resourcetype/>
  </D:prop>
 </D:propfind>HTTP/1.1 207 status code 207
Content-Type: text/xml; charset=utf-8
Date: Wed, 15 Mar 2017 09:00:40 GMT
Content-Length: 610

<?xml version="1.0" encoding="UTF-8"?><D:multistatus xmlns:D="DAV:"><D:response><D:href>/dav</D:href><D:propstat><D:prop><D:displayname></D:displayname><D:getlastmodified>Wed, 15 Mar 2017 08:59:55 GMT</D:getlastmodified><D:resourcetype><D:collection xmlns:D="DAV:"/></D:resourcetype></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat><D:propstat><D:prop><D:creationdate></D:creationdate><D:getcontentlength></D:getcontentlength><D:getcontenttype></D:getcontenttype><D:getetag></D:getetag></D:prop><D:status>HTTP/1.1 404 Not Found</D:status></D:propstat></D:response></D:multistatus>Internal Server Error

No Webdav Spec diz-se que

No caso de allprop e propname, se um principal não tiver o
direito de saber se uma determinada propriedade existe, então a propriedade
devem ser silenciosamente excluídos da resposta.

Não sei se isso se aplica ao nosso caso de uso

Acho que um código de status 4XX deve ser retornado no caso de acessar links quebrados, mais especificamente, 403 Forbidden para links vinculados a destinos sem permissão e 404 Not Found para links vinculados para alvos inexistentes.

Atualmente, os erros retornados por FileSystem.OpenFile ou File.Stat transferidos para http.StatusInternalServerError e causam "http: resposta supérflua. Chamada de WriteHeader de golang.org/x/net/webdav.(*Handler) .ServeHTTP (webdav.go:74)"

Alterar https://golang.org/cl/249797 menciona este problema: webdav: ignore os.PathError in PROPFIND

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

griesemer picture griesemer  ·  808Comentários

bradfitz picture bradfitz  ·  176Comentários

jessfraz picture jessfraz  ·  154Comentários

tklauser picture tklauser  ·  219Comentários

bradfitz picture bradfitz  ·  147Comentários