rack-contrib 1.2.0 → 1.2.0.39.g17d21b4

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.

Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +98 -0
  3. data/lib/rack/contrib.rb +3 -1
  4. data/lib/rack/contrib/enforce_valid_encoding.rb +23 -0
  5. data/lib/rack/contrib/jsonp.rb +5 -1
  6. data/lib/rack/contrib/locale.rb +1 -1
  7. data/lib/rack/contrib/mailexceptions.rb +41 -10
  8. data/lib/rack/contrib/post_body_content_type_parser.rb +1 -1
  9. data/lib/rack/contrib/relative_redirect.rb +1 -1
  10. data/lib/rack/contrib/try_static.rb +1 -1
  11. metadata +166 -113
  12. data/README.rdoc +0 -98
  13. data/Rakefile +0 -89
  14. data/rack-contrib.gemspec +0 -112
  15. data/test/404.html +0 -1
  16. data/test/Maintenance.html +0 -1
  17. data/test/documents/existing.html +0 -1
  18. data/test/documents/index.htm +0 -1
  19. data/test/documents/index.html +0 -1
  20. data/test/documents/test +0 -1
  21. data/test/mail_settings.rb +0 -20
  22. data/test/spec_rack_accept_format.rb +0 -72
  23. data/test/spec_rack_access.rb +0 -154
  24. data/test/spec_rack_backstage.rb +0 -26
  25. data/test/spec_rack_callbacks.rb +0 -65
  26. data/test/spec_rack_common_cookies.rb +0 -107
  27. data/test/spec_rack_config.rb +0 -22
  28. data/test/spec_rack_contrib.rb +0 -8
  29. data/test/spec_rack_cookies.rb +0 -56
  30. data/test/spec_rack_csshttprequest.rb +0 -66
  31. data/test/spec_rack_deflect.rb +0 -107
  32. data/test/spec_rack_evil.rb +0 -19
  33. data/test/spec_rack_expectation_cascade.rb +0 -72
  34. data/test/spec_rack_garbagecollector.rb +0 -13
  35. data/test/spec_rack_host_meta.rb +0 -50
  36. data/test/spec_rack_jsonp.rb +0 -188
  37. data/test/spec_rack_lighttpd_script_name_fix.rb +0 -16
  38. data/test/spec_rack_mailexceptions.rb +0 -169
  39. data/test/spec_rack_nested_params.rb +0 -46
  40. data/test/spec_rack_not_found.rb +0 -17
  41. data/test/spec_rack_post_body_content_type_parser.rb +0 -40
  42. data/test/spec_rack_proctitle.rb +0 -26
  43. data/test/spec_rack_profiler.rb +0 -42
  44. data/test/spec_rack_relative_redirect.rb +0 -78
  45. data/test/spec_rack_response_cache.rb +0 -137
  46. data/test/spec_rack_response_headers.rb +0 -35
  47. data/test/spec_rack_runtime.rb +0 -35
  48. data/test/spec_rack_sendfile.rb +0 -86
  49. data/test/spec_rack_simple_endpoint.rb +0 -95
  50. data/test/spec_rack_static_cache.rb +0 -104
  51. data/test/spec_rack_try_static.rb +0 -56
  52. data/test/statics/test +0 -1
@@ -1,46 +0,0 @@
1
- require 'test/spec'
2
- require 'rack/mock'
3
- require 'rack/contrib/nested_params'
4
- require 'rack/methodoverride'
5
-
6
- context Rack::NestedParams do
7
-
8
- App = lambda { |env| [200, {'Content-Type' => 'text/plain'}, Rack::Request.new(env)] }
9
-
10
- def env_for_post_with_headers(path, headers, body)
11
- Rack::MockRequest.env_for(path, {:method => "POST", :input => body}.merge(headers))
12
- end
13
-
14
- def form_post(params, content_type = 'application/x-www-form-urlencoded')
15
- params = Rack::Utils.build_query(params) if Hash === params
16
- env_for_post_with_headers('/', {'CONTENT_TYPE' => content_type}, params)
17
- end
18
-
19
- def middleware
20
- Rack::NestedParams.new(App)
21
- end
22
-
23
- specify "should handle requests with POST body Content-Type of application/x-www-form-urlencoded" do
24
- req = middleware.call(form_post({'foo[bar][baz]' => 'nested'})).last
25
- req.POST.should.equal({"foo" => { "bar" => { "baz" => "nested" }}})
26
- end
27
-
28
- specify "should not parse requests with other Content-Type" do
29
- req = middleware.call(form_post({'foo[bar][baz]' => 'nested'}, 'text/plain')).last
30
- req.POST.should.equal({})
31
- end
32
-
33
- specify "should work even after another middleware already parsed the request" do
34
- app = Rack::MethodOverride.new(middleware)
35
- req = app.call(form_post({'_method' => 'put', 'foo[bar]' => 'nested'})).last
36
- req.POST.should.equal({'_method' => 'put', "foo" => { "bar" => "nested" }})
37
- req.put?.should.equal true
38
- end
39
-
40
- specify "should make first boolean have precedence even after request already parsed" do
41
- app = Rack::MethodOverride.new(middleware)
42
- req = app.call(form_post("foo=1&foo=0")).last
43
- req.POST.should.equal({"foo" => '1'})
44
- end
45
-
46
- end
@@ -1,17 +0,0 @@
1
- require 'test/spec'
2
- require 'rack/mock'
3
- require 'rack/contrib/not_found'
4
-
5
- context "Rack::NotFound" do
6
-
7
- specify "should render the file at the given path for all requests" do
8
- app = Rack::Builder.new do
9
- use Rack::Lint
10
- run Rack::NotFound.new('test/404.html')
11
- end
12
- response = Rack::MockRequest.new(app).get('/')
13
- response.body.should.equal('Not Found')
14
- response.status.should.equal(404)
15
- end
16
-
17
- end
@@ -1,40 +0,0 @@
1
- require 'test/spec'
2
- require 'rack/mock'
3
-
4
- begin
5
- require 'rack/contrib/post_body_content_type_parser'
6
-
7
- context "Rack::PostBodyContentTypeParser" do
8
-
9
- specify "should parse 'application/json' requests" do
10
- params = params_for_request '{"key":"value"}', "application/json"
11
- params['key'].should.equal "value"
12
- end
13
-
14
- specify "should parse 'application/json; charset=utf-8' requests" do
15
- params = params_for_request '{"key":"value"}', "application/json; charset=utf-8"
16
- params['key'].should.equal "value"
17
- end
18
-
19
- specify "should parse 'application/json' requests with empty body" do
20
- params = params_for_request "", "application/json"
21
- params.should.equal({})
22
- end
23
-
24
- specify "shouldn't affect form-urlencoded requests" do
25
- params = params_for_request("key=value", "application/x-www-form-urlencoded")
26
- params['key'].should.equal "value"
27
- end
28
-
29
- end
30
-
31
- def params_for_request(body, content_type)
32
- env = Rack::MockRequest.env_for "/", {:method => "POST", :input => body, "CONTENT_TYPE" => content_type}
33
- app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, Rack::Request.new(env).POST] }
34
- Rack::PostBodyContentTypeParser.new(app).call(env).last
35
- end
36
-
37
- rescue LoadError => e
38
- # Missing dependency JSON, skipping tests.
39
- STDERR.puts "WARN: Skipping Rack::PostBodyContentTypeParser tests (json not installed)"
40
- end
@@ -1,26 +0,0 @@
1
- require 'test/spec'
2
- require 'rack/mock'
3
- require 'rack/contrib/proctitle'
4
-
5
- context "Rack::ProcTitle" do
6
- F = ::File
7
-
8
- progname = File.basename($0)
9
- appname = F.expand_path(__FILE__).split('/')[-3]
10
-
11
- def simple_app(body=['Hello World!'])
12
- lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
13
- end
14
-
15
- specify "should set the process title when created" do
16
- Rack::ProcTitle.new(simple_app)
17
- $0.should.equal "#{progname} [#{appname}] init ..."
18
- end
19
-
20
- specify "should set the process title on each request" do
21
- app = Rack::ProcTitle.new(simple_app)
22
- req = Rack::MockRequest.new(app)
23
- 10.times { req.get('/hello') }
24
- $0.should.equal "#{progname} [#{appname}/80] (10) GET /hello"
25
- end
26
- end
@@ -1,42 +0,0 @@
1
- require 'test/spec'
2
- require 'rack/mock'
3
-
4
- begin
5
- require 'rack/contrib/profiler'
6
-
7
- context 'Rack::Profiler' do
8
- app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, 'Oh hai der'] }
9
- request = Rack::MockRequest.env_for("/", :params => "profile=process_time")
10
-
11
- specify 'printer defaults to RubyProf::CallStackPrinter' do
12
- profiler = Rack::Profiler.new(nil)
13
- profiler.instance_variable_get('@printer').should.equal RubyProf::CallStackPrinter
14
- profiler.instance_variable_get('@times').should.equal 1
15
- end
16
-
17
- specify 'CallStackPrinter has Content-Type test/html' do
18
- headers = Rack::Profiler.new(app, :printer => :call_stack).call(request)[1]
19
- headers.should.equal "Content-Type"=>"text/html"
20
- end
21
-
22
- specify 'CallTreePrinter has correct headers' do
23
- headers = Rack::Profiler.new(app, :printer => :call_tree).call(request)[1]
24
- headers.should.equal "Content-Disposition"=>"attachment; filename=\"/.process_time.tree\"", "Content-Type"=>"application/octet-stream"
25
- end
26
-
27
- specify 'FlatPrinter and GraphPrinter has Content-Type text/plain' do
28
- %w(flat graph).each do |printer|
29
- headers = Rack::Profiler.new(app, :printer => printer.to_sym).call(request)[1]
30
- headers.should.equal "Content-Type"=>"text/plain"
31
- end
32
- end
33
-
34
- specify 'GraphHtmlPrinter has Content-Type text/html' do
35
- headers = Rack::Profiler.new(app, :printer => :graph_html).call(request)[1]
36
- headers.should.equal "Content-Type"=>"text/html"
37
- end
38
- end
39
-
40
- rescue LoadError => boom
41
- $stderr.puts "WARN: Skipping Rack::Profiler tests (ruby-prof not installed)"
42
- end
@@ -1,78 +0,0 @@
1
- require 'test/spec'
2
- require 'rack/mock'
3
- require 'rack/contrib/relative_redirect'
4
- require 'fileutils'
5
-
6
- context Rack::RelativeRedirect do
7
- def request(opts={}, &block)
8
- @def_status = opts[:status] if opts[:status]
9
- @def_location = opts[:location] if opts[:location]
10
- yield Rack::MockRequest.new(Rack::RelativeRedirect.new(@def_app, &opts[:block])).get(opts[:path]||@def_path, opts[:headers]||{})
11
- end
12
-
13
- setup do
14
- @def_path = '/path/to/blah'
15
- @def_status = 301
16
- @def_location = '/redirect/to/blah'
17
- @def_app = lambda { |env| [@def_status, {'Location' => @def_location}, [""]]}
18
- end
19
-
20
- specify "should make the location url an absolute url if currently a relative url" do
21
- request do |r|
22
- r.status.should.equal(301)
23
- r.headers['Location'].should.equal('http://example.org/redirect/to/blah')
24
- end
25
- request(:status=>302, :location=>'/redirect') do |r|
26
- r.status.should.equal(302)
27
- r.headers['Location'].should.equal('http://example.org/redirect')
28
- end
29
- end
30
-
31
- specify "should use the request path if the relative url is given and doesn't start with a slash" do
32
- request(:status=>303, :location=>'redirect/to/blah') do |r|
33
- r.status.should.equal(303)
34
- r.headers['Location'].should.equal('http://example.org/path/to/redirect/to/blah')
35
- end
36
- request(:status=>303, :location=>'redirect') do |r|
37
- r.status.should.equal(303)
38
- r.headers['Location'].should.equal('http://example.org/path/to/redirect')
39
- end
40
- end
41
-
42
- specify "should use a given block to make the url absolute" do
43
- request(:block=>proc{|env, res| "https://example.org"}) do |r|
44
- r.status.should.equal(301)
45
- r.headers['Location'].should.equal('https://example.org/redirect/to/blah')
46
- end
47
- request(:status=>303, :location=>'/redirect', :block=>proc{|env, res| "https://e.org:9999/blah"}) do |r|
48
- r.status.should.equal(303)
49
- r.headers['Location'].should.equal('https://e.org:9999/blah/redirect')
50
- end
51
- end
52
-
53
- specify "should not modify the location url unless the response is a redirect" do
54
- status = 200
55
- @def_app = lambda { |env| [status, {'Content-Type' => "text/html"}, [""]]}
56
- request do |r|
57
- r.status.should.equal(200)
58
- r.headers.should.not.include?('Location')
59
- end
60
- status = 404
61
- @def_app = lambda { |env| [status, {'Content-Type' => "text/html", 'Location' => 'redirect'}, [""]]}
62
- request do |r|
63
- r.status.should.equal(404)
64
- r.headers['Location'].should.equal('redirect')
65
- end
66
- end
67
-
68
- specify "should not modify the location url if it is already an absolute url" do
69
- request(:location=>'https://example.org/') do |r|
70
- r.status.should.equal(301)
71
- r.headers['Location'].should.equal('https://example.org/')
72
- end
73
- request(:status=>302, :location=>'https://e.org:9999/redirect') do |r|
74
- r.status.should.equal(302)
75
- r.headers['Location'].should.equal('https://e.org:9999/redirect')
76
- end
77
- end
78
- end
@@ -1,137 +0,0 @@
1
- require 'test/spec'
2
- require 'rack/mock'
3
- require 'rack/contrib/response_cache'
4
- require 'fileutils'
5
-
6
- context Rack::ResponseCache do
7
- F = ::File
8
-
9
- def request(opts={}, &block)
10
- Rack::MockRequest.new(Rack::ResponseCache.new(block||@def_app, opts[:cache]||@cache, &opts[:rc_block])).send(opts[:meth]||:get, opts[:path]||@def_path, opts[:headers]||{})
11
- end
12
-
13
- setup do
14
- @cache = {}
15
- @def_disk_cache = F.join(F.dirname(__FILE__), 'response_cache_test_disk_cache')
16
- @def_value = ["rack-response-cache"]
17
- @def_path = '/path/to/blah'
18
- @def_app = lambda { |env| [200, {'Content-Type' => env['CT'] || 'text/html'}, @def_value]}
19
- end
20
- teardown do
21
- FileUtils.rm_rf(@def_disk_cache)
22
- end
23
-
24
- specify "should cache results to disk if cache is a string" do
25
- request(:cache=>@def_disk_cache)
26
- F.read(F.join(@def_disk_cache, 'path', 'to', 'blah.html')).should.equal @def_value.first
27
- request(:path=>'/path/3', :cache=>@def_disk_cache)
28
- F.read(F.join(@def_disk_cache, 'path', '3.html')).should.equal @def_value.first
29
- end
30
-
31
- specify "should cache results to given cache if cache is not a string" do
32
- request
33
- @cache.should.equal('/path/to/blah.html'=>@def_value)
34
- request(:path=>'/path/3')
35
- @cache.should.equal('/path/to/blah.html'=>@def_value, '/path/3.html'=>@def_value)
36
- end
37
-
38
- specify "should not CACHE RESults if request method is not GET" do
39
- request(:meth=>:post)
40
- @cache.should.equal({})
41
- request(:meth=>:put)
42
- @cache.should.equal({})
43
- request(:meth=>:delete)
44
- @cache.should.equal({})
45
- end
46
-
47
- specify "should not cache results if there is a query string" do
48
- request(:path=>'/path/to/blah?id=1')
49
- @cache.should.equal({})
50
- request(:path=>'/path/to/?id=1')
51
- @cache.should.equal({})
52
- request(:path=>'/?id=1')
53
- @cache.should.equal({})
54
- end
55
-
56
- specify "should cache results if there is an empty query string" do
57
- request(:path=>'/?')
58
- @cache.should.equal('/index.html'=>@def_value)
59
- end
60
-
61
- specify "should not cache results if the request is not sucessful (status 200)" do
62
- request{|env| [404, {'Content-Type' => 'text/html'}, ['']]}
63
- @cache.should.equal({})
64
- request{|env| [500, {'Content-Type' => 'text/html'}, ['']]}
65
- @cache.should.equal({})
66
- request{|env| [302, {'Content-Type' => 'text/html'}, ['']]}
67
- @cache.should.equal({})
68
- end
69
-
70
- specify "should not cache results if the block returns nil or false" do
71
- request(:rc_block=>proc{false})
72
- @cache.should.equal({})
73
- request(:rc_block=>proc{nil})
74
- @cache.should.equal({})
75
- end
76
-
77
- specify "should cache results to path returned by block" do
78
- request(:rc_block=>proc{"1"})
79
- @cache.should.equal("1"=>@def_value)
80
- request(:rc_block=>proc{"2"})
81
- @cache.should.equal("1"=>@def_value, "2"=>@def_value)
82
- end
83
-
84
- specify "should pass the environment and response to the block" do
85
- e, r = nil, nil
86
- request(:rc_block=>proc{|env,res| e, r = env, res; nil})
87
- e['PATH_INFO'].should.equal @def_path
88
- e['REQUEST_METHOD'].should.equal 'GET'
89
- e['QUERY_STRING'].should.equal ''
90
- r.should.equal([200, {"Content-Type"=>"text/html"}, ["rack-response-cache"]])
91
- end
92
-
93
- specify "should unescape the path by default" do
94
- request(:path=>'/path%20with%20spaces')
95
- @cache.should.equal('/path with spaces.html'=>@def_value)
96
- request(:path=>'/path%3chref%3e')
97
- @cache.should.equal('/path with spaces.html'=>@def_value, '/path<href>.html'=>@def_value)
98
- end
99
-
100
- specify "should cache html, css, and xml responses by default" do
101
- request(:path=>'/a')
102
- @cache.should.equal('/a.html'=>@def_value)
103
- request(:path=>'/b', :headers=>{'CT'=>'text/xml'})
104
- @cache.should.equal('/a.html'=>@def_value, '/b.xml'=>@def_value)
105
- request(:path=>'/c', :headers=>{'CT'=>'text/css'})
106
- @cache.should.equal('/a.html'=>@def_value, '/b.xml'=>@def_value, '/c.css'=>@def_value)
107
- end
108
-
109
- specify "should cache responses by default with the extension added if not already present" do
110
- request(:path=>'/a.html')
111
- @cache.should.equal('/a.html'=>@def_value)
112
- request(:path=>'/b.xml', :headers=>{'CT'=>'text/xml'})
113
- @cache.should.equal('/a.html'=>@def_value, '/b.xml'=>@def_value)
114
- request(:path=>'/c.css', :headers=>{'CT'=>'text/css'})
115
- @cache.should.equal('/a.html'=>@def_value, '/b.xml'=>@def_value, '/c.css'=>@def_value)
116
- end
117
-
118
- specify "should not delete existing extensions" do
119
- request(:path=>'/d.css', :headers=>{'CT'=>'text/html'})
120
- @cache.should.equal('/d.css.html'=>@def_value)
121
- end
122
-
123
- specify "should cache html responses with empty basename to index.html by default" do
124
- request(:path=>'/')
125
- @cache.should.equal('/index.html'=>@def_value)
126
- request(:path=>'/blah/')
127
- @cache.should.equal('/index.html'=>@def_value, '/blah/index.html'=>@def_value)
128
- request(:path=>'/blah/2/')
129
- @cache.should.equal('/index.html'=>@def_value, '/blah/index.html'=>@def_value, '/blah/2/index.html'=>@def_value)
130
- end
131
-
132
- specify "should raise an error if a cache argument is not provided" do
133
- app = Rack::Builder.new{use Rack::ResponseCache; run lambda { |env| [200, {'Content-Type' => 'text/plain'}, Rack::Request.new(env).POST]}}
134
- proc{Rack::MockRequest.new(app).get('/')}.should.raise(ArgumentError)
135
- end
136
-
137
- end
@@ -1,35 +0,0 @@
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
@@ -1,35 +0,0 @@
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