Rack

2,086 views
2,011 views

Published on

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

No Downloads
Views
Total views
2,086
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Rack

  1. 1. Introduction to Rack Kerry Buckley, 26 October 2010
  2. 2. Introduction to Rack Why was it needed? How does it work? Building a stack with middleware Writing a simple rack application
  3. 3. Web frameworks and many more…
  4. 4. Web servers Mongrel CGI Webrick
  5. 5. Before Rack
  6. 6. With Rack Rack-compliant interface
  7. 7. Introduction to Rack Why was it needed? How does it work? Building a stack with middleware Writing a simple rack application
  8. 8. Rack is just an interface specification
  9. 9. A Rack app is… • An object (not a class)… • …which responds to call(env)… • …and returns an array containing: • response code • a hash of headers • the body* *this is a slight simplification
  10. 10. The environment hash • REQUEST_METHOD • SERVER_NAME, SERVER_PORT • SCRIPT_NAME, PATH_INFO, QUERY_STRING • HTTP_ variables from request headers • Some rack-specific variables
  11. 11. A simple Rack app require 'rubygems' require 'rack' class HelloWorld   def call(env)     [200, {"Content-Type" => "text/html"}, "Hello World!"]   end end Rack::Handler::Mongrel.run HelloWorld.new, :Port => 9292
  12. 12. Even simpler Rack app require 'rubygems' require 'rack' Rack::Handler::Mongrel.run proc { |env|   [200, {"Content-Type" => "text/html"}, "Hello World!"] }, :Port => 9292
  13. 13. Revisiting the body • An object (not a class)… • …which responds to call(env)… • …and returns an array containing: • response code • a hash of headers • the body* *this is a slight simplification
  14. 14. Revisiting the body • Must respond to each, yielding strings • Strings work in 1.8, but not 1.9 • close will be called if present • to_path can provide a file location
  15. 15. Body as array require 'rubygems' require 'rack' class HelloWorld   def call(env)     [200, {"Content-Type" => "text/html"}, ["Hello ", "World!"]]   end end Rack::Handler::Mongrel.run HelloWorld.new, :Port => 9292
  16. 16. Body as IO object require 'rubygems' require 'rack' class HelloWorld   def call(env)     [200, {"Content-Type" => "text/html"},       StringIO.new("Hello World!")]   end end Rack::Handler::Mongrel.run HelloWorld.new, :Port => 9292
  17. 17. Body as self require 'rubygems' require 'rack' class HelloWorld   def call(env)     [200, {"Content-Type" => "text/html"}, self]   end   def each     yield "Hello "     yield "World!"   end end Rack::Handler::Mongrel.run HelloWorld.new, :Port => 9292
  18. 18. The rackup file • Configuration DSL for a Rack app • Server-independent • Allows stacking of middleware • Provides simple route mapping
  19. 19. The rackup file Your config.ru file: class HelloWorld   def call(env)     [200, {"Content-Type" => "text/html"}, "Hello World!"]   end end run HelloWorld.new Rack loads it like this: config_file = File.read(config) rack_application = eval("Rack::Builder.new { #{config_file} }") server.run rack_application, options
  20. 20. The rack gem Provides a bunch of helper classes • Request/response wrappers • Logging • Authentication (basic and digest) • Cookies and sessions • Mock requests and responses
  21. 21. Introduction to Rack Why was it needed? How does it work? Building a stack with middleware Writing a simple rack application
  22. 22. Middleware Request Response Middleware A Request Response Middleware B Request Response Application
  23. 23. Middleware • A middleware is just a rack application • Constructor takes next app down • Can modify request or response • Can call layer below, or just return • Configured with ‘use’ in rackup file
  24. 24. Middleware in Rails
  25. 25. • Used internally for cookies, parameter parsing etc • Add your own in environment.rb: Rails::Initializer.run do |config|     config.middleware.use "MyMiddlewareClass"   end 
  26. 26. Introduction to Rack Why was it needed? How does it work? Building a stack with middleware Writing a simple rack application
  27. 27. Demo!

×