Raison de plus pour ne plus l'accepter !

Tout à commencer par le classique:

Client: Ça marche pas quand je rentre dans ma fiche produit.
Développeur: Ça marche chez moi ©.

Voilà le contexte: L'application, en ruby on rails, permet de faire une recherche de produit. Parmi la liste des produits trouvés on peut entrer dans sa fiche et depuis celle-ci faire un export au format excel.

Là en rails on se dit que c'est assez cool à faire. On commence par enregistrer le type Mime des fichers excel dans l'initializer qui va bien (mime_types.rb):

Mime::Type.register "application/vnd.ms-excel", :xls

Ensuite dans l'action il suffit de distinguer les différents formats de rendu:

respond_to do |format|
  format.html
  format.xls {
    # some stuff
  }
end

et dans la vue utiliser la route formatée en passant l'extension enregistrée précédemment (xls).

Sur les navigateurs modernes ça fonctionne bien, sauf que pour mon client sous IE, quand il cliquait sur le lien permettant d'accéder à la fiche produit il avait directement le fichier excel.

Là je commence à me dire qu'il y a un souci dans les headers accept d'IE. Sauf que quand j'essaie de reproduire le le bug sur mon windows virtuel pas moyen. Que ce soit IE7 ou 8 ça fonctionne normalement.

Voilà à quoi ressemble les en-têtes http accept d'un IE standard (je les ai récupérés sur le net d'une personne sous windows 7):
image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/msword, */*

Là ça fonctionne, mon lien « classique » ne correspond à aucune des type mime précédent, du coup je passe dans le * et pour IE comme il ne sait pas trop quoi en faire il le traite comme du HTML. Que je sache pour les autres navigateurs c'est l'inverse. On regarde d'abord si ce n'est pas du html, du xhtml+xml ou du xml et après on avise.

Mais pour Internet Explorer le web c'est d'abord des documents binaires, pas du texte.

Pour en revenir au problème là ou ça devient vicieux c'est que les en-têtes http accept sont différents si Office est installé sur la machine (ce qui est le cas pour client et pas moi). Là ça devient:
image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/x-shockwave-flash, application/x-silverlight-2-b2, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

C'est la que le format excel prend le pas. Donc dans la négociation avec le serveur, IE demande en priorité du format excel plutôt qu'html.

Ca a été remonté sur le tracker de ruby on rails, même si ça n'a rien à voir avec le framework. Toutefois une solution est proposé pour contourner ce comportement d'IE, c'est de forcer le passage du paramètre format à HTML s'il n'est pas défini. Il faut savoir que ce n'est pas fiable à 100% puisque ça se base sur le user agent qui peut être modifié. Mais forcer le format à html pour les navigateurs qui fonctionne déjà correctement ne devrait pas avoir de conséquences fâcheuses.

Avant de tomber sur cette solution j'ai essayé d'utiliser une route formatée dans laquelle je spécifié html comme format mais ça n'a pas fonctionné. Je me retrouvais bien avec un lien se terminant par .html mais le format n'était toujours pas récupéré dans les paramètres de l'action, je ne sais pas vraiment pourquoi.

Bref, encore un post sur le net pour dire une chose: « Meurs IE, meurs ! »