Le web de Dominique Guebey – Bazar informatique

Page : http://www.dg77.net/tekno/xhtml/mime.htm


  D o m i n i q u e   G u e b e y    J u n g l e    Bazar informatique

Pages Web en XHTML (suite)

Types MIME

Sommaire

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 :

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 :

  1. application
  2. audio
  3. example
  4. image
  5. message
  6. model
  7. multipart
  8. text
  9. video

Pour les pages Web, quelques types+sous-type courants sont :

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".

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.

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 :

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 :

  1. Si le type MIME fourni par le serveur est totalement inconnu, on le prend tel-quel.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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