Sunday, January 30, 2011

WinInet vs. libcurl

Hace algunos años llegué a tener que programar un modulito que hablaba a un servidor Web. Ya no recuerdo ni para qué... el chiste es que terminé usando WinInet porque era lo que tenía a la mano y todavía no se me daba el buscar bibliotecas open source.

Ahora hace unos días tuve que hacer hacer una implementación rápida para hacer una petición Web. Por inercia (y porque ya lo conocía) me fui por WinInet. Unos minutos después tenía funcionando mi juguetito... Pero unos días después, cuando la "implementación rápida" tuvo que estar más o menos en condiciones para hacer un demo... resulta que la velocidad de conexión era malísima... y eso cuando funcionaba!! Por motivos que jamás comprenderé funcionaba bien a veces y a veces no, con un error de ERROR_INTERNET_CANNOT_CONNECT que por más que le pregunté a Google y aplicar lo que me decía, no lo pude superar...

En la frustración opté por darle su oportunidad a libcurl. Tras un rato de entender las opciones y la API para C, tenía la comunicación funcionando... he aquí las diferencias:

- código: WinInet require abrir una sesión, luego una conexión, luego el request, y finalmente leer los resultados. En libcurl, la API "fácil" realmente es fácil!

+ rapidez: Mientras que en WinInet se notaba claramente el retraso por establecer la sesión y conexión antes de poder enviar la petición... en libcurl todo eso es casi instantáneo y lo que tarda es sólo el tiempo de transmisión. No se me da hacer benchmarks, pero me tienen que creer que fue una diferencia muy notoria!

+ consistencia: Por un lado tengo un mensaje de error que me sale aleatoriamente. Por el otro... sólo funciona.

+ fácil de especificar opciones: Esto es un muy buen reto en el mundo de WinInet. Hay opciones que se especifican en el momento de establecer la sesión... otras en el momento de la conexión y otras en el momento del request. Y puedo solicitar funcionalidad, por ejemplo, hacer peticiones en modo asíncrono, la opción se activa en una función, pero si se activa o no depende de los argumentos a otra función. En libcurl, todo es en la función setopt...

- reglas: Resulta que no puedo usar WinInet desde el system context (por ejemplo, desde un servicio). libcurl me deja ser...

***

El único punto a favor que le puedo dar a WinInet es que compila con solo agregar un include, mientras que libcurl requiere que lo compile aparte... con todo lo anterior, sí hago el esfuerzo! Además, comparando con otras bibliotecas open source con las que he trabajado últimamente (pronto toca hablar sobre Thrift y MongoDB), integrar libcurl fue un placer!

Creo que no hace falta concluir... no regreso a WinInet.

No comments: