Feed Slashdot: Modo "verboso" y peticiones HTTP incondicionales
Artículos previos sobre este proyecto para enviar por email las novedades diarias de un feed RSS:
- Generar un email diario a partir de un feed RSS (Slashdot).
- Mejoras a la hora de generar un email diario a partir de un feed RSS (Slashdot).
- Los peligros de volcar a "pickle" cualquier cosa.
- "Nullmailer", "Return-Path" y GMail.
Aunque el código va necesitando una refactorización y limpieza, sigo haciendo pequeñas modificaciones y mejoras:
-
Modo verboso: Normalmente cuando se invoca el programa hace su trabajo sin más. Pero a veces nos interesa saber qué ha hecho, si ha enviado un correo electrónico o no, por ejemplo, cuántas entradas nuevas hay en el feed RSS, etc.
-
Peticiones HTTP incondicionales: De vez en cuando el feed RSS de Slashdot da un error HTTP 50x, indicando un error interno. Cuando esto ocurre, el Sistema Operativo de mi servidor me envía un email indicando que el proceso ha fallado. Ejecutándolo manualmente compruebo que cuando ocurren esos errores el feed RSS de Slashdot no ha cambiado desde la petición anterior y que, de hecho, el problema se resuelve solo cuando aparece una entrada nueva.
Esto tiene toda la pinta de ser un bug en el código de Slashdot y en realidad solo me afecta de forma cosmética (los correos electrónicos de errores que me llegan por ser administrador de la máquina que ejecuta este servicio), pero durante las pruebas comprobé que hacer una petición HTTP incondicional [1] no produce un error, así que añadí esa funcionalidad al programa.
[1] Cuando mi programa detecta una actualización del feed RSS se queda con sus entradas y las siguientes peticiones no vuelven a pedir el feed RSS sin más, sino que envía al servidor HTTP de Slashdot lo que se llama una petición condicional que básicamente dice: "envíame el feed RSS solo si ha habido algún cambio desde la versión anterior. Si no no me mandes nada". Esto es ventajoso para todo el mundo, pero parece que Slashdot falla de vez en cuando cuando en realidad no ha habido un cambio en el feed RSS y simplemente tendría que haberme respondido con un código HTTP 304. Es así cómo debería ser y, de hecho, es lo que hace el 99.99% del tiempo. Pero falla ese 0.01%...
El parche es largo, pero fácil de entender:
Las líneas 5 y 87-95 añaden la funcionalidad de especificar parámetros a la ejecución del programa. Los cambios en las líneas 13-25 definen los parámetros HTTP de petición condicional o incondicional. Por defecto la petición es condicional (pedimos a Slashdot que nos mande el feed RSS solo si ha habido cambios), pero podemos forzar peticiones incondicionales desde la línea de comandos (es decir, pedimos a Slashdot que nos envíe el feed RSS actual, sin más).
Las líneas 32-33, 35-36 y 38-40 añaden la indicación de si la entrada que estamos evaluando del feed RSS es una entrada nueva o no. Eso se utilizará en la línea 71, más abajo.
El cambio en 52-53 implementa la posibilidad de hacer peticiones HTTP incondicionales, como se ha explicado más arriba. En la línea 61 y las líneas 67-71 contamos cuántas entradas nuevas tenemos en el feed RSS.
En las líneas 72-73 y 78-79 se nos dice qué ha pasado, si hemos activado el modo verboso.