rack-rack-contrib 0.9.1 → 0.9.2

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.
@@ -40,7 +40,9 @@ interface:
40
40
  absolute URLs.
41
41
  * Rack::Backstage - Returns content of specified file if it exists, which makes
42
42
  it convenient for putting up maintenance pages.
43
- * Rack::Format - Adds a format extension at the end of the URI when there is none, corresponding to the mime-type given in the Accept HTTP header.
43
+ * Rack::AcceptFormat - Adds a format extension at the end of the URI when there is none, corresponding to the mime-type given in the Accept HTTP header.
44
+ * Rack::HostMeta - Configures /host-meta using a block
45
+ * Rack::Cookies - Adds simple cookie jar hash to env
44
46
 
45
47
  === Use
46
48
 
@@ -7,7 +7,9 @@ module Rack
7
7
  end
8
8
  end
9
9
 
10
+ autoload :AcceptFormat, "rack/contrib/accept_format"
10
11
  autoload :BounceFavicon, "rack/contrib/bounce_favicon"
12
+ autoload :Cookies, "rack/contrib/cookies"
11
13
  autoload :CSSHTTPRequest, "rack/contrib/csshttprequest"
12
14
  autoload :Deflect, "rack/contrib/deflect"
13
15
  autoload :ETag, "rack/contrib/etag"
@@ -24,20 +24,22 @@ module Rack
24
24
  # MIT-License - Cyril Rohr
25
25
  #
26
26
  class AcceptFormat
27
- # Constants
28
- DEFAULT_EXTENSION = ".html"
29
27
 
30
- def initialize(app)
28
+ def initialize(app, default_extention = '.html')
29
+ @ext = default_extention.to_s.strip
30
+ @ext = ".#{@ext}" unless @ext[0] == ?.
31
31
  @app = app
32
32
  end
33
33
 
34
34
  def call(env)
35
35
  req = Rack::Request.new(env)
36
- unless req.path_info =~ /(.*)\.(.+)/
37
- accept = env['HTTP_ACCEPT'].scan(/[^;,\s]*\/[^;,\s]*/)[0] rescue ""
38
- extension = Rack::Mime::MIME_TYPES.invert[accept] || DEFAULT_EXTENSION
36
+
37
+ if ::File.extname(req.path_info).empty?
38
+ accept = env['HTTP_ACCEPT'].to_s.scan(/[^;,\s]*\/[^;,\s]*/)[0].to_s
39
+ extension = Rack::Mime::MIME_TYPES.invert[accept] || @ext
39
40
  req.path_info = req.path_info+"#{extension}"
40
41
  end
42
+
41
43
  @app.call(env)
42
44
  end
43
45
  end
@@ -26,7 +26,7 @@ module Rack
26
26
  end
27
27
 
28
28
  def encode(response, assembled_body="")
29
- response.each { |s| assembled_body << s } # call down the stack
29
+ response.each { |s| assembled_body << s.to_s } # call down the stack
30
30
  return ::CSSHTTPRequest.encode(assembled_body)
31
31
  end
32
32
 
@@ -33,7 +33,7 @@ module Rack
33
33
  # is returned as a full string.
34
34
  #
35
35
  def pad(callback, response, body = "")
36
- response.each{ |s| body << s }
36
+ response.each{ |s| body << s.to_s }
37
37
  "#{callback}(#{body})"
38
38
  end
39
39
 
@@ -4,45 +4,46 @@ module Rack
4
4
  [Exception, '/error/internal']
5
5
  ]
6
6
 
7
- ROUTE_EXCEPTIONS_PATH_INFO = 'rack.route_exceptions.path_info'.freeze
8
- ROUTE_EXCEPTIONS_EXCEPTION = 'rack.route_exceptions.exception'.freeze
9
- ROUTE_EXCEPTIONS_RESPONSE = 'rack.route_exceptions.response'.freeze
7
+ PATH_INFO = 'rack.route_exceptions.path_info'.freeze
8
+ EXCEPTION = 'rack.route_exceptions.exception'.freeze
9
+ RETURNED = 'rack.route_exceptions.returned'.freeze
10
+
11
+ class << self
12
+ def route(exception, to)
13
+ ROUTES.delete_if{|k,v| k == exception }
14
+ ROUTES << [exception, to]
15
+ end
16
+
17
+ alias []= route
18
+ end
10
19
 
11
20
  def initialize(app)
12
21
  @app = app
13
22
  end
14
23
 
15
24
  def call(env, try_again = true)
16
- status, header, body = response = @app.call(env)
17
-
18
- response
25
+ returned = @app.call(env)
19
26
  rescue Exception => exception
20
27
  raise(exception) unless try_again
21
28
 
22
29
  ROUTES.each do |klass, to|
23
30
  next unless klass === exception
24
- return route(to, env, response, exception)
31
+ return route(to, env, returned, exception)
25
32
  end
26
33
 
27
34
  raise(exception)
28
35
  end
29
36
 
30
- def route(to, env, response, exception)
31
- hash = {
32
- ROUTE_EXCEPTIONS_PATH_INFO => env['PATH_INFO'],
33
- ROUTE_EXCEPTIONS_EXCEPTION => exception,
34
- ROUTE_EXCEPTIONS_RESPONSE => response
35
- }
36
- env.merge!(hash)
37
+ def route(to, env, returned, exception)
38
+ env.merge!(
39
+ PATH_INFO => env['PATH_INFO'],
40
+ EXCEPTION => exception,
41
+ RETURNED => returned
42
+ )
37
43
 
38
44
  env['PATH_INFO'] = to
39
45
 
40
46
  call(env, try_again = false)
41
47
  end
42
-
43
- def self.route(exception, to)
44
- ROUTES.delete_if{|k,v| k == exception }
45
- ROUTES << [exception, to]
46
- end
47
48
  end
48
49
  end
@@ -3,7 +3,7 @@ Gem::Specification.new do |s|
3
3
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
4
4
 
5
5
  s.name = 'rack-contrib'
6
- s.version = '0.9.1'
6
+ s.version = '0.9.2'
7
7
  s.date = '2009-03-07'
8
8
 
9
9
  s.description = "Contributed Rack Middleware and Utilities"
@@ -74,7 +74,7 @@ Gem::Specification.new do |s|
74
74
  s.test_files = s.files.select {|path| path =~ /^test\/spec_.*\.rb/}
75
75
 
76
76
  s.extra_rdoc_files = %w[README.rdoc COPYING]
77
- s.add_dependency 'rack', '~> 0.9.1'
77
+ s.add_dependency 'rack', '>= 0.9.1'
78
78
  s.add_dependency 'test-spec', '~> 0.9.0'
79
79
  s.add_development_dependency 'tmail', '>= 1.2'
80
80
  s.add_development_dependency 'json', '>= 1.1'
@@ -4,16 +4,41 @@ require 'rack/contrib/accept_format'
4
4
  require 'rack/mime'
5
5
 
6
6
  context "Rack::AcceptFormat" do
7
+ app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, env['PATH_INFO']] }
8
+
7
9
  specify "should do nothing when a format extension is already provided" do
8
- app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, env['PATH_INFO']] }
9
10
  request = Rack::MockRequest.env_for("/resource.json")
10
11
  body = Rack::AcceptFormat.new(app).call(request).last
11
12
  body.should == "/resource.json"
12
13
  end
13
14
 
15
+ context "default extention" do
16
+ specify "should allow custom default" do
17
+ request = Rack::MockRequest.env_for("/resource")
18
+ body = Rack::AcceptFormat.new(app, '.xml').call(request).last
19
+ body.should == "/resource.xml"
20
+ end
21
+
22
+ specify "should default to html" do
23
+ request = Rack::MockRequest.env_for("/resource")
24
+ body = Rack::AcceptFormat.new(app).call(request).last
25
+ body.should == "/resource.html"
26
+ end
27
+
28
+ specify "should notmalize custom extention" do
29
+ request = Rack::MockRequest.env_for("/resource")
30
+
31
+ body = Rack::AcceptFormat.new(app,'xml').call(request).last #no dot prefix
32
+ body.should == "/resource.xml"
33
+
34
+ body = Rack::AcceptFormat.new(app, :xml).call(request).last
35
+ body.should == "/resource.xml"
36
+ end
37
+ end
38
+
14
39
  context "there is no format extension" do
15
40
  Rack::Mime::MIME_TYPES.clear
16
- app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, env['PATH_INFO']] }
41
+
17
42
  def mime(ext, type)
18
43
  ext = ".#{ext}" unless ext.to_s[0] == ?.
19
44
  Rack::Mime::MIME_TYPES[ext.to_s] = type
@@ -22,13 +47,13 @@ context "Rack::AcceptFormat" do
22
47
  specify "should add the default extension if no Accept header" do
23
48
  request = Rack::MockRequest.env_for("/resource")
24
49
  body = Rack::AcceptFormat.new(app).call(request).last
25
- body.should == "/resource#{Rack::AcceptFormat::DEFAULT_EXTENSION}"
50
+ body.should == "/resource.html"
26
51
  end
27
52
 
28
53
  specify "should add the default extension if the Accept header is not registered in the Mime::Types" do
29
54
  request = Rack::MockRequest.env_for("/resource", 'HTTP_ACCEPT' => 'application/json;q=1.0, text/html;q=0.8, */*;q=0.1')
30
55
  body = Rack::AcceptFormat.new(app).call(request).last
31
- body.should == "/resource#{Rack::AcceptFormat::DEFAULT_EXTENSION}"
56
+ body.should == "/resource.html"
32
57
  end
33
58
 
34
59
  specify "should add the correct extension if the Accept header is registered in the Mime::Types" do
@@ -38,4 +63,10 @@ context "Rack::AcceptFormat" do
38
63
  body.should == "/resource.json"
39
64
  end
40
65
  end
66
+
67
+ specify "shouldn't confuse extention when there are dots in path" do
68
+ request = Rack::MockRequest.env_for("/parent.resource/resource")
69
+ body = Rack::AcceptFormat.new(app, '.html').call(request).last
70
+ body.should == "/parent.resource/resource.html"
71
+ end
41
72
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-rack-contrib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - rack-devel
@@ -18,7 +18,7 @@ dependencies:
18
18
  version_requirement:
19
19
  version_requirements: !ruby/object:Gem::Requirement
20
20
  requirements:
21
- - - ~>
21
+ - - ">="
22
22
  - !ruby/object:Gem::Version
23
23
  version: 0.9.1
24
24
  version: