Types MIME
Sommaire
- Données du problème |
- Du binaire dans le texte |
- Syntaxe MIME |
- Exemples |
- MIME et le protocole HTTP |
- Type MIME des pages WEB en XHTML |
- Navigateur et type MIME |
- Configuration serveur et type MIME |
Données du problème
Ce n’est pas tout de savoir décortiquer les octets pour lire les caractères. Encore faut-il savoir comment utiliser le fichier qu’on a entre les mains.
Voici un fragement du début de la présente page dans sa forme XHTML. Il s’agit de ce qu’on appelle le source. Un partie des données est à l’intention du navigateur, c’est ce qui lui permet de savoir comment traîter (présenter à l’utilisateur) le reste.
<h3>Types MIME</h3> <p><i>Sommaire</i></p> <ul class="listline"> <li><a href="#intro">Données du problème</a> |</li> <li><a href="#mime">Du binaire dans le texte</a> |</li> <li><a href="#syntax">Syntaxe MIME</a> |</li> <li><a href="#ex">Exemples</a> |</li> <li><a href="#http">MIME et le protocole HTTP</a> |</li> <li><a href="#xhtml">Type MIME des pages WEB en XHTML</a> |</li> <li><a href="#navig">Navigateur et type MIME</a> |</li> <li><a href="#serveur">Configuration serveur et type MIME</a> |</li> </ul> <h4 id="intro">Données du problème</h4>
Ci-dessous la même dans un fichier simple texte. On peut l’envoyer directement à l’écran ou sur l’imprimante avec une commande ad-hoc (type, more, less, cat…) ; à moins qu’on ne l’ouvre dans un éditeur de texte :
Types MIME Sommaire Données du problème Du binaire dans le texte Syntaxe MIME MIME et le protocole HTTP Type MIME des pages WEB en XHTML Navigateur et type MIME Configuration serveur et type MIME Données du problème
Une autre sortie, en RTF (Rich Text Format). Ce format en mode texte très répandu, exige un traîtement de texte ou au minimum un programme dédié :
\pard\s3\sb100\sa100\b\fs27 Types MIME\par \pard\sb100\sa100\b0\i\fs24 Sommaire\i0\par \pard\fi-360\li720\sb100\sa100\tx720\f2\fs20\'b7\tab\f1\fs24 Donn\'e9es du probl\'e8me\par \pard\fi-360\li720\sb100\sa100\f2\fs20\'b7\tab\f1\fs24 Du binaire dans le texte\par \f2\fs20\'b7\tab\f1\fs24 Syntaxe MIME\par \f2\fs20\'b7\tab\f1\fs24 Exemples\par \f2\fs20\'b7\tab\f1\fs24 MIME et le protocole HTTP\par \f2\fs20\'b7\tab\f1\fs24 Type MIME des pages WEB en XHTML\par \f2\fs20\'b7\tab\f1\fs24 Navigateur et type MIME\par \f2\fs20\'b7\tab\f1\fs24 Configuration serveur et type MIME\par \pard\s4\sb100\sa100\b Donn\'e9es du probl\'e8me\par
Il est souvent souhaitable voire nécessaire que le système sache automatiquement avec quel logiciel traîter le fichier. Pour cela, il existe différentes méthodes :
- Utilisation de l’extension ajoutée au nom du fichier. Par exemple monfic.txt est censé être du texte simple, monfic.png une image png, etc. C’est le système le plus simple, et probablement le pire.
- A l’inverse, les ordinateurs sous Mac OS X procèdent selon un processus basé sur les UTI (Uniform Type Identifiers). Il s’agit d’un système très évolué, "logique, hiérarchique et extensible".
- Dans certains systèmes, la question ne se pose pas, un fichier se définit par un certains nombre d’attributs parmi lesquels le type, et il n’est pas possible de le changer. Ainsi n’est-il pas possible, sur un IBM iSeries, d’introduire un programme (objet de type *PGM) camouflé en fichier de données (type *FILE).
- Utilisation de programmes d’analyse du fichier, telle la commande file sous Unix/Linux.
- Utilisation d’un "nombre magique" ou signature.
- MIME est une réponse à cette problématique, par l’insertion d’un identificateur à un point stratégique du flot de données.
Du binaire dans le texte
On a vu (cf Quoted Printable) que le protocole SMTP d’envoi de courrier électronique ou eMail ne connaît que les caractères ASCII. Ceci était défini par la rfc822 [http://www.faqs.org/rfcs/rfc822.html] . Mais derechef on a voulu aussi expédier des « pièces-jointes ». Et contrairement au courrier postal traditionnel, ces dernières ne consistent pas simplement en texte pur et dur mais aussi en documents bureautiques, sorties PDF et autres qui contiennent des données binaires. On a donc imaginé des messages composites dont les différentes parties correspondent à des types de fichiers différents. D’où MIME (Multipurpose Internet Mail Extensions), standard défini par les RFC 2045 [http://www.ietf.org/rfc/rfc2045.txt] et suivantes et dont l’utilité est de normaliser la méthode d’identification de ces données.
Syntaxe MIME
Un type MIME est constitué de la manière suivante : Content-type: type_mime_principal/sous_type_mime Exemple pour une image JPG : Content-type: image/jpeg. Les types Mime principaux sont :
- application
- audio
- example
- image
- message
- model
- multipart
- text
- video
Pour les pages Web, quelques types+sous-type courants sont :
- text/html
- text/css
- text/plain
Une procédure prévue par l’IANA permet au créateur d’un type de fichier nouveau de l’enregistrer dans la liste des content-type officiellement reconnus. Voir en ANNEXE une liste plus complète avec les sous-types.
Le message avec plusieurs contenus est dit multipart. La spécification MIME définit plusieurs sous-types "multipart".
- Mixed
- Digest
- Alternative
- Related
- Report
- Signed
- Encrypted
- Form-data
L’entête doit contenir une chaîne paramètre boundary qui sert à délimiter les différentes parties. Voici un exemple avec deux parties. Le terme identificateur_boundary indique un code unique, qui ne doit absolument pas figurer dans le corps du message.
Content-Type: multipart/mixed; boundary="__identificateur_boundary__" MIME-version: 1.0 --__identificateur_boundary__ Voici la premiere partie, en simple texte ("plain text"). --__identificateur_boundary__ Content-Type: text/plain; charset=us-ascii Voici la seconde partie, en texte aussi mais avec un entete MIME. --__identificateur_boundary__
Exemples
Voici le source d’un e-Mail de forme courante. On y distingue l’entête et le corps. L’entête contient entre autres la déclaration MIME avec l’identificateur "boundary". On voit au dessus les rubriques intangibles et connues de tous les utilisateurs d’eMail From (expéditeur), To (destinataire), Subject (Objet).
Le corps est lui-même séparé en deux parties. Ce fichier illustre la méthode classique (et recommandée) pour mettre du HTML dans un e-Mail : une partie alternative en simple texte sera utilisée par les programmes clients qui ne traîtent pas le HTML (soit parce qu’ils ne le peuvent pas, soit parce que l’utilisateur ne l’a pas autorisé, en général pour des raisons de sécurité).
>From - Thu Jul 14 10:09:47 2006 X-Mozilla-Status: 0001 X-Mozilla-Status2: 00000000 Return-Path: <teufteur@fnts-bg.org> Received: from murder ([unix socket]) by spiridonov.fmi.uni-sofia.bg (Cyrus v2.2.12-Invoca-RPM-2.2.12-3.RHEL4.1) with LMTPA; Tue, 5 Jul 2006 22:19:24 +0300 X-Sieve: CMU Sieve 2.2 Received: from smtp.fmi.uni-sofia.bg (smtp.fmi.uni-sofia.bg [62.44.101.3]) by spiridonov.fmi.uni-sofia.bg (Postfix) with ESMTP id BD62F1BD65 for <vardaman@fmi.uni-sofia.bg>; Tue, 11 Jul 2006 12:10:16 +0300 (EEST) X-Spam-Status: No, hits=0.0 required=5.0 X-Spam-Level: Received: from fnts-bg.org ([195.96.244.138]) by smtp.fmi.uni-sofia.bg for vardaman@fmi.uni-sofia.bg; Tue, 11 Jul 2006 11:45:42 +0300 Received: from trax ([192.168.1.118]) by fnts-bg.org (8.12.10/8.12.8) with SMTP id k6B8qnJk006041 for <vardaman@fmi.uni-sofia.bg>; Tue, 11 Jul 2006 11:52:49 +0300 Message-ID: <006901c6a4c7$6b7896b0$7601a8c0@trax> From: "TRAX" <teufteur@fnts-bg.org> To: "Akhmet Verbontov" <vardaman@fmi.uni-sofia.bg> Subject: trax-statia Date: Tue, 05 Jul 2006 22:42:38 +0300 MIME-Version: 1.0 Content-Type: multipart/alternative; ">boundary="----=_NextPart_000_0064_01C6A4E0.8CBB1BE0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.2869 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869 X-Antivirus: avast! (VPS 0628-1, 10.07.2006), Outbound message X-Antivirus-Status: Clean This is a multi-part message in MIME format. ------=_NextPart_000_0064_01C6A4E0.8CBB1BE0 Content-Type: text/plain; charset="koi8-r" Content-Transfer-Encoding: quoted-printable Zdraveite! Triabva da namalite obema na statiata do 8 str. i da ni = pratite novia variant za recenzirane. Pozdravi M.Tatianova ------=_NextPart_000_0064_01C6A4E0.8CBB1BE0 Content-Type: text/html; charset="koi8-r" Content-Transfer-Encoding: quoted-printable <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD> <META http-equiv=3DContent-Type content=3D"text/html; charset=3Dkoi8-r"> <META content=3D"MSHTML 6.00.2900.2912" name=3DGENERATOR> <STYLE></STYLE> </HEAD> <BODY bgColor=3D#ffffff> <DIV><FONT face=3DArial size=3D2>Zdraveite! Triabva da namalite obema na = statiata do=20 8 str. i da ni pratite novia variant za recenzirane.</FONT></DIV> <DIV><FONT face=3DArial size=3D2>Pozdravi</FONT></DIV> <DIV><FONT face=3DArial size=3D2>M.Tatianova</FONT></DIV></BODY></HTML>
Le codage koi8-r couvre le russe et le bulgare en alphabet cyrillique. Cf la page Codage des caractères. Le message formaté en HTML prend l’allure suivante :
Zdraveite! Triabva da namalite obema na
statiata do
8 str. i da ni pratite novia variant za recenzirane.
Pozdravi
M.Tatianova
|
Ou encore :
Здравейте! Трябва да намалите обема на =
статията до
8 стр. и да ни пратите новия вариант за рецензиране.
Поздрави
M.Tatianova
|
MIME et le protocole HTTP
Le type MIME est également utilisé pour typer les documents transférés par le protocole HTTP, ce qui concerne donc à-peu-près tout ce qui transite sur le réseau Internet.
- Un protocole de communication est la spécification des règles que doivent respecter les logiciels clients et serveurs pour négocier, communiquer, et échanger les données.
- Le serveur est, sur un réseau informatique, le fournisseur des données (pas forcément le dépositaire, la base utilisé peut se trouver sur une autre machine). Les utilisateurs ou « clients » s’adressent à lui pour les obtenir sous forme d’information finales ou services (accès à d’autres sources d’informations) ; mais aussi pour modifier ou enrichir les données stockées côté serveur.
- Le client est en fait un logiciel qui adresse la requête au serveur. Il est souvent appelé user-agent ou UA.
Lors d’une transaction entre un serveur web et un navigateur internet, le serveur web envoie en premier lieu le type MIME du fichier envoyé au navigateur, afin que ce dernier puisse savoir de quelle manière afficher le document.
Tout navigateur Web aussi bien que tout serveur Web a la liste des types Mime qui lui sont connus. Lors de la communication, serveur et client doivent se mettre d’accord si le destinataire accepte le type Mime que l’expéditeur veut envoyer.
EXEMPLE : j’ai réclamé une page en entrant "http://www.mondomaine.fr". Ce faisant le navigateur envoie au serveur une commande "GET" qui ressemble à ceci :
GET /index.html HTTP/1.0
Host: mondomaine.fr
Referer: http://www.mondomaine.fr
User-Agent: Lynx/2.8.5dev.17 libwww-FM/2.14FM SSL-MM/1.4.1 OpenSSL/0.9.7d-dev
En retour, mon navigateur va recevoir du serveur quelque-chose comme :
HTTP/1.0 200 OK
Date: Fri, 14 Jul 2009 11:59:00 CET
Server: Apache/1.3.1
Content-Type: text/html
Content-Length: 59
Expires: Sat, 15 Jul 2009 00:00:01 GMT
Last-modified: Fri, 23 May 1952 14:30:33 GMT
<html>
<head>
<title>Ma belle HomePage</title>
<link rel="stylesheet" type="text/css" href="/design/style.css" />
</head>
<body>
<h3>Ma belle HomePage</h3>
<p>Ceci est un exemple</p>
</body>
</html>
Et je verrais alors s’afficher :
Ma belle HomePage
Ceci est un exemple
Type MIME des pages WEB en XHTML
Une page en XHTML n’est pas un fichier "simple texte" ; elle doit être présentée comme une application xml. Selon la Note on XHTML Media Types [http://www.w3.org/TR/xhtml-media-types/xhtml-media-types.html] du W3c :
- HTML 4 devrait être servi comme text/html.
- XHTML "HTML compatible" (tel que défini dans appendix C of the XHTML 1.0 specification [http://www.w3.org/TR/xhtml1/#guidelines] ) peut être servi comme text/html, mais devrait l’être comme application/xhtml+xml.
- XHTML 1.1 ne devrait pas être servi comme text/html.
- Quoique non encore finalisé, on peut affirmer que XHTML 2.0 ne doit pas être servi comme text/html.
Navigateur et type MIME
Les navigateurs modernes acceptent en règle générale tous les types Mime. Au cas où ils ne connaissent pas le type Mime, ils proposent simplement à l’utilisateur de sauvegarder les données à recevoir comme fichier téléchargé.
A titre indicatif, voici comment procède Internet Explorer de Microsoft détecte le type du document chargé depuis le serveur :
- Si le type MIME fourni par le serveur est totalement inconnu, on le prend tel-quel.
- Si le type MIME est connu ou du ressemble à un type connu (type MIME "ambigü"), les données sont analysées (scannées) pour essayer d’en interpréter le contenu. S’il correspond à un type connu, c’est celui-là qui sera utilisé, sans tenir compte des données d’entête envoyé par le serveur.
- Si le scan ne donne pas de résultat, le programme vérifie qu’il n’y a pas conflit avec la nature binaire ou texte du type présenté par le serveur.
- Dans le cas précédent, si le test du type de donnée ne satisfait pas, le programme examine l’extension du fichier, et vérifie s’il existe un type MIME correspondant.
- Si à ce stade on n’a pas encore trouvé le type MIME, une vérification est faite dans la base de registre pour voir si une application existante est associée à l’extension.
- A défaut, le type "text/plain" est choisi si le fichier apparaît être en données texte ; ou "application/octet-stream" s’il semble plutôt être en binaire.
Configuration serveur et type MIME
Les serveurs Web sont plus exigeants que les clients. Ils ne traitent pas les types Mime qu’ils ne connaissent pas. Quand, sur l’ordinateur serveur, un format de fichier nouveau est mis à disposition, il est important d’en noter le type Mime dans la configuration du serveur.
Exemple pour un serveur APACHE.
- Directive à ajouter dans le httpd.conf
- AddType dans le module mod-mime
- Syntaxe
- AddType mime-type extension extension…
- Exemple 1
- AddType image/jpeg JPG JPEG
- Autre possibilité, déconseillée
- Renseigner le fichier conf/mime.types
- Exemple 2 : on ajoute "wml" aux fichiers traités comme du html standard
- text/html html htm wml
- Alternative
- Si interdiction d’accéder au httpd.conf, utiliser son .htaccess
- Exemple 3
AddType text/vnd.wap.wml wml AddType application/java-archive jar