Passa al contenuto principale

14. Range Requests (Richieste di intervallo)

I client spesso incontrano trasferimenti interrotti o hanno bisogno di ottenere solo un sottoinsieme di una grande rappresentazione. Le richieste di intervallo sono una funzionalità opzionale che consente ai client di richiedere uno o più sottointervalli della rappresentazione selezionata, piuttosto che l'intera rappresentazione.

Il meccanismo di richiesta di intervallo è utile in diversi scenari:

  • I download parziali di file di grandi dimensioni possono essere suddivisi in più richieste simultanee, velocizzando così il recupero complessivo
  • I trasferimenti interrotti possono essere ripresi dal punto di interruzione anziché ricominciare
  • Alcuni tipi di media consentono il rendering o la riproduzione incrementale, e gli agenti utente possono iniziare a elaborare i dati mentre vengono ricevuti

I server non sono tenuti a supportare le richieste di intervallo. Tuttavia, i server di origine DOVREBBERO supportare le richieste di intervallo, poiché possono ridurre l'utilizzo della rete e migliorare la reattività del servizio.

14.1. Range Units (Unità di intervallo)

Le rappresentazioni possono essere partizionate in sottointervalli in modi diversi. Un'unità di intervallo definisce come i dati di rappresentazione vengono partizionati.

range-unit       = token

Tutti i nomi delle unità di intervallo non fanno distinzione tra maiuscole e minuscole e DOVREBBERO essere registrati nel registro HTTP Range Unit Registry.

14.1.1. Range Specifiers (Specificatori di intervallo)

Uno specificatore di intervallo definisce uno o più sottointervalli di dati di rappresentazione.

range-spec       = range-unit "=" range-set
range-set = 1#range-spec-value
range-spec-value = int-range / suffix-range / other-range

Le unità di intervallo consentono ai client di indicare quale tipo di intervallo stanno richiedendo.

14.1.2. Byte Ranges (Intervalli di byte)

L'unità di intervallo "bytes" è definita per HTTP, rappresentando sottointervalli di una sequenza di ottetti (cioè, intervalli di byte).

byte-ranges-specifier = bytes-unit "=" byte-range-set
byte-range-set = 1#byte-range-spec
byte-range-spec = first-byte-pos "-" [ last-byte-pos ]
/ suffix-byte-range-spec
suffix-byte-range-spec = "-" suffix-length

first-byte-pos = 1*DIGIT
last-byte-pos = 1*DIGIT
suffix-length = 1*DIGIT
bytes-unit = "bytes"

Il valore first-byte-pos fornisce l'offset del byte del primo byte nell'intervallo. Il valore last-byte-pos fornisce l'offset del byte dell'ultimo byte nell'intervallo; cioè, le posizioni dei byte specificate sono inclusive. Gli offset dei byte iniziano da zero.

Esempi:

  • bytes=0-499 rappresenta i primi 500 byte
  • bytes=500-999 rappresenta i secondi 500 byte
  • bytes=-500 rappresenta gli ultimi 500 byte
  • bytes=500- rappresenta tutti i byte dal byte 500 in poi
  • bytes=0-0,-1 rappresenta il primo e l'ultimo byte

14.2. Range

Il campo di intestazione "Range" viene utilizzato per richiedere uno o più sottointervalli di dati di rappresentazione.

Range = range-unit "=" range-set

Un server PUÒ ignorare il campo di intestazione Range. Tuttavia, i server di origine e le cache intermedie DOVREBBERO supportare gli intervalli di byte quando possibile, poiché il supporto degli intervalli consente un recupero efficiente da trasferimenti parzialmente falliti e un recupero parziale di grandi rappresentazioni.

Un server DEVE ignorare un campo di intestazione Range ricevuto con un metodo di richiesta diverso da GET.

Un server di origine che supporta il campo di intestazione Range DEVE, se tutte le precondizioni sono vere:

  1. Ignorare il campo di intestazione Range se contiene un'unità di intervallo che non supporta
  2. Restituire un codice di stato 416 (Range Not Satisfiable) se il campo di intestazione Range è sintatticamente non valido
  3. Restituire una risposta 206 (Partial Content) contenente una o più rappresentazioni parziali se il campo di intestazione Range contiene un insieme soddisfacibile di intervalli di byte

Esempio di richiesta:

GET /document HTTP/1.1
Host: www.example.com
Range: bytes=0-1023

14.3. Accept-Ranges

Il campo di intestazione "Accept-Ranges" consente a un server di indicare che supporta le richieste di intervallo per la risorsa di destinazione.

Accept-Ranges = acceptable-ranges
acceptable-ranges = 1#range-unit / "none"

Un server di origine che accetta richieste di intervallo per una determinata risorsa di destinazione DOVREBBE inviare un campo di intestazione Accept-Ranges per indicare quali unità di intervallo sono supportate. Un client PUÒ generare richieste di intervallo senza ricevere questo campo di intestazione.

Esempi:

Accept-Ranges: bytes
Accept-Ranges: none

Il valore "none" indica che nessuna unità di intervallo è accettata, il che significa che il server non supporta alcuna richiesta di intervallo per quella risorsa.

14.4. Content-Range

Il campo di intestazione "Content-Range" viene inviato in una risposta 206 (Partial Content) a parte singola per indicare l'intervallo di byte della rappresentazione parziale inclusa, o in una risposta 416 (Range Not Satisfiable) per fornire informazioni sulla rappresentazione selezionata.

Content-Range       = range-unit SP
( range-resp / unsatisfied-range )

range-resp = byte-content-range
/ other-range-resp
byte-content-range = bytes-unit SP
( byte-range-resp / unsatisfied-range )

byte-range-resp = first-byte-pos "-" last-byte-pos
"/" ( complete-length / "*" )
complete-length = 1*DIGIT

unsatisfied-range = "*/" complete-length

other-range-resp = *CHAR

Esempi:

Content-Range: bytes 0-1023/5000
Content-Range: bytes 1024-2047/5000
Content-Range: bytes */5000

Il primo esempio indica che i primi 1024 byte di una rappresentazione completa (con una lunghezza di 5000 byte) vengono trasferiti. Il terzo esempio indica che una richiesta di intervallo non ha potuto essere soddisfatta perché la lunghezza completa della rappresentazione selezionata è di 5000 byte.

14.5. Partial PUT (PUT parziale)

Una richiesta PUT parziale non è una richiesta di intervallo, ma utilizza lo stesso meccanismo delle richieste di intervallo per descrivere il contenuto trasferito. Un client può inviare un PUT parziale includendo un campo di intestazione Content-Range nella richiesta PUT.

Tuttavia, il PUT parziale è raramente utilizzato nella pratica perché:

  1. Richiede che il client conosca lo stato corrente della risorsa
  2. È vulnerabile alle condizioni di gara
  3. La maggior parte dei server di origine non lo supporta

Pertanto, i client NON DOVREBBERO utilizzare il PUT parziale a meno che non siano certi che il server di destinazione lo supporti.

14.6. Media Type multipart/byteranges (Tipo di media multipart/byteranges)

Quando si inviano più intervalli, un server DOVREBBE utilizzare il tipo di media multipart/byteranges.

multipart/byteranges

Ogni parte del corpo di questo tipo di media DEVE includere:

  • Un campo di intestazione Content-Type che indica il tipo di media della rappresentazione contenuta in quella parte del corpo
  • Un campo di intestazione Content-Range che indica l'intervallo contenuto

Esempio di risposta:

HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-Type: text/html
Content-Range: bytes 0-100/1234

[primi 101 byte]
--THIS_STRING_SEPARATES
Content-Type: text/html
Content-Range: bytes 500-999/1234

[byte 500-999]
--THIS_STRING_SEPARATES--

Quando un client richiede più intervalli disgiunti, un server DOVREBBE restituire una risposta multipart solo se:

  1. Gli intervalli non si sovrappongono
  2. L'ordine degli intervalli è lo stesso del loro ordine nella rappresentazione

Altrimenti, il server DOVREBBE restituire l'intera rappresentazione o unire gli intervalli sovrapposti.