Rack e Metal

15 giugno 2010

Metal

Naturalmente è possibile fare cose ben più interessanti con Rack e Rails, un esempio concreto di tali possibilità è offerto da Metal. Metal è una classe che implementa un meccanismo di funzionamento interessante: a fronte della ricezione di una richiesta discerne se tale richiesta può essere gestita in autonomia o passata alla restante porzione di stack. Nel primo caso lo stesso Metal genera una tripletta di risposta ed interrompe la chiamata all’anello successivo della catena; visto che stiamo parlando di Rails questo significa che per la richiesta in questione non verranno istanziati ne controller ne view, con relativo sensibile beneficio in termini di velocità risposta. Nel secondo caso invece Metal agisce come connettore trasparente passando l’intero environment all’anello successivo.

Creare un middleware Metal-based in un applicazione Rails è impegnativo quanto digitare dalla root dell’applicazione:

 ruby script/generate metal HelloWorld

Il file creato dal generator (/app/metal/hello_world.rb) è sufficientemente autoesplicativo:

# Allow the metal piece to run in isolation
require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)

class HelloWorld
  def self.call(env)
    if env["PATH_INFO"] =~ /^\/hello_world/
      [200, {"Content-Type" => "text/html"}, ["Hello, World!"]]
    else
      [404, {"Content-Type" => "text/html"}, ["Not Found"]]
    end
  end
end

Se l’URL di navigazione risponde positivamente al confronto con l’espressione regolare allora lo stack viene interrotto e la classe HelloWorld si prende la responsabilità di costruire una tripletta (in questo caso molto semplice) da passare al browser.

In caso contrario invece viene creata una tripletta convenzionale di diniego che viene poi ‘tradotta’ da Rails nell’istruzione @app.call(env) che abbiamo visto in precedenza passando di fatto il controllo al successivo middleware della catena.

Conclusioni

Rack è potentissimo, il suo sistema ha come punto di forza l’estrema semplicità della sua implementazione: qualsiasi middleware può beneficiare dello stack offerto da Rack con una quantità minima di sforzo. Il suo utilizzo comporta inoltre un piacevole incapsulamento dei singoli aspetti del progetto che lo incorpora e aiuta lo sviluppatore ad implementare in modo saggio e ordinato le singole componenti di quanto sta realizzando. Infine la possibilità di creare una propria catena di middleware con la stessa facilità con la quale si scrive una lista ordinata rende ancora più evidente la sottile eleganza di questa ormai irrinunciabile libreria.

Se vuoi aggiornamenti su Rack e Metal inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Rack e Metal

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