making better use of Rack::Request
This commit is contained in:
parent
ccbb070300
commit
0fa5de7484
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue