10. HTTP Headers for Distributed Authoring (Intestazioni HTTP per la creazione distribuita)
WebDAV definisce diverse nuove intestazioni HTTP ed estende quelle esistenti per supportare le funzionalità di creazione distribuita.
10.1 DAV Header (Intestazione DAV)
Scopo: Indica le classi di conformità WebDAV e le funzionalità supportate.
Sintassi:
DAV = "DAV" ":" #(compliance-class)
compliance-class = ("1" | "2" | "3" | extend)
Esempio:
DAV: 1, 2, 3, `http://example.com/my-features`
Classi di conformità:
- Classe 1: Supporto WebDAV di base (PROPFIND, PROPPATCH, COPY, MOVE, MKCOL, ecc.)
- Classe 2: Classe 1 + Supporto blocco (LOCK, UNLOCK)
- Classe 3: Classe 1 + Collezioni ordinate
Utilizzo: DEVE essere restituito nella risposta OPTIONS. PUÒ essere restituito in altre risposte.
10.2 Depth Header (Intestazione Depth)
Scopo: Specifica la profondità dell'operazione per i metodi applicati alle collezioni.
Sintassi:
Depth = "Depth" ":" ("0" | "1" | "infinity")
Valori:
- 0: Applica solo alla risorsa di destinazione
- 1: Applica alla destinazione e ai figli diretti
- infinity: Applica ricorsivamente alla destinazione e a tutti i discendenti
Esempio:
PROPFIND /collection/ HTTP/1.1
Depth: 1
Comportamento predefinito:
- PROPFIND: Se omesso, trattato come
infinity - LOCK: Se omesso, trattato come
infinity - COPY/MOVE: Se omesso, trattato come
infinity
Vincoli: Alcuni server POSSONO rifiutare Depth: infinity a causa di vincoli di risorse.
10.3 Destination Header (Intestazione Destination)
Scopo: Specifica l'URI di destinazione per le operazioni COPY e MOVE.
Sintassi:
Destination = "Destination" ":" Simple-ref
Esempio:
COPY /source HTTP/1.1
Host: example.com
Destination: http://example.com/dest
Requisiti:
- DEVE essere un URI assoluto
- DEVE essere sullo stesso host del Request-URI (per la maggior parte delle implementazioni)
- Si applicano le regole di codifica URI
10.4 If Header (Intestazione If)
Scopo: Fornisce esecuzione condizionale basata su token di stato (ETag o token di blocco).
Sintassi:
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
Esempi:
1. Semplice invio di token di blocco:
PUT /resource HTTP/1.1
If: (<opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>)
2. Condizioni multiple (OR):
DELETE /resource HTTP/1.1
If: (<locktoken1>) (<locktoken2>)
3. Condizioni multiple (AND):
MOVE /resource HTTP/1.1
If: (<locktoken>) (["etag123"])
4. Lista con tag (risorse multiple):
COPY /a HTTP/1.1
Destination: /b
If: </a> (<locktoken-a>) </b> (Not <locktoken-b>)
5. Condizione NOT:
PUT /resource HTTP/1.1
If: (Not <DAV:no-lock>)
Valutazione:
- Le liste all'interno di
()sono in AND - Le liste multiple sono in OR
Notnega la condizione- Il fallimento della valutazione dell'intestazione If restituisce
412 Precondition Failed
10.5 Lock-Token Header (Intestazione Lock-Token)
Scopo: Fornisce il token di blocco per le operazioni UNLOCK.
Sintassi:
Lock-Token = "Lock-Token" ":" Coded-URL
Esempio:
UNLOCK /resource HTTP/1.1
Lock-Token: <opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>
Requisiti:
- DEVE essere utilizzato con il metodo UNLOCK
- Contiene esattamente un token di blocco
- Il token di blocco DEVE essere tra parentesi angolari
< >
10.6 Overwrite Header (Intestazione Overwrite)
Scopo: Specifica se sovrascrivere la risorsa di destinazione in COPY/MOVE.
Sintassi:
Overwrite = "Overwrite" ":" ("T" | "F")
Valori:
- T (True): Sovrascrivi la destinazione se esiste (predefinito)
- F (False): Fallisci se la destinazione esiste (restituisci 412)
Esempio:
COPY /source HTTP/1.1
Destination: http://example.com/dest
Overwrite: F
Predefinito: Se omesso, trattato come T.
Comportamento:
- Con
Overwrite: F, restituisce412 Precondition Failedse la destinazione esiste - Con
Overwrite: T, la destinazione viene sostituita silenziosamente
10.7 Timeout Header (Intestazione Timeout)
Scopo: Specifica la durata del timeout di blocco richiesto.
Sintassi:
Timeout = "Timeout" ":" 1#TimeType
TimeType = ("Second-" DAVTimeOutVal | "Infinite")
DAVTimeOutVal = 1*DIGIT
Esempi:
LOCK /resource HTTP/1.1
Timeout: Second-3600
LOCK /resource HTTP/1.1
Timeout: Infinite, Second-3600
Semantica:
- Second-n: Richiedi blocco per n secondi
- Infinite: Richiedi blocco senza timeout
- Valori multipli indicano l'ordine di preferenza
- Il server sceglie dalla lista del client o usa il proprio valore
- Il timeout effettivamente concesso viene restituito nella risposta
Esempio di risposta:
<D:timeout>Second-3600</D:timeout>
Tabella riepilogativa delle intestazioni
| Intestazione | Metodi | Richiesto | Predefinito | Valori |
|---|---|---|---|---|
| DAV | OPTIONS | DEVE | - | 1, 2, 3, extend |
| Depth | PROPFIND, LOCK, COPY, MOVE | PUÒ | infinity | 0, 1, infinity |
| Destination | COPY, MOVE | DEVE | - | URI assoluto |
| If | Tutti | PUÒ | - | Token di stato, ETag |
| Lock-Token | UNLOCK | DEVE | - | URI token di blocco |
| Overwrite | COPY, MOVE | PUÒ | T | T, F |
| Timeout | LOCK | PUÒ | Deciso dal server | Second-n, Infinite |
Modelli di utilizzo
Modello 1: Aggiornamento condizionale con blocco
PUT /file.txt HTTP/1.1
If: (<opaquelocktoken:...>)
Content-Type: text/plain
New content
Modello 2: COPY sicuro (non sovrascrivere)
COPY /source HTTP/1.1
Destination: /dest
Overwrite: F
Depth: infinity
Modello 3: Blocco con preferenza di timeout
LOCK /resource HTTP/1.1
Timeout: Infinite, Second-7200, Second-3600
Depth: 0
Modello 4: Condizioni If complesse
DELETE /locked-resource HTTP/1.1
If: (<locktoken>) (["current-etag"])
Nota: Per le specifiche complete delle intestazioni, inclusa la sintassi ABNF, vedere RFC 4918 Sezione 10.