Passa al contenuto principale

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
  • Not nega 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, restituisce 412 Precondition Failed se 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

IntestazioneMetodiRichiestoPredefinitoValori
DAVOPTIONSDEVE-1, 2, 3, extend
DepthPROPFIND, LOCK, COPY, MOVEPUÒinfinity0, 1, infinity
DestinationCOPY, MOVEDEVE-URI assoluto
IfTuttiPUÒ-Token di stato, ETag
Lock-TokenUNLOCKDEVE-URI token di blocco
OverwriteCOPY, MOVEPUÒTT, F
TimeoutLOCKPUÒDeciso dal serverSecond-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.