rack 2.0.4 → 2.1.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 (187) hide show
  1. checksums.yaml +4 -4
  2. data/{HISTORY.md → CHANGELOG.md} +220 -155
  3. data/{COPYING → MIT-LICENSE} +4 -2
  4. data/README.rdoc +77 -119
  5. data/Rakefile +25 -18
  6. data/SPEC +3 -4
  7. data/bin/rackup +1 -0
  8. data/example/lobster.ru +2 -0
  9. data/example/protectedlobster.rb +3 -1
  10. data/example/protectedlobster.ru +2 -0
  11. data/lib/rack.rb +63 -60
  12. data/lib/rack/auth/abstract/handler.rb +3 -1
  13. data/lib/rack/auth/abstract/request.rb +2 -0
  14. data/lib/rack/auth/basic.rb +4 -1
  15. data/lib/rack/auth/digest/md5.rb +9 -7
  16. data/lib/rack/auth/digest/nonce.rb +6 -3
  17. data/lib/rack/auth/digest/params.rb +4 -2
  18. data/lib/rack/auth/digest/request.rb +2 -0
  19. data/lib/rack/body_proxy.rb +3 -6
  20. data/lib/rack/builder.rb +38 -15
  21. data/lib/rack/cascade.rb +6 -5
  22. data/lib/rack/chunked.rb +29 -6
  23. data/lib/rack/common_logger.rb +9 -8
  24. data/lib/rack/conditional_get.rb +3 -1
  25. data/lib/rack/config.rb +2 -0
  26. data/lib/rack/content_length.rb +3 -1
  27. data/lib/rack/content_type.rb +3 -1
  28. data/lib/rack/core_ext/regexp.rb +14 -0
  29. data/lib/rack/deflater.rb +28 -17
  30. data/lib/rack/directory.rb +17 -14
  31. data/lib/rack/etag.rb +3 -1
  32. data/lib/rack/events.rb +5 -3
  33. data/lib/rack/file.rb +5 -173
  34. data/lib/rack/files.rb +178 -0
  35. data/lib/rack/handler.rb +7 -2
  36. data/lib/rack/handler/cgi.rb +3 -1
  37. data/lib/rack/handler/fastcgi.rb +4 -2
  38. data/lib/rack/handler/lsws.rb +3 -1
  39. data/lib/rack/handler/scgi.rb +9 -6
  40. data/lib/rack/handler/thin.rb +3 -1
  41. data/lib/rack/handler/webrick.rb +4 -2
  42. data/lib/rack/head.rb +2 -0
  43. data/lib/rack/lint.rb +14 -11
  44. data/lib/rack/lobster.rb +7 -5
  45. data/lib/rack/lock.rb +2 -0
  46. data/lib/rack/logger.rb +2 -0
  47. data/lib/rack/media_type.rb +10 -5
  48. data/lib/rack/method_override.rb +9 -3
  49. data/lib/rack/mime.rb +9 -1
  50. data/lib/rack/mock.rb +74 -15
  51. data/lib/rack/multipart.rb +5 -3
  52. data/lib/rack/multipart/generator.rb +6 -7
  53. data/lib/rack/multipart/parser.rb +54 -51
  54. data/lib/rack/multipart/uploaded_file.rb +2 -0
  55. data/lib/rack/null_logger.rb +2 -0
  56. data/lib/rack/query_parser.rb +51 -25
  57. data/lib/rack/recursive.rb +7 -5
  58. data/lib/rack/reloader.rb +10 -4
  59. data/lib/rack/request.rb +89 -23
  60. data/lib/rack/response.rb +71 -31
  61. data/lib/rack/rewindable_input.rb +4 -2
  62. data/lib/rack/runtime.rb +4 -2
  63. data/lib/rack/sendfile.rb +15 -8
  64. data/lib/rack/server.rb +88 -16
  65. data/lib/rack/session/abstract/id.rb +104 -21
  66. data/lib/rack/session/cookie.rb +21 -11
  67. data/lib/rack/session/memcache.rb +4 -87
  68. data/lib/rack/session/pool.rb +17 -8
  69. data/lib/rack/show_exceptions.rb +16 -10
  70. data/lib/rack/show_status.rb +4 -2
  71. data/lib/rack/static.rb +15 -10
  72. data/lib/rack/tempfile_reaper.rb +2 -0
  73. data/lib/rack/urlmap.rb +11 -2
  74. data/lib/rack/utils.rb +55 -70
  75. data/rack.gemspec +19 -9
  76. metadata +32 -173
  77. data/test/builder/an_underscore_app.rb +0 -5
  78. data/test/builder/anything.rb +0 -5
  79. data/test/builder/comment.ru +0 -4
  80. data/test/builder/end.ru +0 -5
  81. data/test/builder/line.ru +0 -1
  82. data/test/builder/options.ru +0 -2
  83. data/test/cgi/assets/folder/test.js +0 -1
  84. data/test/cgi/assets/fonts/font.eot +0 -1
  85. data/test/cgi/assets/images/image.png +0 -1
  86. data/test/cgi/assets/index.html +0 -1
  87. data/test/cgi/assets/javascripts/app.js +0 -1
  88. data/test/cgi/assets/stylesheets/app.css +0 -1
  89. data/test/cgi/lighttpd.conf +0 -26
  90. data/test/cgi/rackup_stub.rb +0 -6
  91. data/test/cgi/sample_rackup.ru +0 -5
  92. data/test/cgi/test +0 -9
  93. data/test/cgi/test+directory/test+file +0 -1
  94. data/test/cgi/test.fcgi +0 -9
  95. data/test/cgi/test.gz +0 -0
  96. data/test/cgi/test.ru +0 -5
  97. data/test/gemloader.rb +0 -10
  98. data/test/helper.rb +0 -34
  99. data/test/multipart/bad_robots +0 -259
  100. data/test/multipart/binary +0 -0
  101. data/test/multipart/content_type_and_no_filename +0 -6
  102. data/test/multipart/empty +0 -10
  103. data/test/multipart/fail_16384_nofile +0 -814
  104. data/test/multipart/file1.txt +0 -1
  105. data/test/multipart/filename_and_modification_param +0 -7
  106. data/test/multipart/filename_and_no_name +0 -6
  107. data/test/multipart/filename_with_encoded_words +0 -7
  108. data/test/multipart/filename_with_escaped_quotes +0 -6
  109. data/test/multipart/filename_with_escaped_quotes_and_modification_param +0 -7
  110. data/test/multipart/filename_with_null_byte +0 -7
  111. data/test/multipart/filename_with_percent_escaped_quotes +0 -6
  112. data/test/multipart/filename_with_single_quote +0 -7
  113. data/test/multipart/filename_with_unescaped_percentages +0 -6
  114. data/test/multipart/filename_with_unescaped_percentages2 +0 -6
  115. data/test/multipart/filename_with_unescaped_percentages3 +0 -6
  116. data/test/multipart/filename_with_unescaped_quotes +0 -6
  117. data/test/multipart/ie +0 -6
  118. data/test/multipart/invalid_character +0 -6
  119. data/test/multipart/mixed_files +0 -21
  120. data/test/multipart/nested +0 -10
  121. data/test/multipart/none +0 -9
  122. data/test/multipart/quoted +0 -15
  123. data/test/multipart/rack-logo.png +0 -0
  124. data/test/multipart/semicolon +0 -6
  125. data/test/multipart/text +0 -15
  126. data/test/multipart/three_files_three_fields +0 -31
  127. data/test/multipart/unity3d_wwwform +0 -11
  128. data/test/multipart/webkit +0 -32
  129. data/test/rackup/config.ru +0 -31
  130. data/test/registering_handler/rack/handler/registering_myself.rb +0 -8
  131. data/test/spec_auth_basic.rb +0 -89
  132. data/test/spec_auth_digest.rb +0 -260
  133. data/test/spec_body_proxy.rb +0 -85
  134. data/test/spec_builder.rb +0 -233
  135. data/test/spec_cascade.rb +0 -63
  136. data/test/spec_cgi.rb +0 -84
  137. data/test/spec_chunked.rb +0 -103
  138. data/test/spec_common_logger.rb +0 -95
  139. data/test/spec_conditional_get.rb +0 -103
  140. data/test/spec_config.rb +0 -23
  141. data/test/spec_content_length.rb +0 -86
  142. data/test/spec_content_type.rb +0 -46
  143. data/test/spec_deflater.rb +0 -375
  144. data/test/spec_directory.rb +0 -148
  145. data/test/spec_etag.rb +0 -108
  146. data/test/spec_events.rb +0 -133
  147. data/test/spec_fastcgi.rb +0 -85
  148. data/test/spec_file.rb +0 -264
  149. data/test/spec_handler.rb +0 -57
  150. data/test/spec_head.rb +0 -46
  151. data/test/spec_lint.rb +0 -515
  152. data/test/spec_lobster.rb +0 -59
  153. data/test/spec_lock.rb +0 -204
  154. data/test/spec_logger.rb +0 -24
  155. data/test/spec_media_type.rb +0 -42
  156. data/test/spec_method_override.rb +0 -96
  157. data/test/spec_mime.rb +0 -51
  158. data/test/spec_mock.rb +0 -359
  159. data/test/spec_multipart.rb +0 -722
  160. data/test/spec_null_logger.rb +0 -21
  161. data/test/spec_recursive.rb +0 -75
  162. data/test/spec_request.rb +0 -1393
  163. data/test/spec_response.rb +0 -510
  164. data/test/spec_rewindable_input.rb +0 -128
  165. data/test/spec_runtime.rb +0 -50
  166. data/test/spec_sendfile.rb +0 -125
  167. data/test/spec_server.rb +0 -193
  168. data/test/spec_session_abstract_id.rb +0 -31
  169. data/test/spec_session_abstract_session_hash.rb +0 -45
  170. data/test/spec_session_cookie.rb +0 -442
  171. data/test/spec_session_memcache.rb +0 -320
  172. data/test/spec_session_pool.rb +0 -210
  173. data/test/spec_show_exceptions.rb +0 -80
  174. data/test/spec_show_status.rb +0 -104
  175. data/test/spec_static.rb +0 -184
  176. data/test/spec_tempfile_reaper.rb +0 -64
  177. data/test/spec_thin.rb +0 -96
  178. data/test/spec_urlmap.rb +0 -237
  179. data/test/spec_utils.rb +0 -742
  180. data/test/spec_version.rb +0 -11
  181. data/test/spec_webrick.rb +0 -206
  182. data/test/static/another/index.html +0 -1
  183. data/test/static/foo.html +0 -1
  184. data/test/static/index.html +0 -1
  185. data/test/testrequest.rb +0 -78
  186. data/test/unregistered_handler/rack/handler/unregistered.rb +0 -7
  187. data/test/unregistered_handler/rack/handler/unregistered_long_one.rb +0 -7
@@ -1,59 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'rack/lobster'
3
- require 'rack/lint'
4
- require 'rack/mock'
5
-
6
- module LobsterHelpers
7
- def lobster
8
- Rack::MockRequest.new Rack::Lint.new(Rack::Lobster.new)
9
- end
10
-
11
- def lambda_lobster
12
- Rack::MockRequest.new Rack::Lint.new(Rack::Lobster::LambdaLobster)
13
- end
14
- end
15
-
16
- describe Rack::Lobster::LambdaLobster do
17
- include LobsterHelpers
18
-
19
- it "be a single lambda" do
20
- Rack::Lobster::LambdaLobster.must_be_kind_of Proc
21
- end
22
-
23
- it "look like a lobster" do
24
- res = lambda_lobster.get("/")
25
- res.must_be :ok?
26
- res.body.must_include "(,(,,(,,,("
27
- res.body.must_include "?flip"
28
- end
29
-
30
- it "be flippable" do
31
- res = lambda_lobster.get("/?flip")
32
- res.must_be :ok?
33
- res.body.must_include "(,,,(,,(,("
34
- end
35
- end
36
-
37
- describe Rack::Lobster do
38
- include LobsterHelpers
39
-
40
- it "look like a lobster" do
41
- res = lobster.get("/")
42
- res.must_be :ok?
43
- res.body.must_include "(,(,,(,,,("
44
- res.body.must_include "?flip"
45
- res.body.must_include "crash"
46
- end
47
-
48
- it "be flippable" do
49
- res = lobster.get("/?flip=left")
50
- res.must_be :ok?
51
- res.body.must_include "),,,),,),)"
52
- end
53
-
54
- it "provide crashing for testing purposes" do
55
- lambda {
56
- lobster.get("/?flip=crash")
57
- }.must_raise RuntimeError
58
- end
59
- end
@@ -1,204 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'rack/lint'
3
- require 'rack/lock'
4
- require 'rack/mock'
5
-
6
- class Lock
7
- attr_reader :synchronized
8
-
9
- def initialize
10
- @synchronized = false
11
- end
12
-
13
- def lock
14
- @synchronized = true
15
- end
16
-
17
- def unlock
18
- @synchronized = false
19
- end
20
- end
21
-
22
- module LockHelpers
23
- def lock_app(app, lock = Lock.new)
24
- app = if lock
25
- Rack::Lock.new app, lock
26
- else
27
- Rack::Lock.new app
28
- end
29
- Rack::Lint.new app
30
- end
31
- end
32
-
33
- describe Rack::Lock do
34
- include LockHelpers
35
-
36
- describe 'Proxy' do
37
- include LockHelpers
38
-
39
- it 'delegate each' do
40
- env = Rack::MockRequest.env_for("/")
41
- response = Class.new {
42
- attr_accessor :close_called
43
- def initialize; @close_called = false; end
44
- def each; %w{ hi mom }.each { |x| yield x }; end
45
- }.new
46
-
47
- app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, response] })
48
- response = app.call(env)[2]
49
- list = []
50
- response.each { |x| list << x }
51
- list.must_equal %w{ hi mom }
52
- end
53
-
54
- it 'delegate to_path' do
55
- lock = Lock.new
56
- env = Rack::MockRequest.env_for("/")
57
-
58
- res = ['Hello World']
59
- def res.to_path ; "/tmp/hello.txt" ; end
60
-
61
- app = Rack::Lock.new(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, res] }, lock)
62
- body = app.call(env)[2]
63
-
64
- body.must_respond_to :to_path
65
- body.to_path.must_equal "/tmp/hello.txt"
66
- end
67
-
68
- it 'not delegate to_path if body does not implement it' do
69
- env = Rack::MockRequest.env_for("/")
70
-
71
- res = ['Hello World']
72
-
73
- app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, res] })
74
- body = app.call(env)[2]
75
-
76
- body.wont_respond_to :to_path
77
- end
78
- end
79
-
80
- it 'call super on close' do
81
- env = Rack::MockRequest.env_for("/")
82
- response = Class.new {
83
- attr_accessor :close_called
84
- def initialize; @close_called = false; end
85
- def close; @close_called = true; end
86
- }.new
87
-
88
- app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, response] })
89
- app.call(env)
90
- response.close_called.must_equal false
91
- response.close
92
- response.close_called.must_equal true
93
- end
94
-
95
- it "not unlock until body is closed" do
96
- lock = Lock.new
97
- env = Rack::MockRequest.env_for("/")
98
- response = Object.new
99
- app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, response] }, lock)
100
- lock.synchronized.must_equal false
101
- response = app.call(env)[2]
102
- lock.synchronized.must_equal true
103
- response.close
104
- lock.synchronized.must_equal false
105
- end
106
-
107
- it "return value from app" do
108
- env = Rack::MockRequest.env_for("/")
109
- body = [200, {"Content-Type" => "text/plain"}, %w{ hi mom }]
110
- app = lock_app(lambda { |inner_env| body })
111
-
112
- res = app.call(env)
113
- res[0].must_equal body[0]
114
- res[1].must_equal body[1]
115
- res[2].to_enum.to_a.must_equal ["hi", "mom"]
116
- end
117
-
118
- it "call synchronize on lock" do
119
- lock = Lock.new
120
- env = Rack::MockRequest.env_for("/")
121
- app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, %w{ a b c }] }, lock)
122
- lock.synchronized.must_equal false
123
- app.call(env)
124
- lock.synchronized.must_equal true
125
- end
126
-
127
- it "unlock if the app raises" do
128
- lock = Lock.new
129
- env = Rack::MockRequest.env_for("/")
130
- app = lock_app(lambda { raise Exception }, lock)
131
- lambda { app.call(env) }.must_raise Exception
132
- lock.synchronized.must_equal false
133
- end
134
-
135
- it "unlock if the app throws" do
136
- lock = Lock.new
137
- env = Rack::MockRequest.env_for("/")
138
- app = lock_app(lambda {|_| throw :bacon }, lock)
139
- lambda { app.call(env) }.must_throw :bacon
140
- lock.synchronized.must_equal false
141
- end
142
-
143
- it "set multithread flag to false" do
144
- app = lock_app(lambda { |env|
145
- env['rack.multithread'].must_equal false
146
- [200, {"Content-Type" => "text/plain"}, %w{ a b c }]
147
- }, false)
148
- env = Rack::MockRequest.env_for("/")
149
- env['rack.multithread'].must_equal true
150
- _, _, body = app.call(env)
151
- body.close
152
- env['rack.multithread'].must_equal true
153
- end
154
-
155
- it "reset original multithread flag when exiting lock" do
156
- app = Class.new(Rack::Lock) {
157
- def call(env)
158
- env['rack.multithread'].must_equal true
159
- super
160
- end
161
- }.new(lambda { |env| [200, {"Content-Type" => "text/plain"}, %w{ a b c }] })
162
- Rack::Lint.new(app).call(Rack::MockRequest.env_for("/"))
163
- end
164
-
165
- it 'not unlock if an error is raised before the mutex is locked' do
166
- lock = Class.new do
167
- def initialize() @unlocked = false end
168
- def unlocked?() @unlocked end
169
- def lock() raise Exception end
170
- def unlock() @unlocked = true end
171
- end.new
172
- env = Rack::MockRequest.env_for("/")
173
- app = lock_app(proc { [200, {"Content-Type" => "text/plain"}, []] }, lock)
174
- lambda { app.call(env) }.must_raise Exception
175
- lock.unlocked?.must_equal false
176
- end
177
-
178
- it "not reset the environment while the body is proxied" do
179
- proxy = Class.new do
180
- attr_reader :env
181
- def initialize(env) @env = env end
182
- end
183
- app = Rack::Lock.new lambda { |env| [200, {"Content-Type" => "text/plain"}, proxy.new(env)] }
184
- response = app.call(Rack::MockRequest.env_for("/"))[2]
185
- response.env['rack.multithread'].must_equal false
186
- end
187
-
188
- it "unlock if an exception occurs before returning" do
189
- lock = Lock.new
190
- env = Rack::MockRequest.env_for("/")
191
- app = lock_app(proc { [].freeze }, lock)
192
- lambda { app.call(env) }.must_raise Exception
193
- lock.synchronized.must_equal false
194
- end
195
-
196
- it "not replace the environment" do
197
- env = Rack::MockRequest.env_for("/")
198
- app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, [inner_env.object_id.to_s]] })
199
-
200
- _, _, body = app.call(env)
201
-
202
- body.to_enum.to_a.must_equal [env.object_id.to_s]
203
- end
204
- end
@@ -1,24 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'stringio'
3
- require 'rack/lint'
4
- require 'rack/logger'
5
- require 'rack/mock'
6
-
7
- describe Rack::Logger do
8
- app = lambda { |env|
9
- log = env['rack.logger']
10
- log.debug("Created logger")
11
- log.info("Program started")
12
- log.warn("Nothing to do!")
13
-
14
- [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]]
15
- }
16
-
17
- it "conform to Rack::Lint" do
18
- errors = StringIO.new
19
- a = Rack::Lint.new(Rack::Logger.new(app))
20
- Rack::MockRequest.new(a).get('/', 'rack.errors' => errors)
21
- errors.string.must_match(/INFO -- : Program started/)
22
- errors.string.must_match(/WARN -- : Nothing to do/)
23
- end
24
- end
@@ -1,42 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'rack/media_type'
3
-
4
- describe Rack::MediaType do
5
- before { @empty_hash = {} }
6
-
7
- describe 'when content_type nil' do
8
- before { @content_type = nil }
9
-
10
- it '#type is nil' do
11
- Rack::MediaType.type(@content_type).must_be_nil
12
- end
13
-
14
- it '#params is empty' do
15
- Rack::MediaType.params(@content_type).must_equal @empty_hash
16
- end
17
- end
18
-
19
- describe 'when content_type contains only media_type' do
20
- before { @content_type = 'application/text' }
21
-
22
- it '#type is application/text' do
23
- Rack::MediaType.type(@content_type).must_equal 'application/text'
24
- end
25
-
26
- it '#params is empty' do
27
- Rack::MediaType.params(@content_type).must_equal @empty_hash
28
- end
29
- end
30
-
31
- describe 'when content_type contains media_type and params' do
32
- before { @content_type = 'application/text;CHARSET="utf-8"' }
33
-
34
- it '#type is application/text' do
35
- Rack::MediaType.type(@content_type).must_equal 'application/text'
36
- end
37
-
38
- it '#params has key "charset" with value "utf-8"' do
39
- Rack::MediaType.params(@content_type)['charset'].must_equal 'utf-8'
40
- end
41
- end
42
- end
@@ -1,96 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'stringio'
3
- require 'rack/method_override'
4
- require 'rack/mock'
5
-
6
- describe Rack::MethodOverride do
7
- def app
8
- Rack::Lint.new(Rack::MethodOverride.new(lambda {|e|
9
- [200, {"Content-Type" => "text/plain"}, []]
10
- }))
11
- end
12
-
13
- it "not affect GET requests" do
14
- env = Rack::MockRequest.env_for("/?_method=delete", :method => "GET")
15
- app.call env
16
-
17
- env["REQUEST_METHOD"].must_equal "GET"
18
- end
19
-
20
- it "modify REQUEST_METHOD for POST requests when _method parameter is set" do
21
- env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=put")
22
- app.call env
23
-
24
- env["REQUEST_METHOD"].must_equal "PUT"
25
- end
26
-
27
- it "modify REQUEST_METHOD for POST requests when X-HTTP-Method-Override is set" do
28
- env = Rack::MockRequest.env_for("/",
29
- :method => "POST",
30
- "HTTP_X_HTTP_METHOD_OVERRIDE" => "PATCH"
31
- )
32
- app.call env
33
-
34
- env["REQUEST_METHOD"].must_equal "PATCH"
35
- end
36
-
37
- it "not modify REQUEST_METHOD if the method is unknown" do
38
- env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=foo")
39
- app.call env
40
-
41
- env["REQUEST_METHOD"].must_equal "POST"
42
- end
43
-
44
- it "not modify REQUEST_METHOD when _method is nil" do
45
- env = Rack::MockRequest.env_for("/", :method => "POST", :input => "foo=bar")
46
- app.call env
47
-
48
- env["REQUEST_METHOD"].must_equal "POST"
49
- end
50
-
51
- it "store the original REQUEST_METHOD prior to overriding" do
52
- env = Rack::MockRequest.env_for("/",
53
- :method => "POST",
54
- :input => "_method=options")
55
- app.call env
56
-
57
- env["rack.methodoverride.original_method"].must_equal "POST"
58
- end
59
-
60
- it "not modify REQUEST_METHOD when given invalid multipart form data" do
61
- input = <<EOF
62
- --AaB03x\r
63
- content-disposition: form-data; name="huge"; filename="huge"\r
64
- EOF
65
- env = Rack::MockRequest.env_for("/",
66
- "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
67
- "CONTENT_LENGTH" => input.size.to_s,
68
- :method => "POST", :input => input)
69
- app.call env
70
-
71
- env["REQUEST_METHOD"].must_equal "POST"
72
- end
73
-
74
- it "writes error to RACK_ERRORS when given invalid multipart form data" do
75
- input = <<EOF
76
- --AaB03x\r
77
- content-disposition: form-data; name="huge"; filename="huge"\r
78
- EOF
79
- env = Rack::MockRequest.env_for("/",
80
- "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
81
- "CONTENT_LENGTH" => input.size.to_s,
82
- Rack::RACK_ERRORS => StringIO.new,
83
- :method => "POST", :input => input)
84
- Rack::MethodOverride.new(proc { [200, {"Content-Type" => "text/plain"}, []] }).call env
85
-
86
- env[Rack::RACK_ERRORS].rewind
87
- env[Rack::RACK_ERRORS].read.must_match /Bad request content body/
88
- end
89
-
90
- it "not modify REQUEST_METHOD for POST requests when the params are unparseable" do
91
- env = Rack::MockRequest.env_for("/", :method => "POST", :input => "(%bad-params%)")
92
- app.call env
93
-
94
- env["REQUEST_METHOD"].must_equal "POST"
95
- end
96
- end
@@ -1,51 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'rack/mime'
3
-
4
- describe Rack::Mime do
5
-
6
- it "should return the fallback mime-type for files with no extension" do
7
- fallback = 'image/jpg'
8
- Rack::Mime.mime_type(File.extname('no_ext'), fallback).must_equal fallback
9
- end
10
-
11
- it "should always return 'application/octet-stream' for unknown file extensions" do
12
- unknown_ext = File.extname('unknown_ext.abcdefg')
13
- Rack::Mime.mime_type(unknown_ext).must_equal 'application/octet-stream'
14
- end
15
-
16
- it "should return the mime-type for a given extension" do
17
- # sanity check. it would be infeasible test every single mime-type.
18
- Rack::Mime.mime_type(File.extname('image.jpg')).must_equal 'image/jpeg'
19
- end
20
-
21
- it "should support null fallbacks" do
22
- Rack::Mime.mime_type('.nothing', nil).must_be_nil
23
- end
24
-
25
- it "should match exact mimes" do
26
- Rack::Mime.match?('text/html', 'text/html').must_equal true
27
- Rack::Mime.match?('text/html', 'text/meme').must_equal false
28
- Rack::Mime.match?('text', 'text').must_equal true
29
- Rack::Mime.match?('text', 'binary').must_equal false
30
- end
31
-
32
- it "should match class wildcard mimes" do
33
- Rack::Mime.match?('text/html', 'text/*').must_equal true
34
- Rack::Mime.match?('text/plain', 'text/*').must_equal true
35
- Rack::Mime.match?('application/json', 'text/*').must_equal false
36
- Rack::Mime.match?('text/html', 'text').must_equal true
37
- end
38
-
39
- it "should match full wildcards" do
40
- Rack::Mime.match?('text/html', '*').must_equal true
41
- Rack::Mime.match?('text/plain', '*').must_equal true
42
- Rack::Mime.match?('text/html', '*/*').must_equal true
43
- Rack::Mime.match?('text/plain', '*/*').must_equal true
44
- end
45
-
46
- it "should match type wildcard mimes" do
47
- Rack::Mime.match?('text/html', '*/html').must_equal true
48
- Rack::Mime.match?('text/plain', '*/plain').must_equal true
49
- end
50
-
51
- end