rack 1.1.6 → 1.2.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 might be problematic. Click here for more details.

Files changed (105) hide show
  1. data/README +9 -205
  2. data/SPEC +3 -3
  3. data/lib/rack.rb +1 -24
  4. data/lib/rack/auth/abstract/request.rb +1 -5
  5. data/lib/rack/auth/digest/md5.rb +1 -2
  6. data/lib/rack/auth/digest/params.rb +1 -1
  7. data/lib/rack/content_length.rb +1 -1
  8. data/lib/rack/etag.rb +15 -6
  9. data/lib/rack/file.rb +3 -1
  10. data/lib/rack/handler/cgi.rb +8 -7
  11. data/lib/rack/handler/fastcgi.rb +1 -1
  12. data/lib/rack/handler/lsws.rb +1 -1
  13. data/lib/rack/handler/mongrel.rb +1 -1
  14. data/lib/rack/handler/scgi.rb +1 -4
  15. data/lib/rack/handler/webrick.rb +10 -6
  16. data/lib/rack/lint.rb +29 -37
  17. data/lib/rack/mime.rb +2 -0
  18. data/lib/rack/mock.rb +2 -1
  19. data/lib/rack/recursive.rb +4 -0
  20. data/lib/rack/request.rb +8 -6
  21. data/lib/rack/response.rb +1 -0
  22. data/lib/rack/rewindable_input.rb +13 -10
  23. data/lib/rack/sendfile.rb +8 -6
  24. data/lib/rack/server.rb +68 -9
  25. data/lib/rack/session/cookie.rb +1 -10
  26. data/lib/rack/session/memcache.rb +1 -1
  27. data/lib/rack/urlmap.rb +6 -7
  28. data/lib/rack/utils.rb +40 -71
  29. data/rack.gemspec +7 -11
  30. data/spec/cgi/lighttpd.conf +25 -0
  31. data/spec/cgi/rackup_stub.rb +6 -0
  32. data/spec/cgi/sample_rackup.ru +5 -0
  33. data/spec/cgi/test +9 -0
  34. data/spec/cgi/test.fcgi +8 -0
  35. data/spec/cgi/test.ru +5 -0
  36. data/spec/multipart/bad_robots +259 -0
  37. data/spec/multipart/binary +0 -0
  38. data/spec/multipart/empty +10 -0
  39. data/spec/multipart/fail_16384_nofile +814 -0
  40. data/spec/multipart/file1.txt +1 -0
  41. data/spec/multipart/filename_and_modification_param +7 -0
  42. data/spec/multipart/filename_with_escaped_quotes +6 -0
  43. data/spec/multipart/filename_with_escaped_quotes_and_modification_param +7 -0
  44. data/spec/multipart/filename_with_percent_escaped_quotes +6 -0
  45. data/spec/multipart/filename_with_unescaped_quotes +6 -0
  46. data/spec/multipart/ie +6 -0
  47. data/spec/multipart/nested +10 -0
  48. data/spec/multipart/none +9 -0
  49. data/spec/multipart/semicolon +6 -0
  50. data/spec/multipart/text +10 -0
  51. data/spec/rackup/config.ru +31 -0
  52. data/{test/spec_rack_auth_basic.rb → spec/spec_auth_basic.rb} +11 -14
  53. data/{test/spec_rack_auth_digest.rb → spec/spec_auth_digest.rb} +18 -27
  54. data/{test/spec_rack_builder.rb → spec/spec_builder.rb} +49 -10
  55. data/{test/spec_rack_cascade.rb → spec/spec_cascade.rb} +7 -10
  56. data/{test/spec_rack_cgi.rb → spec/spec_cgi.rb} +34 -32
  57. data/{test/spec_rack_chunked.rb → spec/spec_chunked.rb} +8 -10
  58. data/{test/spec_rack_commonlogger.rb → spec/spec_commonlogger.rb} +10 -15
  59. data/{test/spec_rack_conditionalget.rb → spec/spec_conditionalget.rb} +5 -7
  60. data/{test/spec_rack_config.rb → spec/spec_config.rb} +6 -7
  61. data/{test/spec_rack_content_length.rb → spec/spec_content_length.rb} +7 -8
  62. data/{test/spec_rack_content_type.rb → spec/spec_content_type.rb} +5 -6
  63. data/{test/spec_rack_deflater.rb → spec/spec_deflater.rb} +11 -13
  64. data/{test/spec_rack_directory.rb → spec/spec_directory.rb} +6 -10
  65. data/{test/spec_rack_etag.rb → spec/spec_etag.rb} +3 -5
  66. data/{test/spec_rack_fastcgi.rb → spec/spec_fastcgi.rb} +36 -29
  67. data/{test/spec_rack_file.rb → spec/spec_file.rb} +9 -13
  68. data/{test/spec_rack_handler.rb → spec/spec_handler.rb} +10 -12
  69. data/{test/spec_rack_head.rb → spec/spec_head.rb} +3 -3
  70. data/{test/spec_rack_lint.rb → spec/spec_lint.rb} +19 -32
  71. data/{test/spec_rack_lobster.rb → spec/spec_lobster.rb} +9 -11
  72. data/{test/spec_rack_lock.rb → spec/spec_lock.rb} +15 -17
  73. data/{test/spec_rack_logger.rb → spec/spec_logger.rb} +6 -7
  74. data/{test/spec_rack_methodoverride.rb → spec/spec_methodoverride.rb} +15 -17
  75. data/{test/spec_rack_mock.rb → spec/spec_mock.rb} +30 -32
  76. data/{test/spec_rack_mongrel.rb → spec/spec_mongrel.rb} +40 -46
  77. data/{test/spec_rack_nulllogger.rb → spec/spec_nulllogger.rb} +4 -5
  78. data/{test/spec_rack_recursive.rb → spec/spec_recursive.rb} +28 -36
  79. data/{test/spec_rack_request.rb → spec/spec_request.rb} +84 -98
  80. data/{test/spec_rack_response.rb → spec/spec_response.rb} +46 -27
  81. data/spec/spec_rewindable_input.rb +118 -0
  82. data/{test/spec_rack_runtime.rb → spec/spec_runtime.rb} +15 -11
  83. data/{test/spec_rack_sendfile.rb → spec/spec_sendfile.rb} +11 -14
  84. data/{test/spec_rack_session_cookie.rb → spec/spec_session_cookie.rb} +14 -36
  85. data/{test/spec_rack_session_memcache.rb → spec/spec_session_memcache.rb} +32 -26
  86. data/{test/spec_rack_session_pool.rb → spec/spec_session_pool.rb} +36 -31
  87. data/spec/spec_showexceptions.rb +23 -0
  88. data/spec/spec_showstatus.rb +79 -0
  89. data/{test/spec_rack_static.rb → spec/spec_static.rb} +5 -9
  90. data/{test/spec_rack_thin.rb → spec/spec_thin.rb} +30 -35
  91. data/{test/spec_rack_urlmap.rb → spec/spec_urlmap.rb} +6 -8
  92. data/{test/spec_rack_utils.rb → spec/spec_utils.rb} +134 -74
  93. data/{test/spec_rack_webrick.rb → spec/spec_webrick.rb} +28 -36
  94. data/spec/testrequest.rb +77 -0
  95. data/spec/unregistered_handler/rack/handler/unregistered.rb +7 -0
  96. data/spec/unregistered_handler/rack/handler/unregistered_long_one.rb +7 -0
  97. metadata +176 -191
  98. data/RDOX +0 -0
  99. data/lib/rack/adapter/camping.rb +0 -22
  100. data/test/spec_auth.rb +0 -57
  101. data/test/spec_rack_camping.rb +0 -55
  102. data/test/spec_rack_rewindable_input.rb +0 -118
  103. data/test/spec_rack_showexceptions.rb +0 -21
  104. data/test/spec_rack_showstatus.rb +0 -72
  105. data/test/spec_rackup.rb +0 -164
@@ -1,29 +1,27 @@
1
- require 'test/spec'
2
-
3
1
  require 'rack/lobster'
4
2
  require 'rack/mock'
5
3
 
6
- context "Rack::Lobster::LambdaLobster" do
7
- specify "should be a single lambda" do
4
+ describe Rack::Lobster::LambdaLobster do
5
+ should "be a single lambda" do
8
6
  Rack::Lobster::LambdaLobster.should.be.kind_of Proc
9
7
  end
10
-
11
- specify "should look like a lobster" do
8
+
9
+ should "look like a lobster" do
12
10
  res = Rack::MockRequest.new(Rack::Lobster::LambdaLobster).get("/")
13
11
  res.should.be.ok
14
12
  res.body.should.include "(,(,,(,,,("
15
13
  res.body.should.include "?flip"
16
14
  end
17
15
 
18
- specify "should be flippable" do
16
+ should "be flippable" do
19
17
  res = Rack::MockRequest.new(Rack::Lobster::LambdaLobster).get("/?flip")
20
18
  res.should.be.ok
21
19
  res.body.should.include "(,,,(,,(,("
22
20
  end
23
21
  end
24
22
 
25
- context "Rack::Lobster" do
26
- specify "should look like a lobster" do
23
+ describe Rack::Lobster do
24
+ should "look like a lobster" do
27
25
  res = Rack::MockRequest.new(Rack::Lobster.new).get("/")
28
26
  res.should.be.ok
29
27
  res.body.should.include "(,(,,(,,,("
@@ -31,13 +29,13 @@ context "Rack::Lobster" do
31
29
  res.body.should.include "crash"
32
30
  end
33
31
 
34
- specify "should be flippable" do
32
+ should "be flippable" do
35
33
  res = Rack::MockRequest.new(Rack::Lobster.new).get("/?flip=left")
36
34
  res.should.be.ok
37
35
  res.body.should.include "(,,,(,,(,("
38
36
  end
39
37
 
40
- specify "should provide crashing for testing purposes" do
38
+ should "provide crashing for testing purposes" do
41
39
  lambda {
42
40
  Rack::MockRequest.new(Rack::Lobster.new).get("/?flip=crash")
43
41
  }.should.raise
@@ -1,37 +1,35 @@
1
- require 'test/spec'
2
-
3
- require 'rack/mock'
4
1
  require 'rack/lock'
2
+ require 'rack/mock'
5
3
 
6
- context "Rack::Lock" do
7
- class Lock
8
- attr_reader :synchronized
4
+ class Lock
5
+ attr_reader :synchronized
9
6
 
10
- def initialize
11
- @synchronized = false
12
- end
7
+ def initialize
8
+ @synchronized = false
9
+ end
13
10
 
14
- def synchronize
15
- @synchronized = true
16
- yield
17
- end
11
+ def synchronize
12
+ @synchronized = true
13
+ yield
18
14
  end
15
+ end
19
16
 
20
- specify "should call synchronize on lock" do
17
+ describe Rack::Lock do
18
+ should "call synchronize on lock" do
21
19
  lock = Lock.new
22
20
  env = Rack::MockRequest.env_for("/")
23
- app = Rack::Lock.new(lambda { |env| }, lock)
21
+ app = Rack::Lock.new(lambda { |inner_env| }, lock)
24
22
  lock.synchronized.should.equal false
25
23
  app.call(env)
26
24
  lock.synchronized.should.equal true
27
25
  end
28
26
 
29
- specify "should set multithread flag to false" do
27
+ should "set multithread flag to false" do
30
28
  app = Rack::Lock.new(lambda { |env| env['rack.multithread'] })
31
29
  app.call(Rack::MockRequest.env_for("/")).should.equal false
32
30
  end
33
31
 
34
- specify "should reset original multithread flag when exiting lock" do
32
+ should "reset original multithread flag when exiting lock" do
35
33
  app = Rack::Lock.new(lambda { |env| env })
36
34
  app.call(Rack::MockRequest.env_for("/"))['rack.multithread'].should.equal true
37
35
  end
@@ -1,9 +1,8 @@
1
- require 'rack/logger'
2
- require 'rack/lint'
3
1
  require 'stringio'
2
+ require 'rack/logger'
4
3
 
5
- context "Rack::Logger" do
6
- specify "logs to rack.errors" do
4
+ describe Rack::Logger do
5
+ should "log to rack.errors" do
7
6
  app = lambda { |env|
8
7
  log = env['rack.logger']
9
8
  log.debug("Created logger")
@@ -14,8 +13,8 @@ context "Rack::Logger" do
14
13
  }
15
14
 
16
15
  errors = StringIO.new
17
- Rack::Logger.new(app).call({'rack.errors' => errors})
18
- errors.string.should.match "Program started"
19
- errors.string.should.match "Nothing to do"
16
+ Rack::Logger.new(app).call('rack.errors' => errors)
17
+ errors.string.should.match(/INFO -- : Program started/)
18
+ errors.string.should.match(/WARN -- : Nothing to do/)
20
19
  end
21
20
  end
@@ -1,58 +1,56 @@
1
- require 'test/spec'
2
-
3
- require 'rack/mock'
4
- require 'rack/methodoverride'
5
1
  require 'stringio'
2
+ require 'rack/methodoverride'
3
+ require 'rack/mock'
6
4
 
7
- context "Rack::MethodOverride" do
8
- specify "should not affect GET requests" do
5
+ describe Rack::MethodOverride do
6
+ should "not affect GET requests" do
9
7
  env = Rack::MockRequest.env_for("/?_method=delete", :method => "GET")
10
- app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) })
8
+ app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
11
9
  req = app.call(env)
12
10
 
13
11
  req.env["REQUEST_METHOD"].should.equal "GET"
14
12
  end
15
13
 
16
- specify "_method parameter should modify REQUEST_METHOD for POST requests" do
14
+ should "modify REQUEST_METHOD for POST requests when _method parameter is set" do
17
15
  env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=put")
18
- app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) })
16
+ app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
19
17
  req = app.call(env)
20
18
 
21
19
  req.env["REQUEST_METHOD"].should.equal "PUT"
22
20
  end
23
21
 
24
- specify "X-HTTP-Method-Override header should modify REQUEST_METHOD for POST requests" do
22
+ should "modify REQUEST_METHOD for POST requests when X-HTTP-Method-Override is set" do
25
23
  env = Rack::MockRequest.env_for("/",
26
24
  :method => "POST",
27
25
  "HTTP_X_HTTP_METHOD_OVERRIDE" => "PUT"
28
26
  )
29
- app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) })
27
+ app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
30
28
  req = app.call(env)
31
29
 
32
30
  req.env["REQUEST_METHOD"].should.equal "PUT"
33
31
  end
34
32
 
35
- specify "should not modify REQUEST_METHOD if the method is unknown" do
33
+ should "not modify REQUEST_METHOD if the method is unknown" do
36
34
  env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=foo")
37
- app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) })
35
+ app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
38
36
  req = app.call(env)
39
37
 
40
38
  req.env["REQUEST_METHOD"].should.equal "POST"
41
39
  end
42
40
 
43
- specify "should not modify REQUEST_METHOD when _method is nil" do
41
+ should "not modify REQUEST_METHOD when _method is nil" do
44
42
  env = Rack::MockRequest.env_for("/", :method => "POST", :input => "foo=bar")
45
- app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) })
43
+ app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
46
44
  req = app.call(env)
47
45
 
48
46
  req.env["REQUEST_METHOD"].should.equal "POST"
49
47
  end
50
48
 
51
- specify "should store the original REQUEST_METHOD prior to overriding" do
49
+ should "store the original REQUEST_METHOD prior to overriding" do
52
50
  env = Rack::MockRequest.env_for("/",
53
51
  :method => "POST",
54
52
  :input => "_method=options")
55
- app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) })
53
+ app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) })
56
54
  req = app.call(env)
57
55
 
58
56
  req.env["rack.methodoverride.original_method"].should.equal "POST"
@@ -1,35 +1,33 @@
1
1
  require 'yaml'
2
2
  require 'rack/mock'
3
- require 'rack/request'
4
- require 'rack/response'
5
3
 
6
4
  app = lambda { |env|
7
5
  req = Rack::Request.new(env)
8
-
6
+
9
7
  env["mock.postdata"] = env["rack.input"].read
10
8
  if req.GET["error"]
11
9
  env["rack.errors"].puts req.GET["error"]
12
10
  env["rack.errors"].flush
13
11
  end
14
-
12
+
15
13
  Rack::Response.new(env.to_yaml,
16
14
  req.GET["status"] || 200,
17
15
  "Content-Type" => "text/yaml").finish
18
16
  }
19
17
 
20
- context "Rack::MockRequest" do
21
- specify "should return a MockResponse" do
18
+ describe Rack::MockRequest do
19
+ should "return a MockResponse" do
22
20
  res = Rack::MockRequest.new(app).get("")
23
21
  res.should.be.kind_of Rack::MockResponse
24
22
  end
25
23
 
26
- specify "should be able to only return the environment" do
24
+ should "be able to only return the environment" do
27
25
  env = Rack::MockRequest.env_for("")
28
26
  env.should.be.kind_of Hash
29
27
  env.should.include "rack.version"
30
28
  end
31
29
 
32
- specify "should provide sensible defaults" do
30
+ should "provide sensible defaults" do
33
31
  res = Rack::MockRequest.new(app).request
34
32
 
35
33
  env = YAML.load(res.body)
@@ -43,7 +41,7 @@ context "Rack::MockRequest" do
43
41
  env["mock.postdata"].should.be.empty
44
42
  end
45
43
 
46
- specify "should allow GET/POST/PUT/DELETE" do
44
+ should "allow GET/POST/PUT/DELETE" do
47
45
  res = Rack::MockRequest.new(app).get("", :input => "foo")
48
46
  env = YAML.load(res.body)
49
47
  env["REQUEST_METHOD"].should.equal "GET"
@@ -64,12 +62,12 @@ context "Rack::MockRequest" do
64
62
  should.equal "OPTIONS"
65
63
  end
66
64
 
67
- specify "should set content length" do
65
+ should "set content length" do
68
66
  env = Rack::MockRequest.env_for("/", :input => "foo")
69
67
  env["CONTENT_LENGTH"].should.equal "3"
70
68
  end
71
69
 
72
- specify "should allow posting" do
70
+ should "allow posting" do
73
71
  res = Rack::MockRequest.new(app).get("", :input => "foo")
74
72
  env = YAML.load(res.body)
75
73
  env["mock.postdata"].should.equal "foo"
@@ -79,7 +77,7 @@ context "Rack::MockRequest" do
79
77
  env["mock.postdata"].should.equal "foo"
80
78
  end
81
79
 
82
- specify "should use all parts of an URL" do
80
+ should "use all parts of an URL" do
83
81
  res = Rack::MockRequest.new(app).
84
82
  get("https://bla.example.org:9292/meh/foo?bar")
85
83
  res.should.be.kind_of Rack::MockResponse
@@ -93,7 +91,7 @@ context "Rack::MockRequest" do
93
91
  env["rack.url_scheme"].should.equal "https"
94
92
  end
95
93
 
96
- specify "should set SSL port and HTTP flag on when using https" do
94
+ should "set SSL port and HTTP flag on when using https" do
97
95
  res = Rack::MockRequest.new(app).
98
96
  get("https://example.org/foo")
99
97
  res.should.be.kind_of Rack::MockResponse
@@ -108,7 +106,7 @@ context "Rack::MockRequest" do
108
106
  env["HTTPS"].should.equal "on"
109
107
  end
110
108
 
111
- specify "should prepend slash to uri path" do
109
+ should "prepend slash to uri path" do
112
110
  res = Rack::MockRequest.new(app).
113
111
  get("foo")
114
112
  res.should.be.kind_of Rack::MockResponse
@@ -122,33 +120,33 @@ context "Rack::MockRequest" do
122
120
  env["rack.url_scheme"].should.equal "http"
123
121
  end
124
122
 
125
- specify "should properly convert method name to an uppercase string" do
123
+ should "properly convert method name to an uppercase string" do
126
124
  res = Rack::MockRequest.new(app).request(:get)
127
125
  env = YAML.load(res.body)
128
126
  env["REQUEST_METHOD"].should.equal "GET"
129
127
  end
130
128
 
131
- specify "should accept params and build query string for GET requests" do
129
+ should "accept params and build query string for GET requests" do
132
130
  res = Rack::MockRequest.new(app).get("/foo?baz=2", :params => {:foo => {:bar => "1"}})
133
131
  env = YAML.load(res.body)
134
132
  env["REQUEST_METHOD"].should.equal "GET"
135
- env["QUERY_STRING"].should.match "baz=2"
136
- env["QUERY_STRING"].should.match "foo[bar]=1"
133
+ env["QUERY_STRING"].should.include "baz=2"
134
+ env["QUERY_STRING"].should.include "foo[bar]=1"
137
135
  env["PATH_INFO"].should.equal "/foo"
138
136
  env["mock.postdata"].should.equal ""
139
137
  end
140
138
 
141
- specify "should accept raw input in params for GET requests" do
139
+ should "accept raw input in params for GET requests" do
142
140
  res = Rack::MockRequest.new(app).get("/foo?baz=2", :params => "foo[bar]=1")
143
141
  env = YAML.load(res.body)
144
142
  env["REQUEST_METHOD"].should.equal "GET"
145
- env["QUERY_STRING"].should.match "baz=2"
146
- env["QUERY_STRING"].should.match "foo[bar]=1"
143
+ env["QUERY_STRING"].should.include "baz=2"
144
+ env["QUERY_STRING"].should.include "foo[bar]=1"
147
145
  env["PATH_INFO"].should.equal "/foo"
148
146
  env["mock.postdata"].should.equal ""
149
147
  end
150
148
 
151
- specify "should accept params and build url encoded params for POST requests" do
149
+ should "accept params and build url encoded params for POST requests" do
152
150
  res = Rack::MockRequest.new(app).post("/foo", :params => {:foo => {:bar => "1"}})
153
151
  env = YAML.load(res.body)
154
152
  env["REQUEST_METHOD"].should.equal "POST"
@@ -158,7 +156,7 @@ context "Rack::MockRequest" do
158
156
  env["mock.postdata"].should.equal "foo[bar]=1"
159
157
  end
160
158
 
161
- specify "should accept raw input in params for POST requests" do
159
+ should "accept raw input in params for POST requests" do
162
160
  res = Rack::MockRequest.new(app).post("/foo", :params => "foo[bar]=1")
163
161
  env = YAML.load(res.body)
164
162
  env["REQUEST_METHOD"].should.equal "POST"
@@ -168,7 +166,7 @@ context "Rack::MockRequest" do
168
166
  env["mock.postdata"].should.equal "foo[bar]=1"
169
167
  end
170
168
 
171
- specify "should accept params and build multipart encoded params for POST requests" do
169
+ should "accept params and build multipart encoded params for POST requests" do
172
170
  files = Rack::Utils::Multipart::UploadedFile.new(File.join(File.dirname(__FILE__), "multipart", "file1.txt"))
173
171
  res = Rack::MockRequest.new(app).post("/foo", :params => { "submit-name" => "Larry", "files" => files })
174
172
  env = YAML.load(res.body)
@@ -179,7 +177,7 @@ context "Rack::MockRequest" do
179
177
  env["mock.postdata"].length.should.equal 206
180
178
  end
181
179
 
182
- specify "should behave valid according to the Rack spec" do
180
+ should "behave valid according to the Rack spec" do
183
181
  lambda {
184
182
  res = Rack::MockRequest.new(app).
185
183
  get("https://bla.example.org:9292/meh/foo?bar", :lint => true)
@@ -187,8 +185,8 @@ context "Rack::MockRequest" do
187
185
  end
188
186
  end
189
187
 
190
- context "Rack::MockResponse" do
191
- specify "should provide access to the HTTP status" do
188
+ describe Rack::MockResponse do
189
+ should "provide access to the HTTP status" do
192
190
  res = Rack::MockRequest.new(app).get("")
193
191
  res.should.be.successful
194
192
  res.should.be.ok
@@ -209,18 +207,18 @@ context "Rack::MockResponse" do
209
207
  res.should.be.empty
210
208
  end
211
209
 
212
- specify "should provide access to the HTTP headers" do
210
+ should "provide access to the HTTP headers" do
213
211
  res = Rack::MockRequest.new(app).get("")
214
212
  res.should.include "Content-Type"
215
213
  res.headers["Content-Type"].should.equal "text/yaml"
216
214
  res.original_headers["Content-Type"].should.equal "text/yaml"
217
215
  res["Content-Type"].should.equal "text/yaml"
218
216
  res.content_type.should.equal "text/yaml"
219
- res.content_length.should.be 414 # needs change often.
217
+ res.content_length.should.be > 0
220
218
  res.location.should.be.nil
221
219
  end
222
220
 
223
- specify "should provide access to the HTTP body" do
221
+ should "provide access to the HTTP body" do
224
222
  res = Rack::MockRequest.new(app).get("")
225
223
  res.body.should =~ /rack/
226
224
  res.should =~ /rack/
@@ -228,14 +226,14 @@ context "Rack::MockResponse" do
228
226
  res.should.satisfy { |r| r.match(/rack/) }
229
227
  end
230
228
 
231
- specify "should provide access to the Rack errors" do
229
+ should "provide access to the Rack errors" do
232
230
  res = Rack::MockRequest.new(app).get("/?error=foo", :lint => true)
233
231
  res.should.be.ok
234
232
  res.errors.should.not.be.empty
235
233
  res.errors.should.include "foo"
236
234
  end
237
235
 
238
- specify "should optionally make Rack errors fatal" do
236
+ should "optionally make Rack errors fatal" do
239
237
  lambda {
240
238
  Rack::MockRequest.new(app).get("/?error=foo", :fatal => true)
241
239
  }.should.raise(Rack::MockRequest::FatalWarning)
@@ -1,37 +1,32 @@
1
- require 'test/spec'
2
-
3
1
  begin
2
+ require 'rack'
4
3
  require 'rack/handler/mongrel'
5
- require 'rack/urlmap'
6
- require 'rack/lint'
7
- require 'testrequest'
4
+ require File.expand_path('../testrequest', __FILE__)
8
5
  require 'timeout'
9
6
 
10
7
  Thread.abort_on_exception = true
11
8
  $tcp_defer_accept_opts = nil
12
9
  $tcp_cork_opts = nil
13
10
 
14
- context "Rack::Handler::Mongrel" do
15
- include TestRequest::Helpers
11
+ describe Rack::Handler::Mongrel do
12
+ extend TestRequest::Helpers
16
13
 
17
- setup do
18
- server = Mongrel::HttpServer.new(@host='0.0.0.0', @port=9201)
19
- server.register('/test',
20
- Rack::Handler::Mongrel.new(Rack::Lint.new(TestRequest.new)))
21
- server.register('/stream',
22
- Rack::Handler::Mongrel.new(Rack::Lint.new(StreamingRequest)))
23
- @acc = server.run
24
- end
14
+ @server = Mongrel::HttpServer.new(@host='0.0.0.0', @port=9201)
15
+ @server.register('/test',
16
+ Rack::Handler::Mongrel.new(Rack::Lint.new(TestRequest.new)))
17
+ @server.register('/stream',
18
+ Rack::Handler::Mongrel.new(Rack::Lint.new(StreamingRequest)))
19
+ @acc = @server.run
25
20
 
26
- specify "should respond" do
21
+ should "respond" do
27
22
  lambda {
28
23
  GET("/test")
29
24
  }.should.not.raise
30
25
  end
31
26
 
32
- specify "should be a Mongrel" do
27
+ should "be a Mongrel" do
33
28
  GET("/test")
34
- status.should.be 200
29
+ status.should.equal 200
35
30
  response["SERVER_SOFTWARE"].should =~ /Mongrel/
36
31
  response["HTTP_VERSION"].should.equal "HTTP/1.1"
37
32
  response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
@@ -39,15 +34,15 @@ context "Rack::Handler::Mongrel" do
39
34
  response["SERVER_NAME"].should.equal "0.0.0.0"
40
35
  end
41
36
 
42
- specify "should have rack headers" do
37
+ should "have rack headers" do
43
38
  GET("/test")
44
39
  response["rack.version"].should.equal [1,1]
45
- response["rack.multithread"].should.be true
46
- response["rack.multiprocess"].should.be false
47
- response["rack.run_once"].should.be false
40
+ response["rack.multithread"].should.be.true
41
+ response["rack.multiprocess"].should.be.false
42
+ response["rack.run_once"].should.be.false
48
43
  end
49
44
 
50
- specify "should have CGI headers on GET" do
45
+ should "have CGI headers on GET" do
51
46
  GET("/test")
52
47
  response["REQUEST_METHOD"].should.equal "GET"
53
48
  response["SCRIPT_NAME"].should.equal "/test"
@@ -64,7 +59,7 @@ context "Rack::Handler::Mongrel" do
64
59
  response["QUERY_STRING"].should.equal "quux=1"
65
60
  end
66
61
 
67
- specify "should have CGI headers on POST" do
62
+ should "have CGI headers on POST" do
68
63
  POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
69
64
  status.should.equal 200
70
65
  response["REQUEST_METHOD"].should.equal "POST"
@@ -75,18 +70,18 @@ context "Rack::Handler::Mongrel" do
75
70
  response["test.postdata"].should.equal "rack-form-data=23"
76
71
  end
77
72
 
78
- specify "should support HTTP auth" do
73
+ should "support HTTP auth" do
79
74
  GET("/test", {:user => "ruth", :passwd => "secret"})
80
75
  response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
81
76
  end
82
77
 
83
- specify "should set status" do
78
+ should "set status" do
84
79
  GET("/test?secret")
85
80
  status.should.equal 403
86
81
  response["rack.url_scheme"].should.equal "http"
87
82
  end
88
83
 
89
- specify "should provide a .run" do
84
+ should "provide a .run" do
90
85
  block_ran = false
91
86
  Thread.new {
92
87
  Rack::Handler::Mongrel.run(lambda {}, {:Port => 9211}) { |server|
@@ -95,16 +90,16 @@ context "Rack::Handler::Mongrel" do
95
90
  }
96
91
  }
97
92
  sleep 1
98
- block_ran.should.be true
93
+ block_ran.should.be.true
99
94
  end
100
95
 
101
- specify "should provide a .run that maps a hash" do
96
+ should "provide a .run that maps a hash" do
102
97
  block_ran = false
103
98
  Thread.new {
104
99
  map = {'/'=>lambda{},'/foo'=>lambda{}}
105
100
  Rack::Handler::Mongrel.run(map, :map => true, :Port => 9221) { |server|
106
101
  server.should.be.kind_of Mongrel::HttpServer
107
- server.classifier.uris.size.should.be 2
102
+ server.classifier.uris.size.should.equal 2
108
103
  server.classifier.uris.should.not.include '/arf'
109
104
  server.classifier.uris.should.include '/'
110
105
  server.classifier.uris.should.include '/foo'
@@ -112,16 +107,16 @@ context "Rack::Handler::Mongrel" do
112
107
  }
113
108
  }
114
109
  sleep 1
115
- block_ran.should.be true
110
+ block_ran.should.be.true
116
111
  end
117
112
 
118
- specify "should provide a .run that maps a urlmap" do
113
+ should "provide a .run that maps a urlmap" do
119
114
  block_ran = false
120
115
  Thread.new {
121
116
  map = Rack::URLMap.new({'/'=>lambda{},'/bar'=>lambda{}})
122
117
  Rack::Handler::Mongrel.run(map, {:map => true, :Port => 9231}) { |server|
123
118
  server.should.be.kind_of Mongrel::HttpServer
124
- server.classifier.uris.size.should.be 2
119
+ server.classifier.uris.size.should.equal 2
125
120
  server.classifier.uris.should.not.include '/arf'
126
121
  server.classifier.uris.should.include '/'
127
122
  server.classifier.uris.should.include '/bar'
@@ -129,10 +124,10 @@ context "Rack::Handler::Mongrel" do
129
124
  }
130
125
  }
131
126
  sleep 1
132
- block_ran.should.be true
127
+ block_ran.should.be.true
133
128
  end
134
129
 
135
- specify "should provide a .run that maps a urlmap restricting by host" do
130
+ should "provide a .run that maps a urlmap restricting by host" do
136
131
  block_ran = false
137
132
  Thread.new {
138
133
  map = Rack::URLMap.new({
@@ -148,22 +143,22 @@ context "Rack::Handler::Mongrel" do
148
143
  Rack::Handler::Mongrel.run(map, opt) { |server|
149
144
  server.should.be.kind_of Mongrel::HttpServer
150
145
  server.classifier.uris.should.include '/'
151
- server.classifier.handler_map['/'].size.should.be 2
146
+ server.classifier.handler_map['/'].size.should.equal 2
152
147
  server.classifier.uris.should.include '/foo'
153
- server.classifier.handler_map['/foo'].size.should.be 1
148
+ server.classifier.handler_map['/foo'].size.should.equal 1
154
149
  server.classifier.uris.should.include '/bar'
155
- server.classifier.handler_map['/bar'].size.should.be 2
150
+ server.classifier.handler_map['/bar'].size.should.equal 2
156
151
  server.classifier.uris.should.not.include '/qux'
157
152
  server.classifier.uris.should.not.include '/arf'
158
- server.classifier.uris.size.should.be 3
153
+ server.classifier.uris.size.should.equal 3
159
154
  block_ran = true
160
155
  }
161
156
  }
162
157
  sleep 1
163
- block_ran.should.be true
158
+ block_ran.should.be.true
164
159
  end
165
160
 
166
- specify "should stream #each part of the response" do
161
+ should "stream #each part of the response" do
167
162
  body = ''
168
163
  begin
169
164
  Timeout.timeout(1) do
@@ -179,11 +174,10 @@ context "Rack::Handler::Mongrel" do
179
174
  body.should.not.be.empty
180
175
  end
181
176
 
182
- teardown do
183
- @acc.raise Mongrel::StopServer
184
- end
177
+ @acc.raise Mongrel::StopServer
185
178
  end
186
179
 
187
- rescue LoadError
188
- $stderr.puts "Skipping Rack::Handler::Mongrel tests (Mongrel is required). `gem install mongrel` and try again."
180
+ rescue LoadError => ex
181
+ warn ex
182
+ warn "Skipping Rack::Handler::Mongrel tests (Mongrel is required). `gem install mongrel` and try again."
189
183
  end