Saat mencoba membuat daftar direktori yang berisi tautan rusak, saya mendapatkan kesalahan yang tidak informatif:
$ 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
Inilah yang saya dapatkan dari server webdav:
2016/06/27 14:52:42 http: multiple response.WriteHeader calls
Kesalahan berasal dari file.go [1] di mana ia memanggil stat pada file tautan yang rusak tetapi saya pikir mungkin itu harus ditangani di webdav.go walkFn [2].
Saya sendiri tidak yakin apa yang harus dicetak/dikembalikan tetapi saya berharap untuk mendapatkan daftar direktori lengkap (yaitu webdav tidak boleh menghancurkan ini menurut saya) dengan tautan ini ditandai entah bagaimana rusak.
[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
Saya hanya mengalami masalah ini untuk. Saya memperbaikinya secara lokal dengan hanya mengembalikan nil ketika mendapatkan kesalahan di sini https://github.com/golang/net/blob/master/webdav/webdav.go#L557 .
Saya menguji kasus penggunaan yang sama dengan implementasi Apache dan dalam kasus symlink yang rusak, itu dibuang secara diam-diam.
Saya tidak tahu apakah itu solusi yang cukup baik tetapi perilaku hari ini juga salah.
Berikut adalah jejak wireshark dari respons yang salah
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
Di Webdav Spec dikatakan bahwa
Dalam kasus allprop dan propname, jika prinsipal tidak memiliki
hak untuk mengetahui apakah ada properti tertentu daripada properti itu
harus diam-diam dikeluarkan dari tanggapan.
Saya tidak tahu apakah ini berlaku dalam kasus penggunaan kami
Saya pikir kode status 4XX
harus dikembalikan jika mengakses tautan yang rusak, lebih khusus lagi, 403 Forbidden
untuk tautan yang ditautkan ke target di luar izin, dan 404 Not Found
untuk tautan yang ditautkan ke target yang tidak ada.
Saat ini kesalahan dikembalikan oleh FileSystem.OpenFile
atau File.Stat
transfer ke http.StatusInternalServerError
dan menyebabkan "http: respons berlebihan. Panggilan WriteHeader dari golang.org/x/net/webdav.(*Handler) .ServeHTTP (webdav.go:74)"
Ubah https://golang.org/cl/249797 menyebutkan masalah ini: webdav: ignore os.PathError in PROPFIND
Komentar yang paling membantu
Saya hanya mengalami masalah ini untuk. Saya memperbaikinya secara lokal dengan hanya mengembalikan nil ketika mendapatkan kesalahan di sini https://github.com/golang/net/blob/master/webdav/webdav.go#L557 .
Saya menguji kasus penggunaan yang sama dengan implementasi Apache dan dalam kasus symlink yang rusak, itu dibuang secara diam-diam.
Saya tidak tahu apakah itu solusi yang cukup baik tetapi perilaku hari ini juga salah.
Berikut adalah jejak wireshark dari respons yang salah
Di Webdav Spec dikatakan bahwa
Saya tidak tahu apakah ini berlaku dalam kasus penggunaan kami