Your SlideShare is downloading. ×
Rack-Middleware
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Rack-Middleware

2,254
views

Published on

Einführung in Rack und Rack-Middleware …

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,254
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Werde ein Rackstar mit Rack Middleware Hussein Morsy 24.11.2009 Heinrich-Heine-Universität Düsseldorf Rails User Group Düsseldorf
  • 2. SalesLentz::DevTeam
  • 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. Wer hat schon mal eine Rack-Middleware erstellt ?
  • 5. Was ist Rack ?
  • 6. Billy !
  • 7. Das Fundament von Ruby basierten Webapplikationen
  • 8. Ruby-Webframeworks Rails Ramaze Rack Sinatra Merb
  • 9. Webbapp Webbapp Webbapp Webapps mit mit mit Ruby On Rails Merb Sinatra Rack CGI/FCGI LiteSpeed Mongrel Webserver HTTP HTTP HTTP Webclients
  • 10. Rack ist ... • eine Spezifikation • Standardisierung von Ruby-Webapps (HTTP) • ein Gem • Grundlage von Ruby-Webframeworks
  • 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. Rack-Applikation env Request Rack-Applikation Response [200, {"Content-Type" => "text/html"}, "Hallo Welt"] [ HTTP-Status-Code, R-Header, R-Body]
  • 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. 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. 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. 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. Rack basiert • Rails • Merb • Sinatra • Ramaze • ....
  • 18. Warum sich mit Rack beschäftigen ?
  • 19. Um einen eigenen Webframework zu entwickeln ?
  • 20. Verwendung und Programmierung von Rack-Middleware
  • 21. PlugIns für Rack-Applikationen
  • 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)
  • 24. Middleware Middleware Middleware Middleware Middleware Middleware
  • 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
  • 29. Nützliche Middlewares • Refraction: mod_rewrite • rack-bug Debugging Toolbar • api-throttling: Anzahl Zugriffe beschränken • siehe auch coderack.org, github
  • 30. coderack.org
  • 31. Wie kann man die Middlewares zusammen setzen ?
  • 32. Rack::Builder
  • 33. oder einfach in Rails
  • 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
  • 36. Twitter twitter.com/husseinmorsy