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,86 +0,0 @@
1
- require 'test/spec'
2
- require 'rack/mock'
3
- require 'rack/contrib/sendfile'
4
-
5
- context "Rack::File" do
6
- specify "should respond to #to_path" do
7
- Rack::File.new(Dir.pwd).should.respond_to :to_path
8
- end
9
- end
10
-
11
- context "Rack::Sendfile" do
12
- def sendfile_body
13
- res = ['Hello World']
14
- def res.to_path ; "/tmp/hello.txt" ; end
15
- res
16
- end
17
-
18
- def simple_app(body=sendfile_body)
19
- lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
20
- end
21
-
22
- def sendfile_app(body=sendfile_body)
23
- Rack::Sendfile.new(simple_app(body))
24
- end
25
-
26
- setup do
27
- @request = Rack::MockRequest.new(sendfile_app)
28
- end
29
-
30
- def request(headers={})
31
- yield @request.get('/', headers)
32
- end
33
-
34
- specify "does nothing when no X-Sendfile-Type header present" do
35
- request do |response|
36
- response.should.be.ok
37
- response.body.should.equal 'Hello World'
38
- response.headers.should.not.include 'X-Sendfile'
39
- end
40
- end
41
-
42
- specify "sets X-Sendfile response header and discards body" do
43
- request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
44
- response.should.be.ok
45
- response.body.should.be.empty
46
- response.headers['X-Sendfile'].should.equal '/tmp/hello.txt'
47
- end
48
- end
49
-
50
- specify "sets X-Lighttpd-Send-File response header and discards body" do
51
- request 'HTTP_X_SENDFILE_TYPE' => 'X-Lighttpd-Send-File' do |response|
52
- response.should.be.ok
53
- response.body.should.be.empty
54
- response.headers['X-Lighttpd-Send-File'].should.equal '/tmp/hello.txt'
55
- end
56
- end
57
-
58
- specify "sets X-Accel-Redirect response header and discards body" do
59
- headers = {
60
- 'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect',
61
- 'HTTP_X_ACCEL_MAPPING' => '/tmp/=/foo/bar/'
62
- }
63
- request headers do |response|
64
- response.should.be.ok
65
- response.body.should.be.empty
66
- response.headers['X-Accel-Redirect'].should.equal '/foo/bar/hello.txt'
67
- end
68
- end
69
-
70
- specify 'writes to rack.error when no X-Accel-Mapping is specified' do
71
- request 'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect' do |response|
72
- response.should.be.ok
73
- response.body.should.equal 'Hello World'
74
- response.headers.should.not.include 'X-Accel-Redirect'
75
- response.errors.should.include 'X-Accel-Mapping'
76
- end
77
- end
78
-
79
- specify 'does nothing when body does not respond to #to_path' do
80
- @request = Rack::MockRequest.new(sendfile_app(['Not a file...']))
81
- request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
82
- response.body.should.equal 'Not a file...'
83
- response.headers.should.not.include 'X-Sendfile'
84
- end
85
- end
86
- end
@@ -1,95 +0,0 @@
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
@@ -1,104 +0,0 @@
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 round max-age if duration is part of a year" do
63
- one_week_duration_app_request
64
- res = @request.get("/statics/test")
65
- res.should.be.ok
66
- res.body.should =~ /rubyrack/
67
- res.headers['Cache-Control'].should == "max-age=606461, public"
68
- end
69
-
70
- it "should return 404s if requested with version number but versioning is disabled" do
71
- configured_app_request
72
- res = @request.get("/statics/test-0.0.1")
73
- res.should.be.not_found
74
- end
75
-
76
- it "should serve files with plain headers when * is added to the directory name" do
77
- configured_app_request
78
- res = @request.get("/documents/test")
79
- res.should.be.ok
80
- res.body.should =~ /nocache/
81
- next_next_year = Time.now().year + 2
82
- res.headers['Expires'].should.not =~ Regexp.new("#{next_next_year}")
83
- end
84
-
85
- def default_app_request
86
- @options = {:urls => ["/statics"], :root => @root}
87
- request
88
- end
89
-
90
- def one_week_duration_app_request
91
- @options = {:urls => ["/statics"], :root => @root, :duration => 1.fdiv(52)}
92
- request
93
- end
94
-
95
- def configured_app_request
96
- @options = {:urls => ["/statics", "/documents*"], :root => @root, :versioning => false, :duration => 2}
97
- request
98
- end
99
-
100
- def request
101
- @request = Rack::MockRequest.new(Rack::StaticCache.new(DummyApp.new, @options))
102
- end
103
-
104
- end
@@ -1,56 +0,0 @@
1
- require 'test/spec'
2
-
3
- require 'rack'
4
- require 'rack/contrib/try_static'
5
- require 'rack/mock'
6
-
7
- def build_options(opts)
8
- {
9
- :urls => %w[/],
10
- :root => ::File.expand_path(::File.dirname(__FILE__)),
11
- }.merge(opts)
12
- end
13
-
14
- def request(options = {})
15
- @request =
16
- Rack::MockRequest.new(
17
- Rack::TryStatic.new(
18
- lambda { |_| [200, {}, ["Hello World"]]},
19
- options))
20
- end
21
-
22
- describe "Rack::TryStatic" do
23
- context 'when file cannot be found' do
24
- it 'should call call app' do
25
- res = request(build_options(:try => ['html'])).get('/documents')
26
- res.should.be.ok
27
- res.body.should == "Hello World"
28
- end
29
- end
30
-
31
- context 'when file can be found' do
32
- it 'should serve first found' do
33
- res = request(build_options(:try => ['.html', '/index.html', '/index.htm'])).get('/documents')
34
- res.should.be.ok
35
- res.body.strip.should == "index.html"
36
- end
37
- end
38
-
39
- context 'when path_info maps directly to file' do
40
- it 'should serve existing' do
41
- res = request(build_options(:try => ['/index.html'])).get('/documents/existing.html')
42
- res.should.be.ok
43
- res.body.strip.should == "existing.html"
44
- end
45
- end
46
-
47
- context 'when sharing options' do
48
- it 'should not mutate given options' do
49
- org_options = build_options :try => ['/index.html']
50
- given_options = org_options.dup
51
- request(given_options).get('/documents').should.be.ok
52
- request(given_options).get('/documents').should.be.ok
53
- given_options.should == org_options
54
- end
55
- end
56
- end
@@ -1 +0,0 @@
1
- rubyrack