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.
- data/AUTHORS +26 -0
- data/README.rdoc +7 -3
- data/Rakefile +2 -10
- data/lib/rack/contrib.rb +6 -0
- data/lib/rack/contrib/access.rb +85 -0
- data/lib/rack/contrib/cookies.rb +50 -0
- data/lib/rack/contrib/expectation_cascade.rb +32 -0
- data/lib/rack/contrib/host_meta.rb +47 -0
- data/lib/rack/contrib/jsonp.rb +1 -1
- data/lib/rack/contrib/mailexceptions.rb +1 -1
- data/lib/rack/contrib/profiler.rb +3 -1
- data/lib/rack/contrib/response_headers.rb +24 -0
- data/lib/rack/contrib/runtime.rb +31 -0
- data/lib/rack/contrib/simple_endpoint.rb +81 -0
- data/lib/rack/contrib/static_cache.rb +93 -0
- data/rack-contrib.gemspec +22 -5
- data/test/documents/test +1 -0
- data/test/spec_rack_access.rb +154 -0
- data/test/spec_rack_cookies.rb +56 -0
- data/test/spec_rack_expectation_cascade.rb +72 -0
- data/test/spec_rack_host_meta.rb +50 -0
- data/test/spec_rack_jsonp.rb +5 -5
- data/test/spec_rack_post_body_content_type_parser.rb +1 -1
- data/test/spec_rack_profiler.rb +1 -1
- data/test/spec_rack_response_headers.rb +35 -0
- data/test/spec_rack_runtime.rb +35 -0
- data/test/spec_rack_simple_endpoint.rb +95 -0
- data/test/spec_rack_static_cache.rb +91 -0
- data/test/statics/test +1 -0
- metadata +72 -25
- data/lib/rack/contrib/etag.rb +0 -20
- data/test/spec_rack_etag.rb +0 -23
@@ -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
|
data/test/spec_rack_jsonp.rb
CHANGED
@@ -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("/", :
|
12
|
+
request = Rack::MockRequest.env_for("/", :params => "foo=bar&callback=#{callback}")
|
13
13
|
body = Rack::JSONP.new(app).call(request).last
|
14
|
-
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("/", :
|
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("/", :
|
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("/", :
|
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
|
data/test/spec_rack_profiler.rb
CHANGED
@@ -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("/", :
|
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
|
data/test/statics/test
ADDED
@@ -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
|
-
|
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:
|
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
|
-
|
18
|
-
|
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
|
-
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: test-spec
|
27
|
-
|
28
|
-
|
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
|
-
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
35
48
|
- !ruby/object:Gem::Dependency
|
36
49
|
name: tmail
|
37
|
-
|
38
|
-
|
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
|
-
|
59
|
+
type: :development
|
60
|
+
version_requirements: *id003
|
45
61
|
- !ruby/object:Gem::Dependency
|
46
62
|
name: json
|
47
|
-
|
48
|
-
|
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
|
-
|
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.
|
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
|