10. HTTP Headers for Distributed Authoring (En-têtes HTTP pour la création distribuée)
WebDAV définit plusieurs nouveaux en-têtes HTTP et étend ceux existants pour prendre en charge les fonctionnalités de création distribuée.
10.1 DAV Header (En-tête DAV)
Objectif: Indique les classes de conformité WebDAV et les fonctionnalités prises en charge.
Syntaxe:
DAV = "DAV" ":" #(compliance-class)
compliance-class = ("1" | "2" | "3" | extend)
Exemple:
DAV: 1, 2, 3, `http://example.com/my-features`
Classes de conformité:
- Classe 1: Support WebDAV de base (PROPFIND, PROPPATCH, COPY, MOVE, MKCOL, etc.)
- Classe 2: Classe 1 + Support du verrouillage (LOCK, UNLOCK)
- Classe 3: Classe 1 + Collections ordonnées
Utilisation: DOIT être retourné dans la réponse OPTIONS. PEUT être retourné dans d'autres réponses.
10.2 Depth Header (En-tête Depth)
Objectif: Spécifie la profondeur d'opération pour les méthodes appliquées aux collections.
Syntaxe:
Depth = "Depth" ":" ("0" | "1" | "infinity")
Valeurs:
- 0: Appliquer uniquement à la ressource cible
- 1: Appliquer à la cible et à ses enfants directs
- infinity: Appliquer récursivement à la cible et à tous les descendants
Exemple:
PROPFIND /collection/ HTTP/1.1
Depth: 1
Comportement par défaut:
- PROPFIND: Si omis, traité comme
infinity - LOCK: Si omis, traité comme
infinity - COPY/MOVE: Si omis, traité comme
infinity
Contraintes: Certains serveurs PEUVENT rejeter Depth: infinity en raison de contraintes de ressources.
10.3 Destination Header (En-tête Destination)
Objectif: Spécifie l'URI de destination pour les opérations COPY et MOVE.
Syntaxe:
Destination = "Destination" ":" Simple-ref
Exemple:
COPY /source HTTP/1.1
Host: example.com
Destination: http://example.com/dest
Exigences:
- DOIT être un URI absolu
- DOIT être sur le même hôte que Request-URI (pour la plupart des implémentations)
- Les règles d'encodage URI s'appliquent
10.4 If Header (En-tête If)
Objectif: Fournit une exécution conditionnelle basée sur les jetons d'état (ETags ou jetons de verrouillage).
Syntaxe:
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
Exemples:
1. Soumission simple de jeton de verrouillage:
PUT /resource HTTP/1.1
If: (<opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>)
2. Conditions multiples (OR):
DELETE /resource HTTP/1.1
If: (<locktoken1>) (<locktoken2>)
3. Conditions multiples (AND):
MOVE /resource HTTP/1.1
If: (<locktoken>) (["etag123"])
4. Liste balisée (ressources multiples):
COPY /a HTTP/1.1
Destination: /b
If: </a> (<locktoken-a>) </b> (Not <locktoken-b>)
5. Condition NOT:
PUT /resource HTTP/1.1
If: (Not <DAV:no-lock>)
Évaluation:
- Les listes dans
()sont en AND - Les listes multiples sont en OR
Notinverse la condition- L'échec de l'évaluation de l'en-tête If retourne
412 Precondition Failed
10.5 Lock-Token Header (En-tête Lock-Token)
Objectif: Fournit le jeton de verrouillage pour les opérations UNLOCK.
Syntaxe:
Lock-Token = "Lock-Token" ":" Coded-URL
Exemple:
UNLOCK /resource HTTP/1.1
Lock-Token: <opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>
Exigences:
- DOIT être utilisé avec la méthode UNLOCK
- Contient exactement un jeton de verrouillage
- Le jeton de verrouillage DOIT être entre crochets angulaires
< >
10.6 Overwrite Header (En-tête Overwrite)
Objectif: Spécifie s'il faut écraser la ressource de destination dans COPY/MOVE.
Syntaxe:
Overwrite = "Overwrite" ":" ("T" | "F")
Valeurs:
- T (True): Écraser la destination si elle existe (par défaut)
- F (False): Échouer si la destination existe (retourner 412)
Exemple:
COPY /source HTTP/1.1
Destination: http://example.com/dest
Overwrite: F
Par défaut: Si omis, traité comme T.
Comportement:
- Avec
Overwrite: F, retourne412 Precondition Failedsi la destination existe - Avec
Overwrite: T, la destination est remplacée silencieusement
10.7 Timeout Header (En-tête Timeout)
Objectif: Spécifie la durée de timeout du verrouillage demandé.
Syntaxe:
Timeout = "Timeout" ":" 1#TimeType
TimeType = ("Second-" DAVTimeOutVal | "Infinite")
DAVTimeOutVal = 1*DIGIT
Exemples:
LOCK /resource HTTP/1.1
Timeout: Second-3600
LOCK /resource HTTP/1.1
Timeout: Infinite, Second-3600
Sémantique:
- Second-n: Demander un verrouillage pour n secondes
- Infinite: Demander un verrouillage sans timeout
- Plusieurs valeurs indiquent l'ordre de préférence
- Le serveur choisit dans la liste du client ou utilise sa propre valeur
- Le timeout réellement accordé est retourné dans la réponse
Exemple de réponse:
<D:timeout>Second-3600<D:timeout>
Tableau récapitulatif des en-têtes
| En-tête | Méthodes | Requis | Défaut | Valeurs |
|---|---|---|---|---|
| DAV | OPTIONS | DOIT | - | 1, 2, 3, extend |
| Depth | PROPFIND, LOCK, COPY, MOVE | PEUT | infinity | 0, 1, infinity |
| Destination | COPY, MOVE | DOIT | - | URI absolu |
| If | Toutes | PEUT | - | Jetons d'état, ETags |
| Lock-Token | UNLOCK | DOIT | - | URI de jeton de verrouillage |
| Overwrite | COPY, MOVE | PEUT | T | T, F |
| Timeout | LOCK | PEUT | Décidé par le serveur | Second-n, Infinite |
Modèles d'utilisation
Modèle 1: Mise à jour conditionnelle avec verrouillage
PUT /file.txt HTTP/1.1
If: (<opaquelocktoken:...>)
Content-Type: text/plain
New content
Modèle 2: COPY sécurisé (ne pas écraser)
COPY /source HTTP/1.1
Destination: /dest
Overwrite: F
Depth: infinity
Modèle 3: Verrouillage avec préférence de timeout
LOCK /resource HTTP/1.1
Timeout: Infinite, Second-7200, Second-3600
Depth: 0
Modèle 4: Conditions If complexes
DELETE /locked-resource HTTP/1.1
If: (<locktoken>) (["current-etag"])
Note: Pour les spécifications complètes des en-têtes, y compris la syntaxe ABNF, voir RFC 4918 Section 10.