making better use of Rack::Request

This commit is contained in:
Blake Mizerany 2008-03-04 16:30:06 -08:00
parent ccbb070300
commit 0fa5de7484
4 changed files with 65 additions and 22 deletions

View File

@ -1,5 +1,6 @@
require 'rubygems'
require 'metaid'
require 'uri'
if ENV['SWIFT']
require 'swiftcore/swiftiplied_mongrel'
@ -25,6 +26,26 @@ class Class
end
end
module Rack #:nodoc:
class Request #:nodoc:
def request_method
if @env['REQUEST_METHOD'] == 'POST' && %w(PUT DELETE).include?(params['_method'])
params['_method'].upcase
else
@env['REQUEST_METHOD']
end
end
def user_agent
env['HTTP_USER_AGENT']
end
end
end
module Sinatra
extend self
@ -96,11 +117,11 @@ module Sinatra
@pattern = /^#{regex}$/
end
def invoke(env)
def invoke(request)
if options[:agent]
return unless env['HTTP_USER_AGENT'] =~ options[:agent]
return unless request.user_agent =~ options[:agent]
end
return unless pattern =~ env['PATH_INFO'].squeeze('/')
return unless pattern =~ request.path_info.squeeze('/')
params = param_keys.zip($~.captures.map(&:from_param)).to_hash
Result.new(block, params, 200)
end
@ -115,7 +136,7 @@ module Sinatra
@code, @block = code, b
end
def invoke(env)
def invoke(request)
Result.new(block, {}, 404)
end
@ -123,9 +144,9 @@ module Sinatra
class Static
def invoke(env)
def invoke(request)
return unless File.file?(
Sinatra.application.options.public + env['PATH_INFO']
Sinatra.application.options.public + request.path_info
)
Result.new(block, {}, 200)
end
@ -133,7 +154,7 @@ module Sinatra
def block
Proc.new do
send_file Sinatra.application.options.public +
request.env['PATH_INFO']
request.path_info
end
end
@ -479,11 +500,11 @@ module Sinatra
@static ||= Static.new
end
def lookup(env)
method = env['REQUEST_METHOD'].downcase.to_sym
e = static.invoke(env)
e ||= events[method].eject(&[:invoke, env])
e ||= (errors[NotFound]).invoke(env)
def lookup(request)
method = request.request_method.downcase.to_sym
e = static.invoke(request)
e ||= events[method].eject(&[:invoke, request])
e ||= (errors[NotFound]).invoke(request)
e
end
@ -505,9 +526,10 @@ module Sinatra
def call(env)
reload! if development?
result = lookup(env)
request = Rack::Request.new(env)
result = lookup(request)
context = EventContext.new(
Rack::Request.new(env),
request,
Rack::Response.new,
result.params
)
@ -520,9 +542,9 @@ module Sinatra
body = returned.to_result(context)
rescue => e
raise e if options.raise_errors
env['sinatra.error'] = e
request.env['sinatra.error'] = e
context.status(500)
result = (errors[e.class] || errors[ServerError]).invoke(env)
result = (errors[e.class] || errors[ServerError]).invoke(request)
returned = catch(:halt) do
[:complete, context.instance_eval(&result.block)]
end

View File

@ -72,5 +72,22 @@ context "Sinatra" do
body.should.equal 'Hello!'
end
specify "put'n with POST" do
put '/' do
'puted'
end
post_it '/', :_method => 'PUT'
assert_equal 'puted', body
end
specify "put'n wth PUT" do
put '/' do
'puted'
end
put_it '/'
assert_equal 'puted', body
end
end

View File

@ -19,8 +19,10 @@ context "Looking up a request" do
get '/', &block
result = Sinatra.application.lookup(
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/'
Rack::Request.new(
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/'
)
)
result.should.not.be.nil
@ -32,8 +34,10 @@ context "Looking up a request" do
get '/:foo', &block
result = Sinatra.application.lookup(
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/bar'
Rack::Request.new(
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/bar'
)
)
result.should.not.be.nil

View File

@ -6,10 +6,10 @@ require 'test/spec'
context "Simple Events" do
def simple_request_hash(method, path)
{
Rack::Request.new({
'REQUEST_METHOD' => method.to_s.upcase,
'PATH_INFO' => path
}
})
end
def invoke_simple(path, request_path, &b)