Aller au contenu principal

4. Formats de données (Data Formats)

IMAP4rev2 utilise des commandes et des réponses textuelles. Les données dans IMAP4rev2 peuvent prendre l'une des plusieurs formes : atome (Atom), nombre (Number), chaîne (String), liste entre parenthèses (Parenthesized List), ou NIL. Notez qu'un élément de données particulier peut prendre plus d'une forme ; par exemple, un élément de données défini comme utilisant la syntaxe "astring" peut être soit un atome, soit une chaîne.

4.1 Atome (Atom)

Un atome (Atom) est constitué d'un ou plusieurs caractères non spéciaux.

4.1.1 Ensemble de séquences et ensemble UID (Sequence Set and UID Set)

Un ensemble de messages peut être référencé par un ensemble de séquences (Sequence Set) contenant soit des numéros de séquence de messages, soit des identifiants uniques. Voir la section 9 pour plus de détails. Un ensemble de séquences peut contenir des plages de numéros de séquence (telles que "5:50"), une énumération de numéros de séquence spécifiques, ou une combinaison des deux. Un ensemble de séquences peut utiliser le symbole spécial "*" pour représenter le numéro de séquence maximum dans la boîte aux lettres. Un ensemble de séquences ne contient jamais d'identifiants uniques.

Un "ensemble UID" (UID Set) est similaire à l'ensemble de séquences, mais utilise des identifiants uniques au lieu de numéros de séquence de messages, et n'est pas autorisé à contenir le symbole spécial "*".

4.2 Nombre (Number)

Un nombre (Number) est constitué d'un ou plusieurs caractères numériques et représente une valeur numérique.

4.3 Chaîne (String)

Une chaîne (String) se présente sous l'une des trois formes : littéral synchronisant (Synchronizing Literal), littéral non synchronisant (Non-synchronizing Literal), ou chaîne entre guillemets (Quoted String). La forme de littéral synchronisant est la forme générale d'une chaîne, sans limitation sur les caractères que la chaîne peut inclure. La forme de littéral non synchronisant est également la forme générale, mais elle a une restriction de longueur. La forme de chaîne entre guillemets est une alternative qui évite les frais généraux du traitement d'un littéral, mais a des limitations sur les caractères qui peuvent être utilisés.

Lorsque la distinction entre littéraux synchronisants et non synchronisants n'est pas importante, ce document utilise uniquement le terme "littéral" (Literal).

Un littéral synchronisant (Synchronizing Literal) est une séquence de zéro ou plusieurs octets (y compris CR et LF), préfixée-citée avec un comptage d'octets sous la forme d'une accolade ouvrante ("), le nombre d'octets, une accolade fermante ("), et un CRLF. Dans le cas de littéraux synchronisants transmis du serveur au client, le CRLF est immédiatement suivi des données en octets. Dans le cas de littéraux synchronisants transmis du client au serveur, le client doit (doit) attendre de recevoir une demande de continuation de commande (Command Continuation Request) avant d'envoyer les données en octets (et le reste de la commande).

Le littéral non synchronisant (Non-synchronizing Literal) est une forme alternative du littéral synchronisant et peut (peut) être utilisé du client au serveur partout où un littéral synchronisant est autorisé. La forme de littéral non synchronisant ne doit pas (ne doit pas) être envoyée du serveur au client. Le littéral non synchronisant se distingue du littéral synchronisant par la présence d'un plus ("+") entre le comptage d'octets et l'accolade fermante ("}"). Le serveur ne génère pas de demande de continuation de commande en réponse à un littéral non synchronisant, et les clients ne sont pas tenus d'attendre avant d'envoyer les octets d'un littéral non synchronisant. Sauf indication contraire dans une extension IMAP, les littéraux non synchronisants ne doivent pas (ne doivent pas) dépasser 4096 octets. Tout littéral supérieur à 4096 octets doit (doit) être envoyé en tant que littéral synchronisant.

Une chaîne entre guillemets (Quoted String) est une séquence de zéro ou plusieurs caractères Unicode, à l'exclusion de CR et LF, codés en UTF-8, avec des caractères guillemets doubles (`<">`) à chaque extrémité.

La chaîne vide est représentée comme "" (une chaîne entre guillemets avec zéro caractère entre guillemets doubles), comme `{0}` suivi d'un CRLF (un littéral synchronisant avec un comptage d'octets de 0), ou comme {0+} suivi d'un CRLF (un littéral non synchronisant avec un comptage d'octets de 0).

Note : Même si le comptage d'octets est 0, un client transmettant un littéral synchronisant doit (doit) attendre de recevoir une demande de continuation de commande.

4.3.1 Chaînes 8 bits et binaires (8-Bit and Binary Strings)

Le courrier textuel 8 bits et binaire est pris en charge par l'utilisation d'un encodage de transfert de contenu [MIME-IMB]. Les implémentations IMAP4rev2 peuvent (peuvent) transmettre des caractères 8 bits ou multi-octets dans les littéraux mais devraient (devraient) le faire uniquement lorsque le [CHARSET] est identifié.

IMAP4rev2 est compatible avec [I18N-HDRS]. En conséquence, le jeu de caractères identifié pour les valeurs de champ d'en-tête avec du contenu 8 bits est UTF-8 [UTF-8]. Les implémentations IMAP4rev2 doivent (doivent) accepter et peuvent (peuvent) transmettre du texte [UTF-8] dans des chaînes entre guillemets tant que la chaîne ne contient pas de NUL, CR ou LF. Cela diffère des implémentations IMAP4rev1.

Bien qu'un encodage de transfert de contenu BINARY soit défini, les chaînes binaires non encodées ne sont pas autorisées, sauf si elles sont renvoyées dans un <literal8> en réponse à un élément de données FETCH BINARY.PEEK[<section-binary>]<<partial>> ou BINARY[<section-binary>]<<partial>>. Une "chaîne binaire" (Binary String) est toute chaîne avec des caractères NUL. Une chaîne avec une quantité excessive de caractères CTL peut (peut) également être considérée comme binaire. Sauf si elle est renvoyée en réponse à BINARY.PEEK[...]/BINARY[...] FETCH, les implémentations client et serveur doivent (doivent) encoder les données binaires sous une forme textuelle, telle que base64, avant de transmettre les données.

4.4 Liste entre parenthèses (Parenthesized List)

Les structures de données sont représentées comme une "liste entre parenthèses" (Parenthesized List) ; une séquence d'éléments de données, délimités par des espaces, et délimités à chaque extrémité par des parenthèses. Une liste entre parenthèses peut contenir d'autres listes entre parenthèses, en utilisant plusieurs niveaux de parenthèses pour indiquer l'imbrication.

La liste vide est représentée comme () -- une liste entre parenthèses sans membres.

4.5 NIL

La forme spéciale "NIL" représente la non-existence d'un élément de données particulier qui est représenté comme une chaîne ou une liste entre parenthèses, par opposition à la chaîne vide "" ou à la liste entre parenthèses vide ().

Note : NIL n'est jamais utilisé pour tout élément de données qui prend la forme d'un atome. Par exemple, un nom de boîte aux lettres de "NIL" est une boîte aux lettres nommée NIL par opposition à un nom de boîte aux lettres inexistant. C'est parce que la boîte aux lettres utilise la syntaxe "astring", qui est un atome ou une chaîne. Inversement, un addr-name de NIL est un nom personnel inexistant, car addr-name utilise la syntaxe "nstring", qui est NIL ou une chaîne, mais jamais un atome.

Exemples

La réponse LIST suivante :

* LIST () "/" NIL

est équivalente à :

* LIST () "/" "NIL"

car la réponse LIST ABNF utilise "astring" pour le nom de boîte aux lettres.

Cependant, la réponse suivante :

* FETCH 1 (BODY[1] NIL)

n'est pas équivalente à :

* FETCH 1 (BODY[1] "NIL")

La première indique l'absence de la partie du corps, tandis que la seconde signifie qu'elle contient une chaîne avec les trois caractères "NIL".