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

View File

@ -72,5 +72,22 @@ context "Sinatra" do
body.should.equal 'Hello!' body.should.equal 'Hello!'
end 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 end

View File

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

View File

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