2. Unità di intervallo
Una rappresentazione può essere suddivisa in intervalli secondo varie unità strutturali, in base alla struttura propria del tipo di media della rappresentazione. Tale "unità di intervallo" è usata nel campo di intestazione di risposta Accept-Ranges (Sezione 2.3) per dichiarare il supporto alle richieste di intervallo, nel campo di intestazione di richiesta Range (Sezione 3.1) per delimitare le parti di una rappresentazione che vengono richieste e nel campo di intestazione di payload Content-Range (Sezione 4.2) per descrivere quale parte di una rappresentazione viene trasferita.
range-unit = bytes-unit / other-range-unit
2.1 Intervalli di byte
Poiché i dati di una rappresentazione vengono trasferiti nei payload come una sequenza di ottetti, un intervallo di byte costituisce una sottostruttura significativa per qualsiasi rappresentazione trasferibile tramite HTTP (Sezione 3 di [RFC7231]). L'unità di intervallo "bytes" è definita per esprimere sottointervalli della sequenza di ottetti dei dati.
bytes-unit = "bytes"
Una richiesta di intervallo di byte può specificare un singolo intervallo di byte oppure un insieme di intervalli all'interno di una stessa rappresentazione.
byte-ranges-specifier = bytes-unit "=" byte-range-set
byte-range-set = 1#( byte-range-spec / suffix-byte-range-spec )
byte-range-spec = first-byte-pos "-" [ last-byte-pos ]
first-byte-pos = 1*DIGIT
last-byte-pos = 1*DIGIT
Il valore first-byte-pos in una byte-range-spec indica l'offset del primo byte di un intervallo. Il valore last-byte-pos indica l'offset dell'ultimo byte dell'intervallo; le posizioni di byte specificate sono quindi inclusive. Gli offset dei byte iniziano da zero.
Esempi di valori di byte-ranges-specifier:
-
I primi 500 byte (offset di byte 0-499 inclusi):
bytes=0-499 -
I secondi 500 byte (offset di byte 500-999 inclusi):
bytes=500-999
Una byte-range-spec non è valida se il valore last-byte-pos è presente ed è minore di first-byte-pos.
Un client può limitare il numero di byte richiesti senza conoscere la dimensione della rappresentazione selezionata. Se il valore last-byte-pos è assente, oppure è maggiore o uguale alla lunghezza corrente dei dati della rappresentazione, l'intervallo di byte viene interpretato come la parte restante della rappresentazione (il server sostituisce cioè il valore di last-byte-pos con un valore pari alla lunghezza corrente della rappresentazione selezionata meno uno).
Un client può richiedere gli ultimi N byte della rappresentazione selezionata usando una suffix-byte-range-spec.
suffix-byte-range-spec = "-" suffix-length
suffix-length = 1*DIGIT
Se la rappresentazione selezionata è più corta della suffix-length specificata, viene usata la rappresentazione intera.
Altri esempi, supponendo una rappresentazione di lunghezza 10000:
-
Gli ultimi 500 byte (offset di byte 9500-9999 inclusi):
bytes=-500oppurebytes=9500- -
Soltanto il primo e l'ultimo byte (byte 0 e 9999):
bytes=0-0,-1 -
Altre specifiche valide (ma non canoniche) dei secondi 500 byte (offset di byte 500-999 inclusi):
bytes=500-600,601-999
bytes=500-700,601-999
Un byte-range-set valido è soddisfacibile se include almeno una byte-range-spec con un first-byte-pos minore della lunghezza corrente della rappresentazione, oppure almeno una suffix-byte-range-spec con una suffix-length diversa da zero. In caso contrario, il byte-range-set non è soddisfacibile.
Nella sintassi degli intervalli di byte, first-byte-pos, last-byte-pos e suffix-length sono espressi come numero decimale di ottetti. Poiché non esiste un limite predefinito alla lunghezza di un payload, i destinatari devono prevedere numeri decimali potenzialmente molto grandi e impedire errori di analisi dovuti a overflow nella conversione in intero (MUST).
2.2 Altre unità di intervallo
Le unità di intervallo sono pensate per essere estensibili. Le nuove unità di intervallo dovrebbero essere registrate presso IANA, come definito nella Sezione 5.1.
other-range-unit = token
2.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 supporta le richieste di intervallo di byte per una data risorsa di destinazione può inviare Accept-Ranges: bytes per indicare quali unità di intervallo sono supportate (MAY). Un client può generare richieste di intervallo senza aver ricevuto questo campo di intestazione per la risorsa in questione (MAY). Le unità di intervallo sono definite nella Sezione 2.
Un server che non supporta alcun tipo di richiesta di intervallo per la risorsa di destinazione può inviare Accept-Ranges: none per consigliare al client di non tentare una richiesta di intervallo (MAY).