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. 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. 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
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. 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
18. The rackup file
• Configuration DSL for a Rack app
• Server-independent
• Allows stacking of middleware
• Provides simple route mapping
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. 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. Introduction to Rack
Why was it needed?
How does it work?
Building a stack with middleware
Writing a simple rack application
22. Middleware
Request Response
Middleware A
Request Response
Middleware B
Request Response
Application
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. Middleware in Rails
• Used internally for cookies, parameter
parsing etc
• Add your own in environment.rb:
Rails::Initializer.run do |config|
config.middleware.use "MyMiddlewareClass"
end
25. Introduction to Rack
Why was it needed?
How does it work?
Building a stack with middleware
Writing a simple rack application