rack-contrib 0.9.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
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
|