Aller au contenu principal

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> (&lt;locktoken-a>) </b> (Not &lt;locktoken-b>)

5. Condition NOT:

PUT /resource HTTP/1.1
If: (Not &lt;DAV:no-lock>)

Évaluation:

  • Les listes dans () sont en AND
  • Les listes multiples sont en OR
  • Not inverse 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: &lt;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 &lt; >

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, retourne 412 Precondition Failed si 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:

&lt;D:timeout>Second-3600&lt;D:timeout>

Tableau récapitulatif des en-têtes

En-têteMéthodesRequisDéfautValeurs
DAVOPTIONSDOIT-1, 2, 3, extend
DepthPROPFIND, LOCK, COPY, MOVEPEUTinfinity0, 1, infinity
DestinationCOPY, MOVEDOIT-URI absolu
IfToutesPEUT-Jetons d'état, ETags
Lock-TokenUNLOCKDOIT-URI de jeton de verrouillage
OverwriteCOPY, MOVEPEUTTT, F
TimeoutLOCKPEUTDécidé par le serveurSecond-n, Infinite

Modèles d'utilisation

Modèle 1: Mise à jour conditionnelle avec verrouillage

PUT /file.txt HTTP/1.1
If: (&lt;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: (&lt;locktoken>) (["current-etag"])

Note: Pour les spécifications complètes des en-têtes, y compris la syntaxe ABNF, voir RFC 4918 Section 10.