rack 1.4.1 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rack might be problematic. Click here for more details.

Files changed (81) hide show
  1. data/COPYING +1 -1
  2. data/KNOWN-ISSUES +9 -0
  3. data/README.rdoc +72 -7
  4. data/Rakefile +18 -11
  5. data/SPEC +3 -1
  6. data/contrib/rack.png +0 -0
  7. data/contrib/rack.svg +150 -0
  8. data/contrib/rdoc.css +412 -0
  9. data/lib/rack/auth/basic.rb +1 -1
  10. data/lib/rack/auth/digest/nonce.rb +1 -1
  11. data/lib/rack/backports/uri/common_18.rb +14 -28
  12. data/lib/rack/backports/uri/common_192.rb +14 -17
  13. data/lib/rack/backports/uri/common_193.rb +29 -0
  14. data/lib/rack/body_proxy.rb +10 -0
  15. data/lib/rack/builder.rb +1 -1
  16. data/lib/rack/cascade.rb +11 -0
  17. data/lib/rack/commonlogger.rb +18 -5
  18. data/lib/rack/deflater.rb +5 -1
  19. data/lib/rack/directory.rb +1 -1
  20. data/lib/rack/etag.rb +6 -3
  21. data/lib/rack/file.rb +13 -4
  22. data/lib/rack/head.rb +1 -0
  23. data/lib/rack/lint.rb +3 -1
  24. data/lib/rack/lock.rb +3 -4
  25. data/lib/rack/mime.rb +1 -1
  26. data/lib/rack/mock.rb +3 -2
  27. data/lib/rack/multipart.rb +2 -2
  28. data/lib/rack/multipart/parser.rb +6 -4
  29. data/lib/rack/reloader.rb +1 -1
  30. data/lib/rack/request.rb +2 -4
  31. data/lib/rack/response.rb +2 -1
  32. data/lib/rack/server.rb +28 -2
  33. data/lib/rack/session/abstract/id.rb +5 -0
  34. data/lib/rack/session/cookie.rb +9 -0
  35. data/lib/rack/static.rb +90 -8
  36. data/lib/rack/utils.rb +17 -10
  37. data/rack.gemspec +3 -3
  38. data/test/builder/line.ru +1 -0
  39. data/test/cgi/assets/folder/test.js +1 -0
  40. data/test/cgi/assets/fonts/font.eot +1 -0
  41. data/test/cgi/assets/images/image.png +1 -0
  42. data/test/cgi/assets/index.html +1 -0
  43. data/test/cgi/assets/javascripts/app.js +1 -0
  44. data/test/cgi/assets/stylesheets/app.css +1 -0
  45. data/test/spec_auth_basic.rb +8 -0
  46. data/test/spec_auth_digest.rb +14 -0
  47. data/test/spec_body_proxy.rb +4 -0
  48. data/test/spec_builder.rb +7 -1
  49. data/test/spec_cascade.rb +8 -0
  50. data/test/spec_chunked.rb +6 -6
  51. data/test/spec_config.rb +0 -1
  52. data/test/spec_content_length.rb +26 -13
  53. data/test/spec_content_type.rb +15 -5
  54. data/test/spec_deflater.rb +35 -17
  55. data/test/spec_directory.rb +20 -1
  56. data/test/spec_etag.rb +29 -13
  57. data/test/spec_file.rb +42 -25
  58. data/test/spec_head.rb +25 -7
  59. data/test/spec_lobster.rb +20 -5
  60. data/test/spec_lock.rb +46 -21
  61. data/test/spec_logger.rb +2 -7
  62. data/test/spec_methodoverride.rb +21 -22
  63. data/test/spec_mock.rb +12 -7
  64. data/test/spec_multipart.rb +29 -0
  65. data/test/spec_nulllogger.rb +13 -2
  66. data/test/spec_recursive.rb +12 -9
  67. data/test/spec_request.rb +2 -2
  68. data/test/spec_response.rb +30 -0
  69. data/test/spec_runtime.rb +15 -5
  70. data/test/spec_sendfile.rb +11 -8
  71. data/test/spec_server.rb +47 -0
  72. data/test/spec_session_cookie.rb +68 -1
  73. data/test/spec_session_memcache.rb +10 -8
  74. data/test/spec_session_pool.rb +13 -10
  75. data/test/spec_showexceptions.rb +9 -4
  76. data/test/spec_showstatus.rb +10 -5
  77. data/test/spec_static.rb +85 -9
  78. data/test/spec_urlmap.rb +10 -10
  79. data/test/spec_utils.rb +14 -1
  80. data/test/static/another/index.html +1 -0
  81. metadata +21 -8
@@ -1,4 +1,5 @@
1
1
  require 'rack/session/cookie'
2
+ require 'rack/lint'
2
3
  require 'rack/mock'
3
4
 
4
5
  describe Rack::Session::Cookie do
@@ -9,7 +10,7 @@ describe Rack::Session::Cookie do
9
10
  hash.delete("session_id")
10
11
  Rack::Response.new(hash.inspect).to_a
11
12
  end
12
-
13
+
13
14
  session_id = lambda do |env|
14
15
  Rack::Response.new(env["rack.session"].to_hash.inspect).to_a
15
16
  end
@@ -24,6 +25,50 @@ describe Rack::Session::Cookie do
24
25
  Rack::Response.new("Nothing").to_a
25
26
  end
26
27
 
28
+ renewer = lambda do |env|
29
+ env["rack.session.options"][:renew] = true
30
+ Rack::Response.new("Nothing").to_a
31
+ end
32
+
33
+ only_session_id = lambda do |env|
34
+ Rack::Response.new(env["rack.session"]["session_id"].to_s).to_a
35
+ end
36
+
37
+ bigcookie = lambda do |env|
38
+ env["rack.session"]["cookie"] = "big" * 3000
39
+ Rack::Response.new(env["rack.session"].inspect).to_a
40
+ end
41
+
42
+ destroy_session = lambda do |env|
43
+ env["rack.session"].destroy
44
+ Rack::Response.new("Nothing").to_a
45
+ end
46
+
47
+ def response_for(options={})
48
+ request_options = options.fetch(:request, {})
49
+ cookie = if options[:cookie].is_a?(Rack::Response)
50
+ options[:cookie]["Set-Cookie"]
51
+ else
52
+ options[:cookie]
53
+ end
54
+ request_options["HTTP_COOKIE"] = cookie || ""
55
+
56
+ app_with_cookie = Rack::Session::Cookie.new(*options[:app])
57
+ app_with_cookie = Rack::Lint.new(app_with_cookie)
58
+ Rack::MockRequest.new(app_with_cookie).get("/", request_options)
59
+ end
60
+
61
+ before do
62
+ @warnings = warnings = []
63
+ Rack::Session::Cookie.class_eval do
64
+ define_method(:warn) { |m| warnings << m }
65
+ end
66
+ end
67
+
68
+ after do
69
+ Rack::Session::Cookie.class_eval { remove_method :warn }
70
+ end
71
+
27
72
  describe 'Base64' do
28
73
  it 'uses base64 to encode' do
29
74
  coder = Rack::Session::Cookie::Base64.new
@@ -57,6 +102,14 @@ describe Rack::Session::Cookie do
57
102
  end
58
103
  end
59
104
 
105
+ it "warns if no secret is given" do
106
+ cookie = Rack::Session::Cookie.new(incrementor)
107
+ @warnings.first.should =~ /no secret/i
108
+ @warnings.clear
109
+ cookie = Rack::Session::Cookie.new(incrementor, :secret => 'abc')
110
+ @warnings.should.be.empty?
111
+ end
112
+
60
113
  it 'uses a coder' do
61
114
  identity = Class.new {
62
115
  attr_reader :calls
@@ -291,4 +344,18 @@ describe Rack::Session::Cookie do
291
344
  res = Rack::MockRequest.new(app).get("/", 'rack.session' => {:foo => 'bar'})
292
345
  res.body.should.match(/foo/)
293
346
  end
347
+
348
+ it "allows modifying session data with session data from middleware in front" do
349
+ request = { 'rack.session' => { :foo => 'bar' }}
350
+ response = response_for(:app => incrementor, :request => request)
351
+ response.body.should.match(/counter/)
352
+ response.body.should.match(/foo/)
353
+ end
354
+
355
+ it "allows modifying session data with session data from middleware in front" do
356
+ request = { 'rack.session' => { :foo => 'bar' }}
357
+ response = response_for(:app => incrementor, :request => request)
358
+ response.body.should.match(/counter/)
359
+ response.body.should.match(/foo/)
360
+ end
294
361
  end
@@ -1,5 +1,6 @@
1
1
  begin
2
2
  require 'rack/session/memcache'
3
+ require 'rack/lint'
3
4
  require 'rack/mock'
4
5
  require 'thread'
5
6
 
@@ -11,22 +12,23 @@ begin
11
12
  env["rack.session"]["counter"] += 1
12
13
  Rack::Response.new(env["rack.session"].inspect).to_a
13
14
  end
14
- drop_session = proc do |env|
15
+ drop_session = Rack::Lint.new(proc do |env|
15
16
  env['rack.session.options'][:drop] = true
16
17
  incrementor.call(env)
17
- end
18
- renew_session = proc do |env|
18
+ end)
19
+ renew_session = Rack::Lint.new(proc do |env|
19
20
  env['rack.session.options'][:renew] = true
20
21
  incrementor.call(env)
21
- end
22
- defer_session = proc do |env|
22
+ end)
23
+ defer_session = Rack::Lint.new(proc do |env|
23
24
  env['rack.session.options'][:defer] = true
24
25
  incrementor.call(env)
25
- end
26
- skip_session = proc do |env|
26
+ end)
27
+ skip_session = Rack::Lint.new(proc do |env|
27
28
  env['rack.session.options'][:skip] = true
28
29
  incrementor.call(env)
29
- end
30
+ end)
31
+ incrementor = Rack::Lint.new(incrementor)
30
32
 
31
33
  # test memcache connection
32
34
  Rack::Session::Memcache.new(incrementor)
@@ -1,4 +1,5 @@
1
1
  require 'thread'
2
+ require 'rack/lint'
2
3
  require 'rack/mock'
3
4
  require 'rack/session/pool'
4
5
 
@@ -12,28 +13,30 @@ describe Rack::Session::Pool do
12
13
  Rack::Response.new(env["rack.session"].inspect).to_a
13
14
  end
14
15
 
15
- session_id = lambda do |env|
16
+ session_id = Rack::Lint.new(lambda do |env|
16
17
  Rack::Response.new(env["rack.session"].inspect).to_a
17
- end
18
+ end)
18
19
 
19
- nothing = lambda do |env|
20
+ nothing = Rack::Lint.new(lambda do |env|
20
21
  Rack::Response.new("Nothing").to_a
21
- end
22
+ end)
22
23
 
23
- drop_session = lambda do |env|
24
+ drop_session = Rack::Lint.new(lambda do |env|
24
25
  env['rack.session.options'][:drop] = true
25
26
  incrementor.call(env)
26
- end
27
+ end)
27
28
 
28
- renew_session = lambda do |env|
29
+ renew_session = Rack::Lint.new(lambda do |env|
29
30
  env['rack.session.options'][:renew] = true
30
31
  incrementor.call(env)
31
- end
32
+ end)
32
33
 
33
- defer_session = lambda do |env|
34
+ defer_session = Rack::Lint.new(lambda do |env|
34
35
  env['rack.session.options'][:defer] = true
35
36
  incrementor.call(env)
36
- end
37
+ end)
38
+
39
+ incrementor = Rack::Lint.new(incrementor)
37
40
 
38
41
  it "creates a new cookie" do
39
42
  pool = Rack::Session::Pool.new(incrementor)
@@ -1,12 +1,17 @@
1
1
  require 'rack/showexceptions'
2
+ require 'rack/lint'
2
3
  require 'rack/mock'
3
4
 
4
5
  describe Rack::ShowExceptions do
6
+ def show_exceptions(app)
7
+ Rack::Lint.new Rack::ShowExceptions.new(app)
8
+ end
9
+
5
10
  it "catches exceptions" do
6
11
  res = nil
7
12
 
8
13
  req = Rack::MockRequest.new(
9
- Rack::ShowExceptions.new(
14
+ show_exceptions(
10
15
  lambda{|env| raise RuntimeError }
11
16
  ))
12
17
 
@@ -25,7 +30,7 @@ describe Rack::ShowExceptions do
25
30
  res = nil
26
31
 
27
32
  req = Rack::MockRequest.new(
28
- Rack::ShowExceptions.new(
33
+ show_exceptions(
29
34
  lambda{|env| raise RuntimeError, "It was never supposed to work" }
30
35
  ))
31
36
 
@@ -46,7 +51,7 @@ describe Rack::ShowExceptions do
46
51
  res = nil
47
52
 
48
53
  req = Rack::MockRequest.new(
49
- Rack::ShowExceptions.new(
54
+ show_exceptions(
50
55
  lambda{|env| raise RuntimeError, "It was never supposed to work" }
51
56
  ))
52
57
 
@@ -68,7 +73,7 @@ describe Rack::ShowExceptions do
68
73
  res = nil
69
74
 
70
75
  req = Rack::MockRequest.new(
71
- Rack::ShowExceptions.new(
76
+ show_exceptions(
72
77
  lambda{|env| raise RuntimeError, "", [] }
73
78
  )
74
79
  )
@@ -1,10 +1,15 @@
1
1
  require 'rack/showstatus'
2
+ require 'rack/lint'
2
3
  require 'rack/mock'
3
4
 
4
5
  describe Rack::ShowStatus do
6
+ def show_status(app)
7
+ Rack::Lint.new Rack::ShowStatus.new(app)
8
+ end
9
+
5
10
  should "provide a default status message" do
6
11
  req = Rack::MockRequest.new(
7
- Rack::ShowStatus.new(lambda{|env|
12
+ show_status(lambda{|env|
8
13
  [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []]
9
14
  }))
10
15
 
@@ -19,7 +24,7 @@ describe Rack::ShowStatus do
19
24
 
20
25
  should "let the app provide additional information" do
21
26
  req = Rack::MockRequest.new(
22
- Rack::ShowStatus.new(
27
+ show_status(
23
28
  lambda{|env|
24
29
  env["rack.showstatus.detail"] = "gone too meta."
25
30
  [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []]
@@ -37,7 +42,7 @@ describe Rack::ShowStatus do
37
42
 
38
43
  should "not replace existing messages" do
39
44
  req = Rack::MockRequest.new(
40
- Rack::ShowStatus.new(
45
+ show_status(
41
46
  lambda{|env|
42
47
  [404, {"Content-Type" => "text/plain", "Content-Length" => "4"}, ["foo!"]]
43
48
  }))
@@ -52,7 +57,7 @@ describe Rack::ShowStatus do
52
57
  headers = {"WWW-Authenticate" => "Basic blah"}
53
58
 
54
59
  req = Rack::MockRequest.new(
55
- Rack::ShowStatus.new(lambda{|env| [401, headers, []] }))
60
+ show_status(lambda{|env| [401, headers, []] }))
56
61
  res = req.get("/", :lint => true)
57
62
 
58
63
  res["WWW-Authenticate"].should.equal("Basic blah")
@@ -60,7 +65,7 @@ describe Rack::ShowStatus do
60
65
 
61
66
  should "replace existing messages if there is detail" do
62
67
  req = Rack::MockRequest.new(
63
- Rack::ShowStatus.new(
68
+ show_status(
64
69
  lambda{|env|
65
70
  env["rack.showstatus.detail"] = "gone too meta."
66
71
  [404, {"Content-Type" => "text/plain", "Content-Length" => "4"}, ["foo!"]]
@@ -1,22 +1,27 @@
1
1
  require 'rack/static'
2
+ require 'rack/lint'
2
3
  require 'rack/mock'
3
4
 
4
5
  class DummyApp
5
6
  def call(env)
6
- [200, {}, ["Hello World"]]
7
+ [200, {"Content-Type" => "text/plain"}, ["Hello World"]]
7
8
  end
8
9
  end
9
10
 
10
11
  describe Rack::Static do
12
+ def static(app, *args)
13
+ Rack::Lint.new Rack::Static.new(app, *args)
14
+ end
15
+
11
16
  root = File.expand_path(File.dirname(__FILE__))
12
17
 
13
18
  OPTIONS = {:urls => ["/cgi"], :root => root}
14
- STATIC_OPTIONS = {:urls => [""], :root => root, :index => 'static/index.html'}
19
+ STATIC_OPTIONS = {:urls => [""], :root => "#{root}/static", :index => 'index.html'}
15
20
  HASH_OPTIONS = {:urls => {"/cgi/sekret" => 'cgi/test'}, :root => root}
16
21
 
17
- @request = Rack::MockRequest.new(Rack::Static.new(DummyApp.new, OPTIONS))
18
- @static_request = Rack::MockRequest.new(Rack::Static.new(DummyApp.new, STATIC_OPTIONS))
19
- @hash_request = Rack::MockRequest.new(Rack::Static.new(DummyApp.new, HASH_OPTIONS))
22
+ @request = Rack::MockRequest.new(static(DummyApp.new, OPTIONS))
23
+ @static_request = Rack::MockRequest.new(static(DummyApp.new, STATIC_OPTIONS))
24
+ @hash_request = Rack::MockRequest.new(static(DummyApp.new, HASH_OPTIONS))
20
25
 
21
26
  it "serves files" do
22
27
  res = @request.get("/cgi/test")
@@ -35,12 +40,19 @@ describe Rack::Static do
35
40
  res.body.should == "Hello World"
36
41
  end
37
42
 
38
- it "calls index file when requesting root" do
43
+ it "calls index file when requesting root in the given folder" do
39
44
  res = @static_request.get("/")
40
45
  res.should.be.ok
41
46
  res.body.should =~ /index!/
47
+
48
+ res = @static_request.get("/other/")
49
+ res.should.be.not_found
50
+
51
+ res = @static_request.get("/another/")
52
+ res.should.be.ok
53
+ res.body.should =~ /another index!/
42
54
  end
43
-
55
+
44
56
  it "doesn't call index file if :index option was omitted" do
45
57
  res = @request.get("/")
46
58
  res.body.should == "Hello World"
@@ -58,12 +70,76 @@ describe Rack::Static do
58
70
  res.body.should == "Hello World"
59
71
  end
60
72
 
61
- it "supports serving fixed cache-control" do
73
+ it "supports serving fixed cache-control (legacy option)" do
62
74
  opts = OPTIONS.merge(:cache_control => 'public')
63
- request = Rack::MockRequest.new(Rack::Static.new(DummyApp.new, opts))
75
+ request = Rack::MockRequest.new(static(DummyApp.new, opts))
64
76
  res = request.get("/cgi/test")
65
77
  res.should.be.ok
66
78
  res.headers['Cache-Control'].should == 'public'
67
79
  end
68
80
 
81
+ HEADER_OPTIONS = {:urls => ["/cgi"], :root => root, :header_rules => [
82
+ [:all, {'Cache-Control' => 'public, max-age=100'}],
83
+ [:fonts, {'Cache-Control' => 'public, max-age=200'}],
84
+ [%w(png jpg), {'Cache-Control' => 'public, max-age=300'}],
85
+ ['/cgi/assets/folder/', {'Cache-Control' => 'public, max-age=400'}],
86
+ ['cgi/assets/javascripts', {'Cache-Control' => 'public, max-age=500'}],
87
+ [/\.(css|erb)\z/, {'Cache-Control' => 'public, max-age=600'}]
88
+ ]}
89
+ @header_request = Rack::MockRequest.new(static(DummyApp.new, HEADER_OPTIONS))
90
+
91
+ it "supports header rule :all" do
92
+ # Headers for all files via :all shortcut
93
+ res = @header_request.get('/cgi/assets/index.html')
94
+ res.should.be.ok
95
+ res.headers['Cache-Control'].should == 'public, max-age=100'
96
+ end
97
+
98
+ it "supports header rule :fonts" do
99
+ # Headers for web fonts via :fonts shortcut
100
+ res = @header_request.get('/cgi/assets/fonts/font.eot')
101
+ res.should.be.ok
102
+ res.headers['Cache-Control'].should == 'public, max-age=200'
103
+ end
104
+
105
+ it "supports file extension header rules provided as an Array" do
106
+ # Headers for file extensions via array
107
+ res = @header_request.get('/cgi/assets/images/image.png')
108
+ res.should.be.ok
109
+ res.headers['Cache-Control'].should == 'public, max-age=300'
110
+ end
111
+
112
+ it "supports folder rules provided as a String" do
113
+ # Headers for files in folder via string
114
+ res = @header_request.get('/cgi/assets/folder/test.js')
115
+ res.should.be.ok
116
+ res.headers['Cache-Control'].should == 'public, max-age=400'
117
+ end
118
+
119
+ it "supports folder header rules provided as a String not starting with a slash" do
120
+ res = @header_request.get('/cgi/assets/javascripts/app.js')
121
+ res.should.be.ok
122
+ res.headers['Cache-Control'].should == 'public, max-age=500'
123
+ end
124
+
125
+ it "supports flexible header rules provided as Regexp" do
126
+ # Flexible Headers via Regexp
127
+ res = @header_request.get('/cgi/assets/stylesheets/app.css')
128
+ res.should.be.ok
129
+ res.headers['Cache-Control'].should == 'public, max-age=600'
130
+ end
131
+
132
+ it "prioritizes header rules over fixed cache-control setting (legacy option)" do
133
+ opts = OPTIONS.merge(
134
+ :cache_control => 'public, max-age=24',
135
+ :header_rules => [
136
+ [:all, {'Cache-Control' => 'public, max-age=42'}]
137
+ ])
138
+
139
+ request = Rack::MockRequest.new(static(DummyApp.new, opts))
140
+ res = request.get("/cgi/test")
141
+ res.should.be.ok
142
+ res.headers['Cache-Control'].should == 'public, max-age=42'
143
+ end
144
+
69
145
  end
@@ -10,11 +10,11 @@ describe Rack::URLMap do
10
10
  'Content-Type' => 'text/plain'
11
11
  }, [""]]
12
12
  }
13
- map = Rack::URLMap.new({
13
+ map = Rack::Lint.new(Rack::URLMap.new({
14
14
  'http://foo.org/bar' => app,
15
15
  '/foo' => app,
16
16
  '/foo/bar' => app
17
- })
17
+ }))
18
18
 
19
19
  res = Rack::MockRequest.new(map).get("/")
20
20
  res.should.be.not_found
@@ -66,7 +66,7 @@ describe Rack::URLMap do
66
66
 
67
67
 
68
68
  it "dispatches hosts correctly" do
69
- map = Rack::URLMap.new("http://foo.org/" => lambda { |env|
69
+ map = Rack::Lint.new(Rack::URLMap.new("http://foo.org/" => lambda { |env|
70
70
  [200,
71
71
  { "Content-Type" => "text/plain",
72
72
  "X-Position" => "foo.org",
@@ -90,7 +90,7 @@ describe Rack::URLMap do
90
90
  "X-Position" => "default.org",
91
91
  "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
92
92
  }, [""]]}
93
- )
93
+ ))
94
94
 
95
95
  res = Rack::MockRequest.new(map).get("/")
96
96
  res.should.be.ok
@@ -124,7 +124,7 @@ describe Rack::URLMap do
124
124
  end
125
125
 
126
126
  should "be nestable" do
127
- map = Rack::URLMap.new("/foo" =>
127
+ map = Rack::Lint.new(Rack::URLMap.new("/foo" =>
128
128
  Rack::URLMap.new("/bar" =>
129
129
  Rack::URLMap.new("/quux" => lambda { |env|
130
130
  [200,
@@ -133,7 +133,7 @@ describe Rack::URLMap do
133
133
  "X-PathInfo" => env["PATH_INFO"],
134
134
  "X-ScriptName" => env["SCRIPT_NAME"],
135
135
  }, [""]]}
136
- )))
136
+ ))))
137
137
 
138
138
  res = Rack::MockRequest.new(map).get("/foo/bar")
139
139
  res.should.be.not_found
@@ -146,7 +146,7 @@ describe Rack::URLMap do
146
146
  end
147
147
 
148
148
  should "route root apps correctly" do
149
- map = Rack::URLMap.new("/" => lambda { |env|
149
+ map = Rack::Lint.new(Rack::URLMap.new("/" => lambda { |env|
150
150
  [200,
151
151
  { "Content-Type" => "text/plain",
152
152
  "X-Position" => "root",
@@ -160,7 +160,7 @@ describe Rack::URLMap do
160
160
  "X-PathInfo" => env["PATH_INFO"],
161
161
  "X-ScriptName" => env["SCRIPT_NAME"]
162
162
  }, [""]]}
163
- )
163
+ ))
164
164
 
165
165
  res = Rack::MockRequest.new(map).get("/foo/bar")
166
166
  res.should.be.ok
@@ -188,7 +188,7 @@ describe Rack::URLMap do
188
188
  end
189
189
 
190
190
  should "not squeeze slashes" do
191
- map = Rack::URLMap.new("/" => lambda { |env|
191
+ map = Rack::Lint.new(Rack::URLMap.new("/" => lambda { |env|
192
192
  [200,
193
193
  { "Content-Type" => "text/plain",
194
194
  "X-Position" => "root",
@@ -202,7 +202,7 @@ describe Rack::URLMap do
202
202
  "X-PathInfo" => env["PATH_INFO"],
203
203
  "X-ScriptName" => env["SCRIPT_NAME"]
204
204
  }, [""]]}
205
- )
205
+ ))
206
206
 
207
207
  res = Rack::MockRequest.new(map).get("/http://example.org/bar")
208
208
  res.should.be.ok