10. En-têtes HTTP pour la création distribuée (HTTP Headers for Distributed Authoring)
WebDAV (Web Distributed Authoring and Versioning, création et gestion de versions distribuées sur le Web) définit plusieurs nouveaux en-têtes HTTP pour prendre en charge les fonctionnalités de création distribuée.
10.1 En-tête DAV (DAV Header)
L'en-tête DAV indique le niveau de fonctionnalités WebDAV pris en charge par le serveur.
Syntaxe
DAV: 1, 2, 3, access-control, calendar-access
Niveaux de conformité
- 1 : prise en charge WebDAV de base (PROPFIND, PROPPATCH, MKCOL, extensions GET/HEAD, extensions PUT, extensions DELETE, OPTIONS, COPY, MOVE)
- 2 : inclut le niveau 1 + prise en charge de LOCK et UNLOCK
- 3 : inclut le niveau 2 + prise en charge des collections ordonnées (optionnel)
Cas d'utilisation
Réponse OPTIONS :
OPTIONS /resource HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
DAV: 1, 2
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK
10.2 En-tête Depth (Depth Header)
L'en-tête Depth est utilisé pour spécifier la profondeur à laquelle une opération DOIT s'appliquer dans la hiérarchie de ressources.
Syntaxe
Depth: 0 | 1 | infinity
Signification des valeurs
- 0 : s'applique uniquement à la ressource cible elle-même
- 1 : s'applique à la ressource et à ses membres directs
- infinity : s'applique récursivement à la ressource et à tous ses descendants
Méthodes applicables
| Méthode | Prise en charge de Depth | Valeur par défaut |
|---|---|---|
| PROPFIND | 0, 1, infinity | infinity |
| COPY | 0, infinity | infinity |
| MOVE | infinity (les autres valeurs sont ignorées) | infinity |
| LOCK | 0, infinity | infinity |
| DELETE | ignoré (toujours récursif) | N/A |
Exemple
<!-- Interroger uniquement les propriétés de la collection elle-même -->
PROPFIND /collection/ HTTP/1.1
Host: example.com
Depth: 0
<!-- Interroger la collection et ses membres directs -->
PROPFIND /collection/ HTTP/1.1
Host: example.com
Depth: 1
10.3 En-tête Destination (Destination Header)
L'en-tête Destination spécifie l'URL de destination pour les opérations COPY ou MOVE.
Syntaxe
Destination: absoluteURI
Exigences
- Obligatoire : les méthodes COPY et MOVE DOIVENT inclure cet en-tête
- URI absolu : DOIT être un URI absolu complet
- Même serveur : la source et la destination sont généralement requises sur le même serveur
Exemple
COPY /source/file.txt HTTP/1.1
Host: example.com
Destination: http://example.com/destination/file.txt
Overwrite: T
MOVE /old-name.doc HTTP/1.1
Host: example.com
Destination: http://example.com/new-name.doc
10.4 En-tête If (If Header)
L'en-tête If fournit un mécanisme pour conditionner l'exécution des méthodes WebDAV, utilisé pour soumettre des jetons de verrou et des ETags.
Syntaxe
L'en-tête If a deux formes :
Forme No-tag-list :
If: (<locktoken>) ([etag])
Forme Tagged-list :
If: <resource-url> (<locktoken>)
Usages
- Soumettre un jeton de verrou — prouver que le client détient le verrou
- Requête conditionnelle — exécution conditionnelle basée sur l'ETag
- Combinaison logique — prend en charge la logique ET et OU
Exemple
Soumettre un jeton de verrou :
PUT /locked-resource HTTP/1.1
Host: example.com
If: (<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>)
Content-Type: text/plain
Updated content
Conditions multiples :
DELETE /resource HTTP/1.1
Host: example.com
If: `http://example.com/resource`
(<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>)
(["e0-b2-1a2"])
Condition NOT :
If: (Not <urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>)
Règles de correspondance de l'en-tête If
- Correspondance du jeton de verrou — vérifier si le jeton soumis correspond au verrou de la ressource
- Correspondance ETag — vérifier si l'étiquette d'entité correspond
- Évaluation logique — évaluation de gauche à droite, avec court-circuit
Cas d'utilisation
Cas 1 : Modifier une ressource verrouillée
PUT /locked-doc HTTP/1.1
If: (<urn:uuid:lock-token-here>)
Cas 2 : COPY vers une destination verrouillée
COPY /source HTTP/1.1
Destination: http://example.com/locked-dest
If: `http://example.com/locked-dest`
(<urn:uuid:dest-lock-token>)
Cas 3 : Mise à jour conditionnelle
PUT /resource HTTP/1.1
If: (["etag-value"])
10.5 En-tête Lock-Token (Lock-Token Header)
L'en-tête Lock-Token est utilisé dans la méthode UNLOCK pour spécifier le verrou à supprimer.
Syntaxe
Lock-Token: <uri>
Utilisation
Utilisé uniquement pour UNLOCK :
UNLOCK /resource HTTP/1.1
Host: example.com
Lock-Token: <urn:uuid:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>
HTTP/1.1 204 No Content
Différence avec l'en-tête If
- Lock-Token : utilisé uniquement pour UNLOCK, spécifie le verrou à supprimer
- If : utilisé pour les autres méthodes, soumet le jeton de verrou pour prouver l'autorisation
10.6 En-tête Overwrite (Overwrite Header)
L'en-tête Overwrite spécifie si une opération COPY ou MOVE DOIT écraser la ressource de destination.
Syntaxe
Overwrite: T | F
Valeurs
- T (True) : écraser la ressource de destination (par défaut)
- F (False) : ne pas écraser ; échouer si la destination existe
Comportement
Overwrite: T :
- Si la destination existe, la supprimer d'abord
- Puis créer la nouvelle ressource
- Retourner 204 No Content
Overwrite: F :
- Si la destination existe, l'opération échoue
- Retourner 412 Precondition Failed
- Aucune ressource n'est modifiée
Exemple
<!-- Ne pas écraser le fichier existant -->
COPY /source.txt HTTP/1.1
Host: example.com
Destination: http://example.com/dest.txt
Overwrite: F
<!-- Si dest.txt existe -->
HTTP/1.1 412 Precondition Failed
<!-- Si dest.txt n'existe pas -->
HTTP/1.1 201 Created
10.7 En-tête Timeout de requête (Timeout Request Header)
L'en-tête Timeout est utilisé dans les requêtes LOCK pour suggérer un délai d'expiration du verrou.
Syntaxe
Timeout: Second-<seconds> | Infinite
Exemple
LOCK /resource HTTP/1.1
Host: example.com
Timeout: Second-3600
<!-- Ou demander un délai d'expiration infini -->
Timeout: Infinite
<!-- Plusieurs valeurs de délai (par ordre de priorité) -->
Timeout: Infinite, Second-604800, Second-86400
Comportement du serveur
- PEUT refuser : le serveur PEUT ignorer la suggestion du client
- Retourner la valeur réelle : la réponse DOIT inclure le délai d'expiration choisi par le serveur
- Limites de sécurité : le serveur PEUT limiter le délai d'expiration maximal
Timeout dans la réponse
<D:activelock>
<D:timeout>Second-3600<D:timeout>
...
<D:activelock>
Référence rapide des en-têtes HTTP
| En-tête | Méthodes | Obligatoire/Optionnel | Description |
|---|---|---|---|
| DAV | OPTIONS | Réponse | Niveaux de fonctionnalités pris en charge par le serveur |
| Depth | PROPFIND, COPY, LOCK | Optionnel | Profondeur de l'opération |
| Destination | COPY, MOVE | Obligatoire | URL de destination |
| If | Toutes méthodes | Optionnel | Exécution conditionnelle et soumission de jeton de verrou |
| Lock-Token | UNLOCK | Obligatoire | Jeton de verrou à supprimer |
| Overwrite | COPY, MOVE | Optionnel | Écraser ou non la destination |
| Timeout | LOCK | Optionnel | Délai d'expiration suggéré du verrou |
Résumé du chapitre : Le chapitre 10 définit les 7 en-têtes HTTP spécialisés de WebDAV. Ces en-têtes étendent les capacités d'HTTP/1.1 pour prendre en charge les opérations en profondeur (Depth), les opérations sur les ressources (Destination, Overwrite), la gestion des verrous (Lock-Token, Timeout) et l'exécution conditionnelle (If). L'utilisation correcte de ces en-têtes est essentielle pour implémenter des clients et serveurs WebDAV fiables.