Einführung in Rack und Rack-Middleware
Vortrag wurde am 24.11.2009 an der
Heinrich-Heine-Universität Düsseldorf im Rahmen der Rails User Group Düsseldorf von Hussein Morsy gehalten
3. Über uns
• internes Entwicklerteam von Sales-Lentz
• IBEs für Reisen, Bustickets, Eventtickets
• seit 2006 entwickeln wir mit Ruby on Rails
• Buch Ruby on Rails 2 Galileo Press
http://www.railsbuch.de
22. Rack-Middleware
• Rack-Middleware ist eine Rack-Applikation
mit besonderen anforderungen
• Eine Rack-Middleware ist eine Filter, mit
der Request und der Response verändert
werden kann
• Mehrere Rack-Middleware können
hintereinander geschaltet werden.
23. env
Request
Rack-Middleware A
[ HTTP-Status-Code, R-Header, R-Body]
Response
Rack-Middleware B
Response
Rack-Middleware C
Rack-Applikation (z.B. Rails)
25. Rack Middleware Bsp 1
Alles in Kleinbuchstaben
class Downcase
def initialize(app)
@app = app
end
def call(env)
status, headers, response = @app.call(env)
[status, headers, response.body.downcase]
end
end
26. Rack Middleware Bsp 2
Kommentar am Anfang setzen
class ResponseTimer
def initialize(app)
@app = app
end
def call(env)
status, headers, response = @app.call(env)
[status, headers, "<!-- Programmiert von ... !>" + response.body]
end
end
27. Rack Middleware Bsp 3
Ersetzung von Zeichenketten
class NewPhone
def initialize(app)
@app = app
end
def call(env)
old = "0211 456"
new = "0211 789"
status, headers, response = @app.call(env)
[status, headers, response.body.gsub(old,new)]
end
end
28. Rack Middleware Bsp 3
Deaktivierung von POST, PUT, DELETE
# http://coderack.org/users/techiferous/entries/84-racklockdown
class Lockdown
def initialize(app)
@app = app
end
def call(env)
request = Rack::Request.new(env)
if ["GET", "HEAD"].include?(request.request_method)
@app.call(env)
else
message = "That action is currently not supported."
message << " We apologize for any inconvenience."
[405, {"Content-Type" => "text/html"}, message]
end
end
end
34. Middleware in Rails
1. Rack-Middlewares (z.B.) ins lib-Verzeichnis
2. Middleware in environment.rb aktivieren
# lib/downcase.rb
class Downcase
def initialize(app)
@app = app
end
def call(env)
status, headers, response = @app.call(env)
[status, headers, response.body.downcase]
end
end
# config/environment.rb
Rails::Initializer.run do |config|
config.middleware.use "Downcase"
# ...
end
35. rack middleware
rake middleware
use Rack::Lock
use ActionController::Failsafe
use ActionController::Session::CookieStore, #<Proc:
0x000000010212e348@(eval):8>
use ActionController::ParamsParser
use Rack::MethodOverride
use Rack::Head
use Comment
use Downcase
use NewPhone
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
run ActionController::Dispatcher.new