19 ottobre 2010

InAcceptabile comportamento di IE[5-8]

Un utente si lamentava che una delle nuove funzionalità di OPTA, viste in funzione sul mio PC, non funzionavano correttamente. Alla richiesta di visionare l'elenco dell'organico, invece di aprire la pagina con l'elenco, veniva sempre ed inesorabilmente scaricato l'elenco in formato CSV (opzione presente con un link nella pagina, assieme a quello analogo per ottenerlo come PDF).
click to enlarge
Inizio l'indagine constatando che la segnalazione proveniva da un'utente che usa IE8 (su Windows, of course), mentre con Firefox 3.6 (su Linux, obviously) tutto andava liscio come l'olio. Provo immediatamente con Firefox e con Chrome anche su Windows, ma lo strano comportamento non si presenta e l'elenco si visualizza correttamente.
Collego subito il problema con la gestione della respond_to del controller Rails relativo alla pagina: il codice, però, è scritto correttamente e poi: perché scarica proprio il CSV e non PDF?
Cerco un po' di documentazione in giro, mentre nel controller disabilito la gestione del formato CSV e faccio una nuova prova. Magicamente IE8 si comporta di nuovo normalmente. Mi risulta naturale cercare un tool (su Windows) per visionare le request inviata da IE8 al server. Trovo l'ottimo Fiddler (che potete vedere, figura precedente, nella parte alta della schermata).
Usandolo, noto come IE8 invii, nell'intestazione Accept, una marea di formati, fra cui application/vnd.ms-excel. Sembro essere sulla buona strada: ripristino la gestione del file CSV nel controller Rails e con l'aiuto di Fiddler forgio una request in cui elimino la voce application/vnd.ms-excel. Ora anche in IE8 ottengo l'elenco in formato HTML, come ci si sarebbe aspettato che fosse fin dall'inizio.
Nel frattempo le ricerche su internet mi avevano portato a questo articolo, Unacceptable Browser HTTP Accept Headers (Yes, You Safari and Internet Explorer) che mi apre la mente: la mia applicazione in Rails serve ad IE8 sempre prima il fomato CSV, semplicemente perché IE8 non invia il MIME-type text/html nell'Accept (provare per credere)!
Ulteriore conferma la ebbi leggendo il post Ruby on Rails and IE 8 - respond_to and HTTP accept headers.
Per la soluzione ho quindi inserito il seguente codice nelle viste Rails, al momento di creare il link:
par.merge!({:format => :html}) if request.env['HTTP_USER_AGENT'] =~ /MSIE/
dove par è l'hash utilizzato per la creazione dell'URI. In questo modo, per IE8 si forza esplicitamente il formato (HTML) richiesto, postponendo .html all'URI standard generato con Rails.
Powered by ScribeFire.

Nessun commento:

Posta un commento