diff --git a/lib/rack/request.rb b/lib/rack/request.rb index fa948b126..63f209800 100644 --- a/lib/rack/request.rb +++ b/lib/rack/request.rb @@ -18,7 +18,11 @@ class Request attr_reader :env def self.new(env) - env["rack.request"] ||= super + if self == Rack::Request + env["rack.request"] ||= super + else + super + end end def initialize(env) diff --git a/test/spec_rack_request.rb b/test/spec_rack_request.rb index 75064287a..cdfca2c90 100644 --- a/test/spec_rack_request.rb +++ b/test/spec_rack_request.rb @@ -492,4 +492,34 @@ rack_request_object_id.should.be.equal env['rack.request'].object_id req2.should.equal env['rack.request'] end + + class MyRequest < Rack::Request + def params + {:foo => "bar"} + end + end + + specify "should allow subclass request to be instantiated after parent request" do + env = Rack::MockRequest.env_for("/?foo=bar") + + req1 = Rack::Request.new(env) + req1.GET.should.equal "foo" => "bar" + req1.params.should.equal "foo" => "bar" + + req2 = MyRequest.new(env) + req2.GET.should.equal "foo" => "bar" + req2.params.should.equal :foo => "bar" + end + + specify "should allow parent request to be instantiated after subclass request" do + env = Rack::MockRequest.env_for("/?foo=bar") + + req1 = MyRequest.new(env) + req1.GET.should.equal "foo" => "bar" + req1.params.should.equal :foo => "bar" + + req2 = Rack::Request.new(env) + req2.GET.should.equal "foo" => "bar" + req2.params.should.equal "foo" => "bar" + end end