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
infinitybehandelt - LOCK: Falls weggelassen, wird als
infinitybehandelt - COPY/MOVE: Falls weggelassen, wird als
infinitybehandelt
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
Notnegiert die Bedingung- Fehlschlagen der If-Header-Auswertung gibt
412 Precondition Failedzurü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: Fwird412 Precondition Failedzurückgegeben, falls Ziel existiert - Mit
Overwrite: Twird 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
| Header | Methoden | Erforderlich | Standard | Werte |
|---|---|---|---|---|
| DAV | OPTIONS | MUSS | - | 1, 2, 3, extend |
| Depth | PROPFIND, LOCK, COPY, MOVE | KANN | infinity | 0, 1, infinity |
| Destination | COPY, MOVE | MUSS | - | Absolute URI |
| If | Alle | KANN | - | Zustandstoken, ETags |
| Lock-Token | UNLOCK | MUSS | - | Sperr-Token-URI |
| Overwrite | COPY, MOVE | KANN | T | T, F |
| Timeout | LOCK | KANN | Server-entschieden | Second-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.