Un middleware rack-enabled

15 giugno 2010

Un middleware rack-enabled

Creare un middleware rack-enabled è un’operazione estremamente semplice, la classe in questione deve solamente poter ricevere un parametro nel costruttore e possedere un metodo chiamato call che accetta in ingresso un ulteriore parametro, un semplice esempio di questa struttura è il seguente:

class Reverse
  
  def initialize(app)
    @app = app
  end
  
  def call(env)
    @app.call(env)
  end
  
end

Il metodo call è la chiave di volta che consente ai vari anelli della catena, alle varie classi dei vari middleware, di potersi passare e di poter modificare l’oggetto contenente i dati di richiesta HTTP. Nell’esempio appena esposto, tale oggetto è contenuto nell’argomento env mentre il parametro app, passato al costruttore della classe, contiene un’istanza del successivo anello della catena.

È piena responsabilità di ogni anello invocare correttamente il successivo; nel nostro caso il compito viene assolto dall’unica istruzione presente nel metodo call. Volendo provare a schematizzare l’operatività in termini di chiamate a funzioni per una catena formata da tre ipotetici middleware Compress, Reverse e Traslate ne risulterebbe il seguente listato:

risposta_in_uscita = Compress.new(
                       Reverse.new(
                         Traslate.new(
                           MyApp.new
                         )
                       )
                     ).call(richiesta_in_ingresso)			 

Questo esempio offre lo spunto per riflettere sulla considerazione che di ogni catena l’ultimo anello è sempre formato dall’applicazione stessa, è quindi diretta conseguenza di questo ragionamento l’osservazione che ogni applicazione che voglia beneficiare di uno stack costruito con middleware rack-enabled debba predisporre al suo interno una classe che contenga un metodo call che deve fungere da ‘punto di connessione’ ricevendo in ingresso l’oggetto contenente le richieste e ritornando le debite risposte (ad esempio una pagina HTML).

Completiamo la creazione del middleware Reverse aggiungendo quel minimo di logica necessaria a far si che ogni frammento di testo presente nella oggetto contenente la risposta venga invertito:

class Reverse
  
  def initialize(app)
    @app = app
  end
  
  def call(env)
     status, head, body = @app.call(env)
    [status, head, body.gsub(/\>([^\<]+)\</){|m| ">#{$1.reverse}<"}]
  end
  
end

L’oggetto che contiene la risposta è per convenzione costruito utilizzando un semplice array di tre valori, rispettivamente lo stato della risposta HTTP (ad es: 200), gli header della risposta ed il body della stessa. Nel middleware in costruzione è sufficiente quindi ritornare gli stessi tre elementi ricevuti avendo premura di invertire qualsiasi frammento di testo presente nel body.

Se vuoi aggiornamenti su Un middleware rack-enabled inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Un middleware rack-enabled

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy