Werde ein Rackstar
       mit
 Rack Middleware
            Hussein Morsy

              24.11.2009
 Heinrich-Heine-Univers...
SalesLentz::DevTeam
Über uns

• internes Entwicklerteam von Sales-Lentz
• IBEs für Reisen, Bustickets, Eventtickets
• seit 2006 entwickeln wir...
Wer hat schon mal eine
     Rack-Middleware
              erstellt ?
Was ist Rack ?
Billy !
Das Fundament von
  Ruby basierten
 Webapplikationen
Ruby-Webframeworks

           Rails



  Ramaze   Rack    Sinatra




           Merb
Webbapp       Webbapp   Webbapp
Webapps           mit          mit        mit
             Ruby On Rails    Merb      Sina...
Rack ist ...

• eine Spezifikation
• Standardisierung von Ruby-Webapps
  (HTTP)
• ein Gem
• Grundlage von Ruby-Webframeworks
Rack-Hello World
•   require 'rubygems'
    require 'rack'

    class HelloWorld
      def call(env)
        [200, {"Conte...
Rack-Applikation
                        env
                            Request



                   Rack-Applikation

 ...
require 'rubygems'
require 'rack'

class HelloWorld
  def call(env)
    if env['PATH_INFO'] == '/'
      [200, {"Content-T...
require 'rubygems'
require 'rack'

class HelloWorld
  def call(env)
    if env['HTTP_USER_AGENT'] =~ /Mac OS X/
      [200...
env
• PATH_INFO ( /impressum)
• REQUEST_METHOD (get, post, put,...)
• QUERY_STRING (id=5)
• HTTP_*
 • HTTP_USER_AGENT (Moz...
Rack-Request Objekt

env['PATH_INFO']
env['REQUEST_METHOD']
env['QUERY_STRING']
env['HTTP_USER_AGENT']




request = Rack:...
Rack basiert

• Rails
• Merb
• Sinatra
• Ramaze
• ....
Warum sich mit Rack
  beschäftigen ?
Um einen eigenen
 Webframework
 zu entwickeln ?
Verwendung und
Programmierung
      von
Rack-Middleware
PlugIns für
Rack-Applikationen
Rack-Middleware
• Rack-Middleware ist eine Rack-Applikation
  mit besonderen anforderungen
• Eine Rack-Middleware ist eine...
env
                     Request


    Rack-Middleware A
  [ HTTP-Status-Code, R-Header, R-Body]

                     Res...
Middleware

Middleware

Middleware

Middleware

Middleware

Middleware
Rack Middleware Bsp 1
                  Alles in Kleinbuchstaben
class Downcase
  def initialize(app)
    @app = app
  end...
Rack Middleware Bsp 2
             Kommentar am Anfang setzen
class ResponseTimer
  def initialize(app)
    @app = app
  e...
Rack Middleware Bsp 3
              Ersetzung von Zeichenketten
class NewPhone
  def initialize(app)
    @app = app
  end
...
Rack Middleware Bsp 3
       Deaktivierung von POST, PUT, DELETE
# http://coderack.org/users/techiferous/entries/84-racklo...
Nützliche Middlewares
• Refraction:
   mod_rewrite
• rack-bug
   Debugging Toolbar
• api-throttling: Anzahl
  Zugriffe bes...
coderack.org
Wie kann man die
Middlewares zusammen
       setzen ?
Rack::Builder
oder einfach in Rails
Middleware in Rails
    1. Rack-Middlewares (z.B.) ins lib-Verzeichnis
    2. Middleware in environment.rb aktivieren
# li...
rack middleware
rake middleware

use Rack::Lock
use ActionController::Failsafe
use ActionController::Session::CookieStore,...
Twitter


twitter.com/husseinmorsy
Upcoming SlideShare
Loading in...5
×

Rack-Middleware

2,295

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,295
On Slideshare
0
From Embeds
0
Number of Embeds
0
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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×