rack-contrib 0.9.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rack-contrib might be problematic. Click here for more details.

@@ -0,0 +1,50 @@
1
+ require 'test/spec'
2
+ require 'rack/mock'
3
+ require 'rack/contrib/host_meta'
4
+ require 'rack/contrib/not_found'
5
+
6
+ context "Rack::HostMeta" do
7
+
8
+ setup do
9
+ app = Rack::Builder.new do
10
+ use Rack::Lint
11
+ use Rack::ContentLength
12
+ use Rack::HostMeta do
13
+ link :uri => '/robots.txt', :rel => 'robots'
14
+ link :uri => '/w3c/p3p.xml', :rel => 'privacy', :type => 'application/p3p.xml'
15
+ link :pattern => '{uri};json_schema', :rel => 'describedby', :type => 'application/x-schema+json'
16
+ end
17
+ run Rack::NotFound.new('test/404.html')
18
+ end
19
+ @response = Rack::MockRequest.new(app).get('/host-meta')
20
+ end
21
+
22
+ specify "should respond to /host-meta" do
23
+ @response.status.should.equal 200
24
+ end
25
+
26
+ specify "should respond with the correct media type" do
27
+ @response['Content-Type'].should.equal 'application/host-meta'
28
+ end
29
+
30
+ specify "should include a Link entry for each Link item in the config block" do
31
+ @response.body.should.match(/Link:\s*<\/robots.txt>;.*\n/)
32
+ @response.body.should.match(/Link:\s*<\/w3c\/p3p.xml>;.*/)
33
+ end
34
+
35
+ specify "should include a Link-Pattern entry for each Link-Pattern item in the config" do
36
+ @response.body.should.match(/Link-Pattern:\s*<\{uri\};json_schema>;.*/)
37
+ end
38
+
39
+ specify "should include a rel attribute for each Link or Link-Pattern entry where specified" do
40
+ @response.body.should.match(/rel="robots"/)
41
+ @response.body.should.match(/rel="privacy"/)
42
+ @response.body.should.match(/rel="describedby"/)
43
+ end
44
+
45
+ specify "should include a type attribute for each Link or Link-Pattern entry where specified" do
46
+ @response.body.should.match(/Link:\s*<\/w3c\/p3p.xml>;.*type.*application\/p3p.xml/)
47
+ @response.body.should.match(/Link-Pattern:\s*<\{uri\};json_schema>;.*type.*application\/x-schema\+json/)
48
+ end
49
+
50
+ end
@@ -9,24 +9,24 @@ context "Rack::JSONP" do
9
9
  test_body = '{"bar":"foo"}'
10
10
  callback = 'foo'
11
11
  app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, [test_body]] }
12
- request = Rack::MockRequest.env_for("/", :input => "foo=bar&callback=#{callback}")
12
+ request = Rack::MockRequest.env_for("/", :params => "foo=bar&callback=#{callback}")
13
13
  body = Rack::JSONP.new(app).call(request).last
14
- body.join.should.equal "#{callback}(#{test_body})"
14
+ body.should.equal "#{callback}(#{test_body})"
15
15
  end
16
16
 
17
17
  specify "should modify the content length to the correct value" do
18
18
  test_body = '{"bar":"foo"}'
19
19
  callback = 'foo'
20
20
  app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, [test_body]] }
21
- request = Rack::MockRequest.env_for("/", :input => "foo=bar&callback=#{callback}")
21
+ request = Rack::MockRequest.env_for("/", :params => "foo=bar&callback=#{callback}")
22
22
  headers = Rack::JSONP.new(app).call(request)[1]
23
23
  headers['Content-Length'].should.equal((test_body.length + callback.length + 2).to_s) # 2 parentheses
24
24
  end
25
25
  end
26
26
 
27
27
  specify "should not change anything if no callback param is provided" do
28
- app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, '{"bar":"foo"}'] }
29
- request = Rack::MockRequest.env_for("/", :input => "foo=bar")
28
+ app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['{"bar":"foo"}']] }
29
+ request = Rack::MockRequest.env_for("/", :params => "foo=bar")
30
30
  body = Rack::JSONP.new(app).call(request).last
31
31
  body.join.should.equal '{"bar":"foo"}'
32
32
  end
@@ -16,7 +16,7 @@ begin
16
16
 
17
17
  specify "should change nothing when the POST body content type isn't application/json" do
18
18
  app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, Rack::Request.new(env).POST] }
19
- body = app.call(Rack::MockRequest.env_for("/", :input => "body=asdf&status=12")).last
19
+ body = Rack::PostBodyContentTypeParser.new(app).call(Rack::MockRequest.env_for("/", {:method => 'POST', :params => "body=asdf&status=12"})).last
20
20
  body['body'].should.equal "asdf"
21
21
  body['status'].should.equal "12"
22
22
  end
@@ -6,7 +6,7 @@ begin
6
6
 
7
7
  context 'Rack::Profiler' do
8
8
  app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, 'Oh hai der'] }
9
- request = Rack::MockRequest.env_for("/", :input => "profile=process_time")
9
+ request = Rack::MockRequest.env_for("/", :params => "profile=process_time")
10
10
 
11
11
  specify 'printer defaults to RubyProf::CallTreePrinter' do
12
12
  profiler = Rack::Profiler.new(nil)
@@ -0,0 +1,35 @@
1
+ require 'test/spec'
2
+ require 'rack'
3
+ require 'rack/contrib/response_headers'
4
+
5
+ context "Rack::ResponseHeaders" do
6
+
7
+ specify "yields a HeaderHash of response headers" do
8
+ orig_headers = {'X-Foo' => 'foo', 'X-Bar' => 'bar'}
9
+ app = Proc.new {[200, orig_headers, []]}
10
+ middleware = Rack::ResponseHeaders.new(app) do |headers|
11
+ assert_instance_of Rack::Utils::HeaderHash, headers
12
+ orig_headers.should == headers
13
+ end
14
+ middleware.call({})
15
+ end
16
+
17
+ specify "allows adding headers" do
18
+ app = Proc.new {[200, {'X-Foo' => 'foo'}, []]}
19
+ middleware = Rack::ResponseHeaders.new(app) do |headers|
20
+ headers['X-Bar'] = 'bar'
21
+ end
22
+ r = middleware.call({})
23
+ r[1].should == {'X-Foo' => 'foo', 'X-Bar' => 'bar'}
24
+ end
25
+
26
+ specify "allows deleting headers" do
27
+ app = Proc.new {[200, {'X-Foo' => 'foo', 'X-Bar' => 'bar'}, []]}
28
+ middleware = Rack::ResponseHeaders.new(app) do |headers|
29
+ headers.delete('X-Bar')
30
+ end
31
+ r = middleware.call({})
32
+ r[1].should == {'X-Foo' => 'foo'}
33
+ end
34
+
35
+ end
@@ -0,0 +1,35 @@
1
+ require 'test/spec'
2
+ require 'rack/mock'
3
+ require 'rack/contrib/runtime'
4
+
5
+ context "Rack::Runtime" do
6
+ specify "sets X-Runtime is none is set" do
7
+ app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
8
+ response = Rack::Runtime.new(app).call({})
9
+ response[1]['X-Runtime'].should =~ /[\d\.]+/
10
+ end
11
+
12
+ specify "does not set the X-Runtime if it is already set" do
13
+ app = lambda { |env| [200, {'Content-Type' => 'text/plain', "X-Runtime" => "foobar"}, "Hello, World!"] }
14
+ response = Rack::Runtime.new(app).call({})
15
+ response[1]['X-Runtime'].should == "foobar"
16
+ end
17
+
18
+ specify "should allow a suffix to be set" do
19
+ app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
20
+ response = Rack::Runtime.new(app, "Test").call({})
21
+ response[1]['X-Runtime-Test'].should =~ /[\d\.]+/
22
+ end
23
+
24
+ specify "should allow multiple timers to be set" do
25
+ app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
26
+ runtime1 = Rack::Runtime.new(app, "App")
27
+ runtime2 = Rack::Runtime.new(runtime1, "All")
28
+ response = runtime2.call({})
29
+
30
+ response[1]['X-Runtime-App'].should =~ /[\d\.]+/
31
+ response[1]['X-Runtime-All'].should =~ /[\d\.]+/
32
+
33
+ Float(response[1]['X-Runtime-All']).should > Float(response[1]['X-Runtime-App'])
34
+ end
35
+ end
@@ -0,0 +1,95 @@
1
+ require 'test/spec'
2
+ require 'rack'
3
+ require 'rack/contrib/simple_endpoint'
4
+
5
+ context "Rack::SimpleEndpoint" do
6
+ setup do
7
+ @app = Proc.new { Rack::Response.new {|r| r.write "Downstream app"}.finish }
8
+ end
9
+
10
+ specify "calls downstream app when no match" do
11
+ endpoint = Rack::SimpleEndpoint.new(@app, '/foo') { 'bar' }
12
+ status, headers, body = endpoint.call(Rack::MockRequest.env_for('/baz'))
13
+ status.should == 200
14
+ body.body.should == ['Downstream app']
15
+ end
16
+
17
+ specify "calls downstream app when path matches but method does not" do
18
+ endpoint = Rack::SimpleEndpoint.new(@app, '/foo' => :get) { 'bar' }
19
+ status, headers, body = endpoint.call(Rack::MockRequest.env_for('/foo', :method => 'post'))
20
+ status.should == 200
21
+ body.body.should == ['Downstream app']
22
+ end
23
+
24
+ specify "calls downstream app when path matches but block returns :pass" do
25
+ endpoint = Rack::SimpleEndpoint.new(@app, '/foo') { :pass }
26
+ status, headers, body = endpoint.call(Rack::MockRequest.env_for('/foo'))
27
+ status.should == 200
28
+ body.body.should == ['Downstream app']
29
+ end
30
+
31
+ specify "returns endpoint response when path matches" do
32
+ endpoint = Rack::SimpleEndpoint.new(@app, '/foo') { 'bar' }
33
+ status, headers, body = endpoint.call(Rack::MockRequest.env_for('/foo'))
34
+ status.should == 200
35
+ body.body.should == ['bar']
36
+ end
37
+
38
+ specify "returns endpoint response when path and single method requirement match" do
39
+ endpoint = Rack::SimpleEndpoint.new(@app, '/foo' => :get) { 'bar' }
40
+ status, headers, body = endpoint.call(Rack::MockRequest.env_for('/foo'))
41
+ status.should == 200
42
+ body.body.should == ['bar']
43
+ end
44
+
45
+ specify "returns endpoint response when path and one of multiple method requirements match" do
46
+ endpoint = Rack::SimpleEndpoint.new(@app, '/foo' => [:get, :post]) { 'bar' }
47
+ status, headers, body = endpoint.call(Rack::MockRequest.env_for('/foo', :method => 'post'))
48
+ status.should == 200
49
+ body.body.should == ['bar']
50
+ end
51
+
52
+ specify "returns endpoint response when path matches regex" do
53
+ endpoint = Rack::SimpleEndpoint.new(@app, /foo/) { 'bar' }
54
+ status, headers, body = endpoint.call(Rack::MockRequest.env_for('/bar/foo'))
55
+ status.should == 200
56
+ body.body.should == ['bar']
57
+ end
58
+
59
+ specify "block yields Rack::Request and Rack::Response objects" do
60
+ endpoint = Rack::SimpleEndpoint.new(@app, '/foo') do |req, res|
61
+ assert_instance_of ::Rack::Request, req
62
+ assert_instance_of ::Rack::Response, res
63
+ end
64
+ endpoint.call(Rack::MockRequest.env_for('/foo'))
65
+ end
66
+
67
+ specify "block yields MatchData object when Regex path matcher specified" do
68
+ endpoint = Rack::SimpleEndpoint.new(@app, /foo(.+)/) do |req, res, match|
69
+ assert_instance_of MatchData, match
70
+ assert_equal 'bar', match[1]
71
+ end
72
+ endpoint.call(Rack::MockRequest.env_for('/foobar'))
73
+ end
74
+
75
+ specify "block does NOT yield MatchData object when String path matcher specified" do
76
+ endpoint = Rack::SimpleEndpoint.new(@app, '/foo') do |req, res, match|
77
+ assert_nil match
78
+ end
79
+ endpoint.call(Rack::MockRequest.env_for('/foo'))
80
+ end
81
+
82
+ specify "response honors headers set in block" do
83
+ endpoint = Rack::SimpleEndpoint.new(@app, '/foo') {|req, res| res['X-Foo'] = 'bar'; 'baz' }
84
+ status, headers, body = endpoint.call(Rack::MockRequest.env_for('/foo'))
85
+ status.should == 200
86
+ headers['X-Foo'].should == 'bar'
87
+ body.body.should == ['baz']
88
+ end
89
+
90
+ specify "sets Content-Length header" do
91
+ endpoint = Rack::SimpleEndpoint.new(@app, '/foo') {|req, res| 'bar' }
92
+ status, headers, body = endpoint.call(Rack::MockRequest.env_for('/foo'))
93
+ headers['Content-Length'].should == '3'
94
+ end
95
+ end
@@ -0,0 +1,91 @@
1
+ require 'test/spec'
2
+
3
+ require 'rack'
4
+ require 'rack/contrib/static_cache'
5
+ require 'rack/mock'
6
+
7
+ class DummyApp
8
+ def call(env)
9
+ [200, {}, ["Hello World"]]
10
+ end
11
+ end
12
+
13
+ describe "Rack::StaticCache" do
14
+
15
+ setup do
16
+ @root = ::File.expand_path(::File.dirname(__FILE__))
17
+ end
18
+
19
+ it "should serve files with required headers" do
20
+ default_app_request
21
+ res = @request.get("/statics/test")
22
+ res.should.be.ok
23
+ res.body.should =~ /rubyrack/
24
+ res.headers['Cache-Control'].should == 'max-age=31536000, public'
25
+ next_year = Time.now().year + 1
26
+ res.headers['Expires'].should =~ Regexp.new(
27
+ "[A-Z][a-z]{2}[,][\s][0-9]{2}[\s][A-Z][a-z]{2}[\s]" << "#{next_year}" <<
28
+ "[\s][0-9]{2}[:][0-9]{2}[:][0-9]{2} GMT$")
29
+ res.headers.has_key?('Etag').should == false
30
+ res.headers.has_key?('Pragma').should == false
31
+ res.headers.has_key?('Last-Modified').should == false
32
+ end
33
+
34
+ it "should return 404s if url root is known but it can't find the file" do
35
+ default_app_request
36
+ res = @request.get("/statics/foo")
37
+ res.should.be.not_found
38
+ end
39
+
40
+ it "should call down the chain if url root is not known" do
41
+ default_app_request
42
+ res = @request.get("/something/else")
43
+ res.should.be.ok
44
+ res.body.should == "Hello World"
45
+ end
46
+
47
+ it "should serve files if requested with version number and versioning is enabled" do
48
+ default_app_request
49
+ res = @request.get("/statics/test-0.0.1")
50
+ res.should.be.ok
51
+ end
52
+
53
+ it "should change cache duration if specified thorugh option" do
54
+ configured_app_request
55
+ res = @request.get("/statics/test")
56
+ res.should.be.ok
57
+ res.body.should =~ /rubyrack/
58
+ next_next_year = Time.now().year + 2
59
+ res.headers['Expires'].should =~ Regexp.new("#{next_next_year}")
60
+ end
61
+
62
+ it "should return 404s if requested with version number but versioning is disabled" do
63
+ configured_app_request
64
+ res = @request.get("/statics/test-0.0.1")
65
+ res.should.be.not_found
66
+ end
67
+
68
+ it "should serve files with plain headers when * is added to the directory name" do
69
+ configured_app_request
70
+ res = @request.get("/documents/test")
71
+ res.should.be.ok
72
+ res.body.should =~ /nocache/
73
+ next_next_year = Time.now().year + 2
74
+ res.headers['Expires'].should.not =~ Regexp.new("#{next_next_year}")
75
+ end
76
+
77
+ def default_app_request
78
+ @options = {:urls => ["/statics"], :root => @root}
79
+ request
80
+ end
81
+
82
+ def configured_app_request
83
+ @options = {:urls => ["/statics", "/documents*"], :root => @root, :versioning => false, :duration => 2}
84
+ request
85
+ end
86
+
87
+ def request
88
+ @request = Rack::MockRequest.new(Rack::StaticCache.new(DummyApp.new, @options))
89
+ end
90
+
91
+ end
@@ -0,0 +1 @@
1
+ rubyrack
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-contrib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 0
9
+ version: 1.0.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - rack-devel
@@ -9,49 +14,63 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2009-03-07 00:00:00 -08:00
17
+ date: 2010-06-07 00:00:00 -07:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: rack
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ - 9
30
+ - 1
23
31
  version: 0.9.1
24
- version:
32
+ type: :runtime
33
+ version_requirements: *id001
25
34
  - !ruby/object:Gem::Dependency
26
35
  name: test-spec
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
30
38
  requirements:
31
- - - ~>
39
+ - - ">="
32
40
  - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ - 9
44
+ - 0
33
45
  version: 0.9.0
34
- version:
46
+ type: :development
47
+ version_requirements: *id002
35
48
  - !ruby/object:Gem::Dependency
36
49
  name: tmail
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
40
52
  requirements:
41
53
  - - ">="
42
54
  - !ruby/object:Gem::Version
55
+ segments:
56
+ - 1
57
+ - 2
43
58
  version: "1.2"
44
- version:
59
+ type: :development
60
+ version_requirements: *id003
45
61
  - !ruby/object:Gem::Dependency
46
62
  name: json
47
- type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
63
+ prerelease: false
64
+ requirement: &id004 !ruby/object:Gem::Requirement
50
65
  requirements:
51
66
  - - ">="
52
67
  - !ruby/object:Gem::Version
68
+ segments:
69
+ - 1
70
+ - 1
53
71
  version: "1.1"
54
- version:
72
+ type: :development
73
+ version_requirements: *id004
55
74
  description: Contributed Rack Middleware and Utilities
56
75
  email: rack-devel@googlegroups.com
57
76
  executables: []
@@ -62,20 +81,24 @@ extra_rdoc_files:
62
81
  - README.rdoc
63
82
  - COPYING
64
83
  files:
84
+ - AUTHORS
65
85
  - COPYING
66
86
  - README.rdoc
67
87
  - Rakefile
68
88
  - lib/rack/contrib.rb
69
89
  - lib/rack/contrib/accept_format.rb
90
+ - lib/rack/contrib/access.rb
70
91
  - lib/rack/contrib/backstage.rb
71
92
  - lib/rack/contrib/bounce_favicon.rb
72
93
  - lib/rack/contrib/callbacks.rb
73
94
  - lib/rack/contrib/config.rb
95
+ - lib/rack/contrib/cookies.rb
74
96
  - lib/rack/contrib/csshttprequest.rb
75
97
  - lib/rack/contrib/deflect.rb
76
- - lib/rack/contrib/etag.rb
77
98
  - lib/rack/contrib/evil.rb
99
+ - lib/rack/contrib/expectation_cascade.rb
78
100
  - lib/rack/contrib/garbagecollector.rb
101
+ - lib/rack/contrib/host_meta.rb
79
102
  - lib/rack/contrib/jsonp.rb
80
103
  - lib/rack/contrib/lighttpd_script_name_fix.rb
81
104
  - lib/rack/contrib/locale.rb
@@ -87,24 +110,32 @@ files:
87
110
  - lib/rack/contrib/profiler.rb
88
111
  - lib/rack/contrib/relative_redirect.rb
89
112
  - lib/rack/contrib/response_cache.rb
113
+ - lib/rack/contrib/response_headers.rb
90
114
  - lib/rack/contrib/route_exceptions.rb
115
+ - lib/rack/contrib/runtime.rb
91
116
  - lib/rack/contrib/sendfile.rb
92
117
  - lib/rack/contrib/signals.rb
118
+ - lib/rack/contrib/simple_endpoint.rb
119
+ - lib/rack/contrib/static_cache.rb
93
120
  - lib/rack/contrib/time_zone.rb
94
121
  - rack-contrib.gemspec
95
122
  - test/404.html
96
123
  - test/Maintenance.html
124
+ - test/documents/test
97
125
  - test/mail_settings.rb
98
126
  - test/spec_rack_accept_format.rb
127
+ - test/spec_rack_access.rb
99
128
  - test/spec_rack_backstage.rb
100
129
  - test/spec_rack_callbacks.rb
101
130
  - test/spec_rack_config.rb
102
131
  - test/spec_rack_contrib.rb
132
+ - test/spec_rack_cookies.rb
103
133
  - test/spec_rack_csshttprequest.rb
104
134
  - test/spec_rack_deflect.rb
105
- - test/spec_rack_etag.rb
106
135
  - test/spec_rack_evil.rb
136
+ - test/spec_rack_expectation_cascade.rb
107
137
  - test/spec_rack_garbagecollector.rb
138
+ - test/spec_rack_host_meta.rb
108
139
  - test/spec_rack_jsonp.rb
109
140
  - test/spec_rack_lighttpd_script_name_fix.rb
110
141
  - test/spec_rack_mailexceptions.rb
@@ -115,9 +146,16 @@ files:
115
146
  - test/spec_rack_profiler.rb
116
147
  - test/spec_rack_relative_redirect.rb
117
148
  - test/spec_rack_response_cache.rb
149
+ - test/spec_rack_response_headers.rb
150
+ - test/spec_rack_runtime.rb
118
151
  - test/spec_rack_sendfile.rb
152
+ - test/spec_rack_simple_endpoint.rb
153
+ - test/spec_rack_static_cache.rb
154
+ - test/statics/test
119
155
  has_rdoc: true
120
156
  homepage: http://github.com/rack/rack-contrib/
157
+ licenses: []
158
+
121
159
  post_install_message:
122
160
  rdoc_options:
123
161
  - --line-numbers
@@ -132,32 +170,37 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
170
  requirements:
133
171
  - - ">="
134
172
  - !ruby/object:Gem::Version
173
+ segments:
174
+ - 0
135
175
  version: "0"
136
- version:
137
176
  required_rubygems_version: !ruby/object:Gem::Requirement
138
177
  requirements:
139
178
  - - ">="
140
179
  - !ruby/object:Gem::Version
180
+ segments:
181
+ - 0
141
182
  version: "0"
142
- version:
143
183
  requirements: []
144
184
 
145
185
  rubyforge_project:
146
- rubygems_version: 1.3.1
186
+ rubygems_version: 1.3.6
147
187
  signing_key:
148
188
  specification_version: 2
149
189
  summary: Contributed Rack Middleware and Utilities
150
190
  test_files:
151
191
  - test/spec_rack_accept_format.rb
192
+ - test/spec_rack_access.rb
152
193
  - test/spec_rack_backstage.rb
153
194
  - test/spec_rack_callbacks.rb
154
195
  - test/spec_rack_config.rb
155
196
  - test/spec_rack_contrib.rb
197
+ - test/spec_rack_cookies.rb
156
198
  - test/spec_rack_csshttprequest.rb
157
199
  - test/spec_rack_deflect.rb
158
- - test/spec_rack_etag.rb
159
200
  - test/spec_rack_evil.rb
201
+ - test/spec_rack_expectation_cascade.rb
160
202
  - test/spec_rack_garbagecollector.rb
203
+ - test/spec_rack_host_meta.rb
161
204
  - test/spec_rack_jsonp.rb
162
205
  - test/spec_rack_lighttpd_script_name_fix.rb
163
206
  - test/spec_rack_mailexceptions.rb
@@ -168,4 +211,8 @@ test_files:
168
211
  - test/spec_rack_profiler.rb
169
212
  - test/spec_rack_relative_redirect.rb
170
213
  - test/spec_rack_response_cache.rb
214
+ - test/spec_rack_response_headers.rb
215
+ - test/spec_rack_runtime.rb
171
216
  - test/spec_rack_sendfile.rb
217
+ - test/spec_rack_simple_endpoint.rb
218
+ - test/spec_rack_static_cache.rb