Zum Hauptinhalt springen

10. HTTP Headers for Distributed Authoring (HTTP-Header für verteilte Bearbeitung)

WebDAV definiert mehrere neue HTTP-Header und erweitert bestehende, um Funktionen für verteilte Bearbeitung zu unterstützen.

10.1 DAV Header (DAV-Header)

Zweck: Zeigt WebDAV-Konformitätsklassen und unterstützte Funktionen an.

Syntax:

DAV = "DAV" ":" #(compliance-class)
compliance-class = ("1" | "2" | "3" | extend)

Beispiel:

DAV: 1, 2, 3, `http://example.com/my-features`

Konformitätsklassen:

  • Klasse 1: Basis-WebDAV-Unterstützung (PROPFIND, PROPPATCH, COPY, MOVE, MKCOL, etc.)
  • Klasse 2: Klasse 1 + Sperr-Unterstützung (LOCK, UNLOCK)
  • Klasse 3: Klasse 1 + Geordnete Sammlungen

Verwendung: MUSS in der OPTIONS-Antwort zurückgegeben werden. KANN in anderen Antworten zurückgegeben werden.

10.2 Depth Header (Depth-Header)

Zweck: Gibt die Operationstiefe für auf Sammlungen angewandte Methoden an.

Syntax:

Depth = "Depth" ":" ("0" | "1" | "infinity")

Werte:

  • 0: Nur auf Zielressource anwenden
  • 1: Auf Ziel und direkte Kinder anwenden
  • infinity: Rekursiv auf Ziel und alle Nachkommen anwenden

Beispiel:

PROPFIND /collection/ HTTP/1.1
Depth: 1

Standardverhalten:

  • PROPFIND: Falls weggelassen, wird als infinity behandelt
  • LOCK: Falls weggelassen, wird als infinity behandelt
  • COPY/MOVE: Falls weggelassen, wird als infinity behandelt

Einschränkungen: Einige Server KÖNNEN Depth: infinity aufgrund von Ressourcenbeschränkungen ablehnen.

10.3 Destination Header (Destination-Header)

Zweck: Gibt die Ziel-URI für COPY- und MOVE-Operationen an.

Syntax:

Destination = "Destination" ":" Simple-ref

Beispiel:

COPY /source HTTP/1.1
Host: example.com
Destination: http://example.com/dest

Anforderungen:

  • MUSS eine absolute URI sein
  • MUSS auf demselben Host wie die Request-URI sein (für die meisten Implementierungen)
  • URI-Kodierungsregeln gelten

10.4 If Header (If-Header)

Zweck: Bietet bedingte Ausführung basierend auf Zustandstoken (ETags oder Sperr-Token).

Syntax:

If = "If" ":" ( 1*No-tag-list | 1*Tagged-list )
No-tag-list = List
Tagged-list = Resource-Tag 1*List
List = "(" 1*Condition ")"
Condition = ["Not"] (State-token | "[" entity-tag "]")
State-token = Coded-URL

Beispiele:

1. Einfache Sperr-Token-Übermittlung:

PUT /resource HTTP/1.1
If: (<opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>)

2. Mehrere Bedingungen (OR):

DELETE /resource HTTP/1.1
If: (<locktoken1>) (<locktoken2>)

3. Mehrere Bedingungen (AND):

MOVE /resource HTTP/1.1
If: (<locktoken>) (["etag123"])

4. Getaggte Liste (mehrere Ressourcen):

COPY /a HTTP/1.1
Destination: /b
If: </a> (<locktoken-a>) </b> (Not <locktoken-b>)

5. NOT-Bedingung:

PUT /resource HTTP/1.1
If: (Not <DAV:no-lock>)

Auswertung:

  • Listen innerhalb () werden mit AND verknüpft
  • Mehrere Listen werden mit OR verknüpft
  • Not negiert die Bedingung
  • Fehlschlagen der If-Header-Auswertung gibt 412 Precondition Failed zurück

10.5 Lock-Token Header (Lock-Token-Header)

Zweck: Stellt das Sperr-Token für UNLOCK-Operationen bereit.

Syntax:

Lock-Token = "Lock-Token" ":" Coded-URL

Beispiel:

UNLOCK /resource HTTP/1.1
Lock-Token: <opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>

Anforderungen:

  • MUSS mit der UNLOCK-Methode verwendet werden
  • Enthält genau ein Sperr-Token
  • Sperr-Token MUSS in spitzen Klammern < > stehen

10.6 Overwrite Header (Overwrite-Header)

Zweck: Gibt an, ob die Zielressource bei COPY/MOVE überschrieben werden soll.

Syntax:

Overwrite = "Overwrite" ":" ("T" | "F")

Werte:

  • T (True): Ziel überschreiben, falls vorhanden (Standard)
  • F (False): Fehlschlagen, falls Ziel existiert (412 zurückgeben)

Beispiel:

COPY /source HTTP/1.1
Destination: http://example.com/dest
Overwrite: F

Standard: Falls weggelassen, wird als T behandelt.

Verhalten:

  • Mit Overwrite: F wird 412 Precondition Failed zurückgegeben, falls Ziel existiert
  • Mit Overwrite: T wird das Ziel stillschweigend ersetzt

10.7 Timeout Header (Timeout-Header)

Zweck: Gibt die angeforderte Sperr-Timeout-Dauer an.

Syntax:

Timeout = "Timeout" ":" 1#TimeType
TimeType = ("Second-" DAVTimeOutVal | "Infinite")
DAVTimeOutVal = 1*DIGIT

Beispiele:

LOCK /resource HTTP/1.1
Timeout: Second-3600

LOCK /resource HTTP/1.1
Timeout: Infinite, Second-3600

Semantik:

  • Second-n: Sperre für n Sekunden anfordern
  • Infinite: Sperre ohne Timeout anfordern
  • Mehrere Werte geben Präferenzreihenfolge an
  • Server wählt aus der Client-Liste oder verwendet eigenen Wert
  • Tatsächlich gewährter Timeout wird in Antwort zurückgegeben

Antwortbeispiel:

<D:timeout>Second-3600</D:timeout>

Header-Zusammenfassungstabelle

HeaderMethodenErforderlichStandardWerte
DAVOPTIONSMUSS-1, 2, 3, extend
DepthPROPFIND, LOCK, COPY, MOVEKANNinfinity0, 1, infinity
DestinationCOPY, MOVEMUSS-Absolute URI
IfAlleKANN-Zustandstoken, ETags
Lock-TokenUNLOCKMUSS-Sperr-Token-URI
OverwriteCOPY, MOVEKANNTT, F
TimeoutLOCKKANNServer-entschiedenSecond-n, Infinite

Verwendungsmuster

Muster 1: Bedingte Aktualisierung mit Sperre

PUT /file.txt HTTP/1.1
If: (<opaquelocktoken:...>)
Content-Type: text/plain

New content

Muster 2: Sicherer COPY (nicht überschreiben)

COPY /source HTTP/1.1
Destination: /dest
Overwrite: F
Depth: infinity

Muster 3: Sperre mit Timeout-Präferenz

LOCK /resource HTTP/1.1
Timeout: Infinite, Second-7200, Second-3600
Depth: 0

Muster 4: Komplexe If-Bedingungen

DELETE /locked-resource HTTP/1.1
If: (<locktoken>) (["current-etag"])

Hinweis: Für vollständige Header-Spezifikationen einschließlich ABNF-Syntax siehe RFC 4918 Abschnitt 10.