4. Formati di dati (Data Formats)
IMAP4rev2 utilizza comandi e risposte testuali. I dati in IMAP4rev2 possono essere in una delle diverse forme: atomo (Atom), numero (Number), stringa (String), lista tra parentesi (Parenthesized List) o NIL. Si noti che un particolare elemento di dati può assumere più di una forma; ad esempio, un elemento di dati definito come utilizzante la sintassi "astring" può essere un atomo o una stringa.
4.1 Atomo (Atom)
Un atomo (Atom) è costituito da uno o più caratteri non speciali.
4.1.1 Set di sequenze e set UID (Sequence Set and UID Set)
Un insieme di messaggi può essere referenziato da un set di sequenze (Sequence Set) contenente numeri di sequenza di messaggi o identificatori univoci. Vedere la Sezione 9 per i dettagli. Un set di sequenze può contenere intervalli di numeri di sequenza (come "5:50"), un'enumerazione di numeri di sequenza specifici o una combinazione di quanto sopra. Un set di sequenze può utilizzare il simbolo speciale "*" per rappresentare il numero di sequenza massimo nella casella di posta. Un set di sequenze non contiene mai identificatori univoci.
Un "set UID" (UID Set) è simile al set di sequenze, ma utilizza identificatori univoci invece di numeri di sequenza di messaggi e non è consentito contenere il simbolo speciale "*".
4.2 Numero (Number)
Un numero (Number) è costituito da uno o più caratteri numerici e rappresenta un valore numerico.
4.3 Stringa (String)
Una stringa (String) è in una delle tre forme: letterale sincronizzante (Synchronizing Literal), letterale non sincronizzante (Non-synchronizing Literal) o stringa tra virgolette (Quoted String). La forma di letterale sincronizzante è la forma generale di una stringa, senza limitazioni sui caratteri che la stringa può includere. La forma di letterale non sincronizzante è anche la forma generale, ma ha una restrizione di lunghezza. La forma di stringa tra virgolette è un'alternativa che evita l'overhead dell'elaborazione di un letterale, ma ha limitazioni sui caratteri che possono essere utilizzati.
Quando la distinzione tra letterali sincronizzanti e non sincronizzanti non è importante, questo documento utilizza solo il termine "letterale" (Literal).
Un letterale sincronizzante (Synchronizing Literal) è una sequenza di zero o più ottetti (inclusi CR e LF), prefissata-citata con un conteggio di ottetti sotto forma di parentesi graffa aperta ("), il numero di ottetti, una parentesi graffa chiusa (") e un CRLF. Nel caso di letterali sincronizzanti trasmessi dal server al client, il CRLF è immediatamente seguito dai dati in ottetti. Nel caso di letterali sincronizzanti trasmessi dal client al server, il client deve (deve) attendere di ricevere una richiesta di continuazione del comando (Command Continuation Request) prima di inviare i dati in ottetti (e il resto del comando).
Il letterale non sincronizzante (Non-synchronizing Literal) è una forma alternativa del letterale sincronizzante e può (può) essere utilizzato dal client al server ovunque sia consentito un letterale sincronizzante. La forma di letterale non sincronizzante non deve (non deve) essere inviata dal server al client. Il letterale non sincronizzante si distingue dal letterale sincronizzante per avere un segno più ("+") tra il conteggio di ottetti e la parentesi graffa chiusa ("}"). Il server non genera una richiesta di continuazione del comando in risposta a un letterale non sincronizzante e i client non sono tenuti ad attendere prima di inviare gli ottetti di un letterale non sincronizzante. A meno che non sia specificato diversamente in un'estensione IMAP, i letterali non sincronizzanti non devono (non devono) essere più grandi di 4096 ottetti. Qualsiasi letterale più grande di 4096 ottetti deve (deve) essere inviato come letterale sincronizzante.
Una stringa tra virgolette (Quoted String) è una sequenza di zero o più caratteri Unicode, esclusi CR e LF, codificati in UTF-8, con caratteri virgolette doppie (<">) a ciascuna estremità.
La stringa vuota è rappresentata come "" (una stringa tra virgolette con zero caratteri tra virgolette doppie), come {0} seguito da un CRLF (un letterale sincronizzante con un conteggio di ottetti di 0) o come {0+} seguito da un CRLF (un letterale non sincronizzante con un conteggio di ottetti di 0).
Nota: Anche se il conteggio di ottetti è 0, un client che trasmette un letterale sincronizzante deve (deve) attendere di ricevere una richiesta di continuazione del comando.
4.3.1 Stringhe a 8 bit e binarie (8-Bit and Binary Strings)
La posta testuale a 8 bit e binaria è supportata attraverso l'uso di una codifica di trasferimento di contenuto [MIME-IMB]. Le implementazioni IMAP4rev2 possono (possono) trasmettere caratteri a 8 bit o multi-ottetto nei letterali ma dovrebbero (dovrebbero) farlo solo quando il [CHARSET] è identificato.
IMAP4rev2 è compatibile con [I18N-HDRS]. Di conseguenza, il set di caratteri identificato per i valori dei campi di intestazione con contenuto a 8 bit è UTF-8 [UTF-8]. Le implementazioni IMAP4rev2 devono (devono) accettare e possono (possono) trasmettere testo [UTF-8] in stringhe tra virgolette purché la stringa non contenga NUL, CR o LF. Questo è diverso dalle implementazioni IMAP4rev1.
Sebbene sia definita una codifica di trasferimento di contenuto BINARY, le stringhe binarie non codificate non sono consentite, a meno che non vengano restituite in un <literal8> in risposta a un elemento di dati FETCH BINARY.PEEK[<section-binary>]<partial> o BINARY[<section-binary>]<partial>. Una "stringa binaria" (Binary String) è qualsiasi stringa con caratteri NUL. Una stringa con una quantità eccessiva di caratteri CTL può (può) anche essere considerata binaria. A meno che non venga restituita in risposta a BINARY.PEEK[...]/BINARY[...] FETCH, le implementazioni client e server devono (devono) codificare i dati binari in una forma testuale, come base64, prima di trasmettere i dati.
4.4 Lista tra parentesi (Parenthesized List)
Le strutture di dati sono rappresentate come una "lista tra parentesi" (Parenthesized List); una sequenza di elementi di dati, delimitati da spazi e delimitati a ciascuna estremità da parentesi. Una lista tra parentesi può contenere altre liste tra parentesi, utilizzando più livelli di parentesi per indicare l'annidamento.
La lista vuota è rappresentata come () -- una lista tra parentesi senza membri.
4.5 NIL
La forma speciale "NIL" rappresenta la non esistenza di un particolare elemento di dati che è rappresentato come una stringa o una lista tra parentesi, in contrapposizione alla stringa vuota "" o alla lista tra parentesi vuota ().
Nota: NIL non viene mai utilizzato per alcun elemento di dati che assume la forma di un atomo. Ad esempio, un nome di casella di posta di "NIL" è una casella di posta denominata NIL in contrapposizione a un nome di casella di posta inesistente. Questo perché la casella di posta utilizza la sintassi "astring", che è un atomo o una stringa. Al contrario, un addr-name di NIL è un nome personale inesistente, perché addr-name utilizza la sintassi "nstring", che è NIL o una stringa, ma mai un atomo.
Esempi
La seguente risposta LIST:
* LIST () "/" NIL
è equivalente a:
* LIST () "/" "NIL"
perché la risposta LIST ABNF utilizza "astring" per il nome della casella di posta.
Tuttavia, la seguente risposta:
* FETCH 1 (BODY[1] NIL)
non è equivalente a:
* FETCH 1 (BODY[1] "NIL")
La prima indica l'assenza della parte del corpo, mentre la seconda significa che contiene una stringa con i tre caratteri "NIL".