Rack-Middleware

2,531 views

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,531
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
15
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Rack-Middleware

  1. 1. Werde ein Rackstar mit Rack Middleware Hussein Morsy 24.11.2009 Heinrich-Heine-Universität Düsseldorf Rails User Group Düsseldorf
  2. 2. SalesLentz::DevTeam
  3. 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
  4. 4. Wer hat schon mal eine Rack-Middleware erstellt ?
  5. 5. Was ist Rack ?
  6. 6. Billy !
  7. 7. Das Fundament von Ruby basierten Webapplikationen
  8. 8. Ruby-Webframeworks Rails Ramaze Rack Sinatra Merb
  9. 9. Webbapp Webbapp Webbapp Webapps mit mit mit Ruby On Rails Merb Sinatra Rack CGI/FCGI LiteSpeed Mongrel Webserver HTTP HTTP HTTP Webclients
  10. 10. Rack ist ... • eine Spezifikation • Standardisierung von Ruby-Webapps (HTTP) • ein Gem • Grundlage von Ruby-Webframeworks
  11. 11. Rack-Hello World • require 'rubygems' require 'rack' class HelloWorld def call(env) [200, {"Content-Type" => "text/html"}, "Hallo Welt"] end end Rack::Handler::Mongrel.run HelloWorld.new, :Port => 9292
  12. 12. Rack-Applikation env Request Rack-Applikation Response [200, {"Content-Type" => "text/html"}, "Hallo Welt"] [ HTTP-Status-Code, R-Header, R-Body]
  13. 13. require 'rubygems' require 'rack' class HelloWorld def call(env) if env['PATH_INFO'] == '/' [200, {"Content-Type" => "text/html"}, "Hallo Homepage"] elsif env['PATH_INFO'] == '/impressum' [200, {"Content-Type" => "text/html"}, "© by Hussein Morsy"] else [404, {"Content-Type" => "text/html"}, "Seite nicht gefunden"] end end end Rack::Handler::Mongrel.run HelloWorld.new, :Port => 9292
  14. 14. require 'rubygems' require 'rack' class HelloWorld def call(env) if env['HTTP_USER_AGENT'] =~ /Mac OS X/ [200, {"Content-Type" => "text/html"}, "Herzlich Willkommen"] else [500, {"Content-Type" => "text/html"}, "Geh weg"] end end end Rack::Handler::Mongrel.run HelloWorld.new, :Port => 9292 Herzlich Willkommen Geh weg Geh weg
  15. 15. env • PATH_INFO ( /impressum) • REQUEST_METHOD (get, post, put,...) • QUERY_STRING (id=5) • HTTP_* • HTTP_USER_AGENT (Mozilla/5.0 ...) • HTTP_REMOTE_IP (192.198.1.54) • ...
  16. 16. Rack-Request Objekt env['PATH_INFO'] env['REQUEST_METHOD'] env['QUERY_STRING'] env['HTTP_USER_AGENT'] request = Rack::Request.new(env) request.path_info request.request_method request.query_string request.http_user_agent
  17. 17. Rack basiert • Rails • Merb • Sinatra • Ramaze • ....
  18. 18. Warum sich mit Rack beschäftigen ?
  19. 19. Um einen eigenen Webframework zu entwickeln ?
  20. 20. Verwendung und Programmierung von Rack-Middleware
  21. 21. PlugIns für Rack-Applikationen
  22. 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. 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)
  24. 24. Middleware Middleware Middleware Middleware Middleware Middleware
  25. 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. 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. 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. 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
  29. 29. Nützliche Middlewares • Refraction: mod_rewrite • rack-bug Debugging Toolbar • api-throttling: Anzahl Zugriffe beschränken • siehe auch coderack.org, github
  30. 30. coderack.org
  31. 31. Wie kann man die Middlewares zusammen setzen ?
  32. 32. Rack::Builder
  33. 33. oder einfach in Rails
  34. 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. 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
  36. 36. Twitter twitter.com/husseinmorsy

×