Go: x/net/webdav: gagal pada tautan yang rusak

Dibuat pada 27 Jun 2016  ·  3Komentar  ·  Sumber: golang/go

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

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

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

Semua 3 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat