Go: x / net / webdav: فشل في الروابط المعطلة

تم إنشاؤها على ٢٧ يونيو ٢٠١٦  ·  3تعليقات  ·  مصدر: golang/go

عند محاولة سرد دليل يحتوي على رابط معطل ، أحصل على خطأ غير إعلامي:

$ 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

هذا ما أحصل عليه من خادم webdav:

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

يأتي الخطأ من file.go [1] حيث يستدعي stat على ملف الارتباط المعطل ولكني أعتقد أنه ربما ينبغي معالجته في webdav.go walkFn [2].

لست متأكدًا بنفسي مما يجب طباعته / إعادته ، لكنني أتوقع الحصول على قائمة الدليل الكاملة (على سبيل المثال ، يجب ألا يسحق webdav هذا في رأيي) مع وضع علامة على هذا الرابط معطل بطريقة ما.

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

/ سم مكعب @ simon3z

التعليق الأكثر فائدة

أنا فقط واجهت هذه المشكلة ل. لقد أصلحته محليًا عن طريق إرجاع لا شيء عند ظهور خطأ هنا https://github.com/golang/net/blob/master/webdav/webdav.go#L557.

لقد اختبرت نفس حالة الاستخدام مع تطبيق Apache وفي حالة وجود رابط رمزي معطل ، يتم تجاهلها بصمت.

لا أعرف ما إذا كان هذا حلاً جيدًا بما يكفي ولكن سلوك اليوم غير صحيح أيضًا.
فيما يلي تتبع wireshark للاستجابة الخاطئة

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

في Webdav Spec يقال أن

في حالة allprop و propname ، إذا لم يكن الرئيسي لديه
الحق في معرفة ما إذا كانت هناك خاصية معينة ثم الممتلكات
يجب استبعادها بصمت من الرد.

لا أعرف ما إذا كان هذا ينطبق في حالة الاستخدام لدينا

ال 3 كومينتر

أنا فقط واجهت هذه المشكلة ل. لقد أصلحته محليًا عن طريق إرجاع لا شيء عند ظهور خطأ هنا https://github.com/golang/net/blob/master/webdav/webdav.go#L557.

لقد اختبرت نفس حالة الاستخدام مع تطبيق Apache وفي حالة وجود رابط رمزي معطل ، يتم تجاهلها بصمت.

لا أعرف ما إذا كان هذا حلاً جيدًا بما يكفي ولكن سلوك اليوم غير صحيح أيضًا.
فيما يلي تتبع wireshark للاستجابة الخاطئة

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

في Webdav Spec يقال أن

في حالة allprop و propname ، إذا لم يكن الرئيسي لديه
الحق في معرفة ما إذا كانت هناك خاصية معينة ثم الممتلكات
يجب استبعادها بصمت من الرد.

لا أعرف ما إذا كان هذا ينطبق في حالة الاستخدام لدينا

أعتقد أنه يجب إرجاع رمز الحالة 4XX في حالة الوصول إلى الروابط المعطلة ، وبشكل أكثر تحديدًا ، 403 Forbidden للروابط المرتبطة بأهداف خارج الأذونات ، و 404 Not Found للروابط المرتبطة لأهداف غير موجودة.

تظهر الأخطاء حاليًا بواسطة FileSystem.OpenFile أو File.Stat التحويل إلى http.StatusInternalServerError وتسبب "http: superfluous response.WriteHeader call from golang.org/x/net/webdav.(*Handler) .ServeHTTP (webdav.go: 74) "

تغيير https://golang.org/cl/249797 يذكر هذه المشكلة: webdav: ignore os.PathError in PROPFIND

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات