Firefox JSM: DevPower.Http.ResponseInterceptor

Desde hace algunos días he estado programando una extensión de firefox, la cual debe interceptar las respuestas http basándose en las urls. Una vez interceptada la respuesta, el contenido de la misma debe almacenarse localmente.

Debido a que las extensiones de firefox utilizan javascript como lenguaje de programación, me dispuse a crear una "clase" reutilizable que se encargue de realizar dicha tarea. Esta clase es DevPower.Http.ResponseInterceptor, la cual se ha programado como un módulo JSM y su uso es muy sencillo:

  1. /** ..... importa el módulo y realiza inicializaciones
  2. ...
  3. */
  4.  
  5. /**
  6.  * Cada ResponseInterceptor debe implementar el método
  7.  * ResponseInterceptor#createChannelListener(matcher),
  8.  * el cual debe devolver un nsITraceableListener, que es el que se
  9.  * encargará de realizar las acciones necesarias sobre la respuesta recibida.
  10.  * En el script se incluye una implementación de esta interfaz que se
  11.  * encarga de descargar a una carpeta seleccionada el contenido de la
  12.  * respuesta, dicha implementación es
  13.  * DevPower.Http.ResponseInterceptor.Downloader.
  14.  */
  15. var MyInterceptor = new DevPower.Http.ResponseInterceptor();
  16. MyInterceptor.createChannelListener = function(matcher) {
  17. return new DevPower.Http.ResponseInterceptor.Downloader("/home/emerino/downloads", "mp3");
  18. };
  19.  
  20. /**
  21.  * Un interceptor necesita "matchers" para saber qué respuestas interceptar.
  22.  * En el script se incluye una implementación básica de uno llamada UrlMatcher,
  23.  * el cual verifica si la url de la respuesta actual coincide con alguna de las que
  24.  * se tienen registradas en el matcher. Dichas urls deben ser expresiones
  25.  * regulares.
  26.  *
  27.  * Independientemente de la implementación utilizada de los
  28.  * nsITraceableListeners, cada uno de estos que se creen almacenarán el listener
  29.  * original en la propiedad nsITraceableListenerImplementation.originalListener.
  30.  */
  31. var matcher = new DevPower.Http.ResponseInterceptor.UrlMatcher();
  32. matcher.addUrl("^http://www.example.com$");
  33. matcher.addUrl("^http://devio.us/.*");
  34.  
  35. MyInterceptor.addMatcher("mymatcher", matcher);
  36. MyInterceptor.start();

Con el código anterior, al llamar al método DevPower.Http.ResponseInterceptor#start(), se registra un observer para la notificación "http-on-examine-response", el cual verifica si algún DevPower.Http.Matcher causa un "match" sobre las urls dadas, de ser así se registra un nsITraceableListener con el nsIHttpChannel de la respuesta, el cual se encarga de descargar el contenido de la misma al disco duro.

El código fuente del módulo se encuentra disponible para su descarga aquí.

Posted by:

Share:

Leave a Reply



(Your email will not be publicly displayed.)