Odio Internet Explorer (URLs de longitud larga).

 

Siempre he odiado a Microsoft, quiza hoy más que nunca debido a que perdió mi equipo favorito de futbol: Las chivas.

 

Pero bueno, vamos por partes ¿hoy por qué odio a microsoft y concretamente a Internet Explorer?

 

Para que puendan entender mi frustración, explicaré poco a poco las cosas.

 

Introducción: algo de HTML

 

Un TAG escencial y bastante común en HTML es el IMG, el cual sirve para incrustar una imagen en una página web. Dicho TAG tiene al menos un atributo sumamente importante, el atributo SRC, el cual apunta a la imagen (posiblemente remota) que será descargada por el navegador y luego rendereada (dibujada en pantalla).

 

Caso trivial:

 

<IMG SRC="http://upload.wikimedia.org/wikipedia/commons/6/68/Gianna-michaels.jpg&quot; ALT="Gianna Michaels"/>

 

Algunos atributos adicionales (entre muchos otros) son WIDTH y HEIGHT, siendo útiles si deseamos que el browser calcule su espacio en altura y anchura y acomode sus dimensiones en la página ántes de que la imagen sea completamente descargada (interesante si la imagen es de varios KBs).

 

Hasta aquí nada fuera de lo normal.

 

Imágenes generadas dinámicamente en el servidor.

 

En el ejemplo anterior descargamos una imagen, de forma remota, y dicha imagen es un archivo, estático, pero el TAG IMG nos permite indicar a algúna pagina PHP o a un sevlet o “algo” que se le parezca, para que realice procesos en el servidor y genere alguna imagen de forma dinámica, es decir, que no apunte a algun archivo en el servidor.

 

Para los iniciados en PHP una liga que toca el tema es la siguiente:

http://devzone.zend.com/node/view/id/1269

 

Para los fanaticos del Java, aquí van dos interesantes ligas que explican el concepto:

http://java.sun.com/developer/JDCTechTips/2001/tt0821_update.html

http://www.javaworld.com/javaworld/jw-05-2000/jw-0505-servlets.html

 

Si alguien se pregunta “¿para qué es útil generar imágenes en el servidor?” la respuesta es bastante obvia: una de tantas aplicaciones son gráficas (charts) que muestren indicadores de algún porcentaje formado por datos actuales de consultas en un DBMS.

 

Comienzan los problemas

Es sumamente común pasarle argumentos a la página PHP o al java servlet que generará la gráfica. Dichos parametros pueden indicar tamaño, datos, tipo, todo lo que el programador desee.

 

Los parametros van indicados dentro de la URL, es decir, utilizando el método GET.

 

Si desean mayor información de GET vs POST aquí van las ligas que lo explican:

http://www.cs.tut.fi/~jkorpela/forms/methods.html

http://www.w3.org/TR/html4/interact/forms.html#submit-format

 

Sencillamente para obtener una imagen dinámica utilizando la etiqueta IMG se hace con GET y punto, no hay mayor discusion.

 

Por ejemplo, supongamos que tenemos un servlet que generará una imagen, dicho servlet recibirá parametros param1 param2 con sus respectivos valores, dichos parámetros supongamos que son necesarios para la generacion de la imagen:

 

<IMG src="/mywebapp/myimageservlet?param1=value1&param2=value2"/>

 

La vida es maravillosa en éste punto, se abre una infinidad de posibilidades para el desarrollador de aplicaciones web: contenido dinamico incluso en las imágenes (y no me estoy refiriendo a animaciones).

 

Microsoft y en esta ocasión los desarrolladores de IE explorer y piensan que debe haber límites.

 

Uno como programador a veces abusa de las posibilidades, y a veces nos gusta abusar de ellas. Por diseño de la aplicación, queremos pasarle todos los datos al generador de gráficas que con tanto ainco (esfuezo, ignorante) se programó para que no accese directamente a la DB, sino que en su lugar, solo procese parametros y genere la gráfica deseada.

 

Pero sucede que IE trunca las URLs!!!…

http://support.microsoft.com/kb/208427

 

A pesar de que oficialmente en la especificación del Hypertext Transfer Protocol — HTTP/1.1 jamas menciona límites para las URLs, Microsoft decidio que 2083 caracteres son suficientes, mientras que todos los demas navegadores no tienen problema alguno sobre ellas.

 

Una discusión interesante al respecto esta en el siguiente blog:

http://www.boutell.com/newfaq/misc/urllength.html

 

En dicho blog menciona la posibilidad de comprimir la URL, algo que ya se me habia ocurrido a mi pero que me resistia a codificar (más adelante explicaré el motivo).

 

Rápido, un ejemplo!

 

Yo bien nice programando mi servlet, sucede que exageré un poco al generar la siguiente URL:

 

<IMG SRC=’http://WWW.XXX.YYY.ZZ/thecaMonitoringWeb/ GraficaPie?typeGraph=cmPorcentajeModelos&width=800&height=500&totalModelos=40&modelo0=DCM245&totalModelo0=255&modelo1=SB5120&totalModelo1=10&modelo2=DOCSIS+1.1+Touchstone+Cable+Modem+Model+CM450A&totalModelo2=851&modelo3=EtherFast+Cable+Modem+(BEFCMU10)&totalModelo3=83&modelo4=ARRIS+DOCSIS+2.0+%2f+PacketCable+1.0+Touchstone+Telephony+Modem+MODEL%3a+TM402G&totalModelo4=224&modelo5=SBG900&totalModelo5=5&modelo6=SB4200&totalModelo6=13&modelo7=Terayon+TJ%7cECM+715X&totalModelo7=3&modelo8=DOCSIS+1.1+Touchstone+Cable+Modem+Model+CM300A&totalModelo8=378&modelo9=DCM305&totalModelo9=271&modelo10=D-Link+DOCSIS+2.0+Cable+Modem+MODEL%3a+DCM-202&totalModelo10=5&modelo11=PCX2200&totalModelo11=4&modelo12=SB4100&totalModelo12=9&modelo13=Ambit+DOCSIS+Cable+Modem+Model%3a+60194E&totalModelo13=11&modelo14=DCM235&totalModelo14=55&modelo15=(General+Instrument)+Motorola+SB2100%2fD%2fi&totalModelo15=1&modelo16=(General+Instrument)+Motorola+SB3100&totalModelo16=40&modelo17=WebSTAR+Series+DPC2100&totalModelo17=1109&modelo18=ARRIS+DOCSIS+2.0+%2f+PacketCable+1.0+Touchstone+Telephony+Modem+MODEL%3a+TM502G&totalModelo18=362&modelo19=Com21+DOCSIS+1.0+Cable+Modem+Model%3a+DP111&totalModelo19=1&modelo20=CMX2940%2f3CR29210+MCNS+DOCSIS+1.0+external+2-way+Cable+Modem&totalModelo20=35&modelo21=Belkin+MODEL%3a+F5D5530-W&totalModelo21=1&modelo22=D-Link+DOCSIS+1.1+Cable+Modem+MODEL%3a+DCM-201+(discontinued%2c+replace+with+DC&totalModelo22=1&modelo23=Modelo+desconocido&totalModelo23=4&modelo24=Tollgrade+Cheetah+HFC+Service+Assurance&totalModelo24=1&modelo25=PCX1100U%2fDAZ8813&totalModelo25=4&modelo26=DCM226&totalModelo26=1&modelo27=SB5101&totalModelo27=5&modelo28=DCM225&totalModelo28=25&modelo29=SB5100&totalModelo29=10&modelo30=DOCSIS+1.1+Touchstone+Cable+Modem+MODEL+CM550A&totalModelo30=1386&modelo31=WebSTAR+Series+DPX2100&totalModelo31=1&modelo32=Com21+Model%3a+DP1110&totalModelo32=21&modelo33=PipeRider+HM200c&totalModelo33=2&modelo34=PCX2600&totalModelo34=3&modelo35=Thomson+DOCSIS+Cable+Modem+MODEL%3a+DCM315&totalModelo35=20&modelo36=Thomson+DCM425&totalModelo36=1&modelo37=PCX2500&totalModelo37=1&modelo38=UBR925-K9O3SV9Y5-M&totalModelo38=1&modelo39=ARRIS+DOCSIS+1.1+%2f+PacketCable+1.0+Touchstone+Telephony+Modem+MODEL%3a+TTM202&totalModelo39=2&sumaTotal=5215’ WIDTH="800" HEIGHT="500" ALT="Porcentajes de modelos"/>

 

La longitud de la URL en el atributo SRC fue de 2,301 caracteres y me sucedió lo que al plátano.

 

Todo funcionaba perfectamente, el servlet, las librerias gráficas, en Opera, FireFox, hasta consegui probarlo en Safari!!! (Mac OS X).

 

Pero en el IE 7 me truncaba la maldita URL a 2,048 caracteres (mentira que fueran 2,083).

 

Comienza la frustracion

 

Despues de devorarme varios RFCs, me di cuanta que:

  • No existe forma de alterar el comportamiento GET al solicitar una IMG.
  • Mediante JavaScript, el objeto Image, sencillamente no tiene metodos o atributos para especificar (establecer) los datos binarios (contenido) de una imagen.
  • El AJAX tan famoso de hoy dia, funciona principalmente para texto y XML, aunque hay workarounds para forzarlo y halar (si, se escribe con h y se pronuncia con j) un flujo binario: http://mgran.blogspot.com/2006/08/downloading-binary-streams-with.html

 

El último punto fue brevemente alentador, y de hecho pude cargar todo el flujo binario de la imagen, mediante POST!, ahí parecia que tantas horas de googlear habian rendido fruto, jajaja pero surprise surprise, una vez que tenia el contenido de la imagen no hubo poder humano que me ayudara a depositarlo de alguna forma en el render del browser para que la mostrara (punto número 2).

 

 

Maldito IE, otra vez

 

Precisamente ahondando más en el segundo punto (generar la imagen, pero esta vez en el cliente –es decir, la imagen ya la tenia en memoria-) provocó varios golpes en la pared, pero desenvoqué en algo sumamente interesante: data:URI:

http://es.wikipedia.org/wiki/Data:_URL

http://www.hackszine.com/blog/archive/2006/11/rfc_2397_embed_image_data_insi.html

 

 

En resumidas cuentas, data:URI era lo que yo deseaba: reconstruir la imagen a partir del flujo de datos, sin referenciar a un servlet, lo que evitaba que el browser realizara el GET y en consecuencia IE truncara la URL.

 

Por ejemplo, lo siguiente representa a la rana rené (Kermit) con un sable lazer de star wars:

<img src=’data:image/pjpeg;base64,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’/>

 

data:URI es un estandar desde 1998 (IETF standard RFC 2397), y que a la fecha, Microsoft se ha resistido a soportar, por tanto lo anterior funciona en TODOS los navegadores, excepto en IE.

 

¿Solución?

Llegue al punto que no queria llegar, comprimir la maldita parte de la URL de los parametrosL.

 

Me encontré con una interesante clasesilla en Java que hace la chamba de codificar y comprimir flujos de datos:

http://iharder.sourceforge.net/current/java/base64/

 

Tuve algunos problemas, puesto que algunos caracteres base64 no son URL safe, lo que significa que no son correctamente enviados por el jodido método GET.

 

Asi que despues de codificarlos en base64 y comprimir el flujo, nuevamente lo codifiqué utilizando un URL UTF8 Encoder.

 

En el ejemplo anterior, en el que yo deseaba una URL de longitud 2,301, aplicando esta técnica, quedo de 1,204 caracteres!:

 

http://www.xxx.yyy.zz/thecaMonitoringWeb/GraficaPie?encBase64GZip=H4sIAAAAAAAAAK2VzW7bOBDHeynQF0mQgnBBDkl9HOZgy07abbUxbGWb9qbIbKWNLBkSvdm8077IPsy+w1KOKYtKsR9FDzYEzW/+w5nhjP7468VL/epP/bhTV026yzHbLusmU5VOf1VxvVFl3Z4/FBudY0Dpea6Kr7lGaR51rdPySKCg59vDI8WkLsuvTbpRJMqV0mlO3l5GZK2a34pMkWnb7pu0ytTQnyI7ujOcqfK+qEh8PV98OOMpuZRzKTmdfBw6sN4BcLq9KzSZX0frd2sSpXelIh20PfyXnYRHWSgWQ39Axo8CHOeTD0V1bxXgDXVV7EHmUTwBCkMZjvKoIkYq7A37JxVGLjZFm9WVLqq92pxBRhq1K1NToIdC54YahhF9thIT1aSPdUWSn878bBHFxGfydghLtJl5uIxuGaP05gy+zKefg8AkPSA9FEfS70jw3Kb6vVBwMI96HvSHCg9mcM1hL87MlcjrbWsObZIXIJ1GDlrPTtw3mjkoIGeuBkOw148BdgB1AUAIeoJ3BAiX4AgysIQ4ENwlBErPAvIAgOcA8pSJ92R3BTwEW1Dm40d1t06mq24uCtWS+fIWmFtBA/WCwXM+esabjjBhLyQLcaFz1VymrXYKeTFbXEbxDaOvHecQA5s/UFzPrkJX3by00sCMXTJw7WYkwQJwAChzADgJ8Ce7K8DN8S0gDCBGN8q8ZPZOgeyAsYLE0No9vLhSlZmVkryrWt3st2ajvTYl0HVTlylZz/jY20Peu/v/6t5Vvxsr8yscmVPXwMxNsVOrYqMa8jY26WQOGWBfsBCjegvstD3otzfZfMmYW9WwD8fpUcSlnSQNAz3P8Ga2CkFO3ofXfP1L+ElOYgc+bVlu1uxqZU42WJImc7JMs3uln47aHTqp91ne6rpSJFGl2uV19Tge4CSWFK6cQIDc70PxHxlKjEOZQQffhhJuqG5pf3eoJB5/HETfX24WxinEQO7ZhiNRLCWdOjpmsQi/l/L+i1SHGikxlvIw8Prs/f+hxOlIyXwdAjsuPMAovoVQdBPBoxWEZjpIHP28Hl5o9btWTWUmCiYP6eMwiiMcILd7lof49JJsVPexrLNiUztwaErc7rdp0r1DyUPvb76PtNTQCAAA

 

Y funcionó. Pero no es una solución adecuada, ya que el límite esta ahí presente, nada asegura que comprimiendo la URL siempre estara por debajo de los 2048 caracteres, sencillamente no es una solución aceptable para futuras aplicaciones. Pero demonios, no he encontrado algo mejor.

 

Algunas otras soluciones estúpidas que he encontrado es halar el contenido de la imagen, como no se puede reconstruir un objeto IMG como tal en la página, entonces reconstruirla utilizando tablas, donde cada pixel representa una celda K:

http://neil.fraser.name/software/img2html/

http://neil.fraser.name/scripts/img2html.pl?img=http%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F6%2F68%2FGianna-michaels.jpg&cmd=Convert

 

Pero eso incrementa hasta en un 200% o más la cantidad necesaria para reconstruir la imagen!!, ademas de que en los ensayos que realicé, los browsers tardan demasiado en renderear toda la tabla y el consumo de memoria RAM en el cliente es inombrable.

 

Estoy empezando a creer que necesito vida social.

 

Sincerely yours…