UNIXwork

Wie man nicht einen WebDAV-Server implementiert

20. Februar 2019

Ich hatte vor, als eine Ergänzung für dav, einen leichtgewichtigen WebDAV-Server zu entwickeln. Wäre gut wenn ich zu dav-sync gleich noch eine kompatible Server-Komponente anbieten kann, denn von verbreiteten Webservern kann eigentlich nur Apache WebDAV richtig. Alternativ könnte man hierfür auch Nextcloud verwenden, aber das will vielleicht auch nicht jeder.

Verwenden wollte ich das Go Package golang.org/x/net/webdav. Bis ich es mir genauer angeschaut habe.

Ein essentielles Feature sind die sogenannten Dead Properties. WebDAV erlaubt es beliebige XML-Werte als Properties in einer Ressource zu speichern. Dummerweise wird dies immer wieder schlecht implementiert. Ein Auszug aus der Dokumentation aus dem Go-Package:

// Property values of complex type or mixed-content must have fully
// expanded XML namespaces or be self-contained with according
// XML namespace declarations. They must not rely on any XML
// namespace declarations within the scope of the XML document,
// even including the DAV: namespace.
InnerXML []byte `xml:",innerxml"`

Es wird gefordert, dass wenn XML-Elemente darin vorkommen, diese ihren Namespace selbst deklarieren. Anders könnte man den Content auch nicht als einfaches Byte-Array speichern.

Man zwingt damit den Client dazu, seine XML-Requests auf besondere Art zu gestalten, die nirgendwo im WebDAV RFC gefordert wird. Es ist sogar so, dass im RFC Beispiele vorhanden sind, die dies schon nicht erfüllen.

Und wieder mal ein Beispiel für "zu faul um XML richtig zu verarbeiten". Leider nicht das erste mal, dass ich das bei einer WebDAV-Implementierung sehe.

Autor: Olaf | 2 Kommentare | Tags: webdav, go, google, rant

Kommentare

schlamar
17. Juni 2020 09:42

Kann die Kritik überhaupt nicht nachvollziehen. Das Beispiel im RFC 4.3.1 macht genau das (es wird der Namespace x im Property deklariert). Macht ja auch Sinn, dass ein Property XML unabhängig vom WebDAV XML spezifiziert sein soll und damit existieren kann.

Auch das "simplest example" für ein XML Property definiert einen Namespace:

<R:title xmlns:R="http://www.example.com/ns/"></R:title>

Meiner Meinung nach spezifiziert hier die Go Dokumentation nur etwas deutlicher die Vorgabe aus dem RFC: ein Property benötigt einen eigenen Namespace.

Olaf
10. August 2020 13:53

Unter 9.2.2. ist ein Beispiel für einen Proppatch-Request, der die Namespace-Deklaration im Root-Element enthält.

<?xml version="1.0" encoding="utf-8" ?>
<D:propertyupdate xmlns:D="DAV:"
    xmlns:Z="http://ns.example.com/standards/z39.50/">
<D:set>
<D:prop>
  <Z:Authors>
    <Z:Author>Jim Whitehead</Z:Author>
    <Z:Author>Roy Fielding</Z:Author>
  </Z:Authors>
</D:prop>
</D:set>
<D:remove>
<D:prop><Z:Copyright-Owner/></D:prop>
</D:remove>
</D:propertyupdate>

Name
Webseite (optional)
Captcha: 3x=12   x=?
Kommentar