From 0fa5de7484fc22a885fa067e4cff4c9ac78cb7e0 Mon Sep 17 00:00:00 2001 From: Blake Mizerany Date: Tue, 4 Mar 2008 16:30:06 -0800 Subject: [PATCH] making better use of Rack::Request --- lib/sinatra.rb | 54 ++++++++++++++++++++++++++++------------ test/app_test.rb | 17 +++++++++++++ test/application_test.rb | 12 ++++++--- test/events_test.rb | 4 +-- 4 files changed, 65 insertions(+), 22 deletions(-) diff --git a/lib/sinatra.rb b/lib/sinatra.rb index dcee2c9e..e0867436 100644 --- a/lib/sinatra.rb +++ b/lib/sinatra.rb @@ -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 diff --git a/test/app_test.rb b/test/app_test.rb index a4f0d64c..ae5d38fd 100644 --- a/test/app_test.rb +++ b/test/app_test.rb @@ -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 diff --git a/test/application_test.rb b/test/application_test.rb index 0b666645..ed931e0a 100644 --- a/test/application_test.rb +++ b/test/application_test.rb @@ -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 diff --git a/test/events_test.rb b/test/events_test.rb index 6a481daf..781b46db 100644 --- a/test/events_test.rb +++ b/test/events_test.rb @@ -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)