Mi (pequeño) homenaje al gran, genial e irrepetible Terry Pratchett

Terry Pratchett ha sido uno de los grandes escritores de novelas de fantasía. Su serie más conocida Mundodisco, cuenta con 41 libros escritos en un estilo desenfadado y humorístico que parodian el género fantástico pero que a la vez encierran durísimas y mordaces críticas contra muchos aspectos de nuestra sociedad. El humor de Pratchett es reconocido como uno de los más ácidos e inteligentes a la vez que absurdos y esta mezcla es explosiva: sus libros te hacen estallar en carcajadas a la vez que reflexionar. Para mi ha sido uno de los escritores que más me ha impactado.

Son muy conocidas sus frases, sacadas tanto de sus libros como de sus charlas y hay webs que se dedican a recopilarlas. Algunas hacen gracia por si mismas, otras hacen mucha más gracia dentro del contexto del libro. En inglés, la página “L-Space Web” contiene probablemente la mayor recopilación de frases de Pratchett. En castellano es “la concha de gran A’Tuin” quien contiene otra buena colección.

Ahora que Terry Pratchett ha muerto he pensado que es el momento de hacerle un pequeño (pequeñísimo) homenaje, similar a otros que se están haciendo al estilo de “GNU Terry Pratchett”.

En mi caso he dedicido crear un middlewarwe OWIN que añade una cabecera HTTP con una cita de Terry Pratchett al azar. Las citas están extraídas de la lista contenida en L-Space Web, aunque el middleware es configurable para que puedas usar tus propias citas si lo prefieres.

El código principal del middleware es muy sencillo:

  1. public class PratchettOwinMiddleware
  2. {
  3.     private readonly AppFunc _next;
  4.     private readonly PratchettQuotesFactory _quotesFactory;
  5.     private readonly Random _random;
  6.     public PratchettOwinMiddleware(AppFunc next, PratchettQuotesFactory quotesFactory)
  7.     {
  8.         _next = next;
  9.         _quotesFactory = quotesFactory;
  10.         _random = new Random();
  11.     }
  12.  
  13.     public async Task Invoke(IDictionary<string, object> environment)
  14.     {
  15.         await _next.Invoke(environment);
  16.         var headers = environment["owin.ResponseHeaders"] as IDictionary<string, string[]>;
  17.         var quotes = _quotesFactory.GetQuotes();
  18.         var quote = quotes[_random.Next(0, quotes.Length)];
  19.         headers.Add("X-Pratchett-Quote", new string[] { quote});
  20.     }
  21. }

Básicamente se dedica a añadir la cabecera X-Pratchett-Quote a cualquier petición que sea procesada. Para registrarlo en el pipeline de OWIN se usa un método de extensión sobre IAppBuilder definido en la clase PratchettAppBuilderExtensions:

  1.   public static class PratchettAppBuilderExtensions
  2.   {
  3.       public static void UseTerryPratchett(this IAppBuilder app)
  4.       {
  5.           app.Use(typeof(PratchettOwinMiddleware),
  6.               new PratchettQuotesFactory(
  7.                   new InternalFileQuoteParser(),
  8.                     () =>Assembly.GetExecutingAssembly().GetManifestResourceStream("PratchettQuotes.terry_quotes.txt")));
  9.       }
  10.  
  11.       public static void UseTerryPratchett(this IAppBuilder app, IQuoteParser quoteParser, string filename)
  12.       {
  13.           app.Use(typeof(PratchettOwinMiddleware),
  14.               new PratchettQuotesFactory(quoteParser, () => new FileStream(filename, FileMode.Open, FileAccess.Read)));
  15.       }
  16.  
  17.       public static void UseTerryPratchett(this IAppBuilder app, IQuoteParser quoteParser, Func<Stream> quotesProvider)
  18.       {
  19.           app.Use(typeof(PratchettOwinMiddleware), new PratchettQuotesFactory(quoteParser, quotesProvider));
  20.       }
  21.   }

El método está sobrecargado para admitir tus propias citas. En este caso debes pasar también una clase que implemente la interfaz IQuoteParser que indique como leer los datos del stream que contiene las citas. No se incluye ninguna implementación de dicha interfaz (bueno, se incluye una pero es interna ya que se usa para parsear los datos del fichero de citas, que está sacado literalmente de L-Space Web).

Si llamas simplemente a UseTerryPratchett() se usará el fichero de citas que está incrustado dentro del ensamblado.

El resultado lo puedes ver en esta captura de la pestaña red de Chrome:

image

El código fuente del proyecto lo teneis en github: https://github.com/eiximenis/PratchettQuotes

Saludos!:D

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *