rack 2.0.9.3 → 3.0.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 (201) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +808 -0
  3. data/CONTRIBUTING.md +142 -0
  4. data/{COPYING → MIT-LICENSE} +4 -2
  5. data/README.md +293 -0
  6. data/SPEC.rdoc +340 -0
  7. data/lib/rack/auth/abstract/handler.rb +6 -2
  8. data/lib/rack/auth/abstract/request.rb +4 -2
  9. data/lib/rack/auth/basic.rb +7 -4
  10. data/lib/rack/auth/digest/md5.rb +1 -129
  11. data/lib/rack/auth/digest/nonce.rb +1 -51
  12. data/lib/rack/auth/digest/params.rb +1 -52
  13. data/lib/rack/auth/digest/request.rb +1 -41
  14. data/lib/rack/auth/digest.rb +256 -0
  15. data/lib/rack/body_proxy.rb +18 -15
  16. data/lib/rack/builder.rb +151 -40
  17. data/lib/rack/cascade.rb +30 -12
  18. data/lib/rack/chunked.rb +74 -23
  19. data/lib/rack/common_logger.rb +49 -36
  20. data/lib/rack/conditional_get.rb +33 -26
  21. data/lib/rack/config.rb +2 -0
  22. data/lib/rack/constants.rb +63 -0
  23. data/lib/rack/content_length.rb +13 -16
  24. data/lib/rack/content_type.rb +12 -8
  25. data/lib/rack/deflater.rb +84 -45
  26. data/lib/rack/directory.rb +90 -64
  27. data/lib/rack/etag.rb +17 -23
  28. data/lib/rack/events.rb +23 -20
  29. data/lib/rack/file.rb +5 -172
  30. data/lib/rack/files.rb +216 -0
  31. data/lib/rack/head.rb +10 -9
  32. data/lib/rack/headers.rb +154 -0
  33. data/lib/rack/lint.rb +786 -645
  34. data/lib/rack/lock.rb +4 -6
  35. data/lib/rack/logger.rb +4 -0
  36. data/lib/rack/media_type.rb +10 -5
  37. data/lib/rack/method_override.rb +8 -2
  38. data/lib/rack/mime.rb +17 -1
  39. data/lib/rack/mock.rb +2 -195
  40. data/lib/rack/mock_request.rb +166 -0
  41. data/lib/rack/mock_response.rb +126 -0
  42. data/lib/rack/multipart/generator.rb +21 -15
  43. data/lib/rack/multipart/parser.rb +161 -118
  44. data/lib/rack/multipart/uploaded_file.rb +19 -7
  45. data/lib/rack/multipart.rb +23 -41
  46. data/lib/rack/null_logger.rb +11 -0
  47. data/lib/rack/query_parser.rb +126 -65
  48. data/lib/rack/recursive.rb +9 -5
  49. data/lib/rack/reloader.rb +6 -4
  50. data/lib/rack/request.rb +331 -74
  51. data/lib/rack/response.rb +223 -70
  52. data/lib/rack/rewindable_input.rb +28 -8
  53. data/lib/rack/runtime.rb +11 -8
  54. data/lib/rack/sendfile.rb +42 -33
  55. data/lib/rack/show_exceptions.rb +35 -18
  56. data/lib/rack/show_status.rb +25 -15
  57. data/lib/rack/static.rb +30 -18
  58. data/lib/rack/tempfile_reaper.rb +16 -5
  59. data/lib/rack/urlmap.rb +14 -6
  60. data/lib/rack/utils.rb +268 -260
  61. data/lib/rack/version.rb +34 -0
  62. data/lib/rack.rb +15 -92
  63. metadata +44 -207
  64. data/HISTORY.md +0 -520
  65. data/README.rdoc +0 -316
  66. data/Rakefile +0 -116
  67. data/SPEC +0 -263
  68. data/bin/rackup +0 -4
  69. data/contrib/rack.png +0 -0
  70. data/contrib/rack.svg +0 -150
  71. data/contrib/rack_logo.svg +0 -164
  72. data/contrib/rdoc.css +0 -412
  73. data/example/lobster.ru +0 -4
  74. data/example/protectedlobster.rb +0 -14
  75. data/example/protectedlobster.ru +0 -8
  76. data/lib/rack/handler/cgi.rb +0 -60
  77. data/lib/rack/handler/fastcgi.rb +0 -100
  78. data/lib/rack/handler/lsws.rb +0 -61
  79. data/lib/rack/handler/scgi.rb +0 -70
  80. data/lib/rack/handler/thin.rb +0 -36
  81. data/lib/rack/handler/webrick.rb +0 -120
  82. data/lib/rack/handler.rb +0 -99
  83. data/lib/rack/lobster.rb +0 -70
  84. data/lib/rack/server.rb +0 -395
  85. data/lib/rack/session/abstract/id.rb +0 -510
  86. data/lib/rack/session/cookie.rb +0 -204
  87. data/lib/rack/session/memcache.rb +0 -99
  88. data/lib/rack/session/pool.rb +0 -83
  89. data/rack.gemspec +0 -34
  90. data/test/builder/an_underscore_app.rb +0 -5
  91. data/test/builder/anything.rb +0 -5
  92. data/test/builder/comment.ru +0 -4
  93. data/test/builder/end.ru +0 -5
  94. data/test/builder/line.ru +0 -1
  95. data/test/builder/options.ru +0 -2
  96. data/test/cgi/assets/folder/test.js +0 -1
  97. data/test/cgi/assets/fonts/font.eot +0 -1
  98. data/test/cgi/assets/images/image.png +0 -1
  99. data/test/cgi/assets/index.html +0 -1
  100. data/test/cgi/assets/javascripts/app.js +0 -1
  101. data/test/cgi/assets/stylesheets/app.css +0 -1
  102. data/test/cgi/lighttpd.conf +0 -26
  103. data/test/cgi/rackup_stub.rb +0 -6
  104. data/test/cgi/sample_rackup.ru +0 -5
  105. data/test/cgi/test +0 -9
  106. data/test/cgi/test+directory/test+file +0 -1
  107. data/test/cgi/test.fcgi +0 -9
  108. data/test/cgi/test.gz +0 -0
  109. data/test/cgi/test.ru +0 -5
  110. data/test/gemloader.rb +0 -10
  111. data/test/helper.rb +0 -34
  112. data/test/multipart/bad_robots +0 -259
  113. data/test/multipart/binary +0 -0
  114. data/test/multipart/content_type_and_no_filename +0 -6
  115. data/test/multipart/empty +0 -10
  116. data/test/multipart/fail_16384_nofile +0 -814
  117. data/test/multipart/file1.txt +0 -1
  118. data/test/multipart/filename_and_modification_param +0 -7
  119. data/test/multipart/filename_and_no_name +0 -6
  120. data/test/multipart/filename_with_encoded_words +0 -7
  121. data/test/multipart/filename_with_escaped_quotes +0 -6
  122. data/test/multipart/filename_with_escaped_quotes_and_modification_param +0 -7
  123. data/test/multipart/filename_with_null_byte +0 -7
  124. data/test/multipart/filename_with_percent_escaped_quotes +0 -6
  125. data/test/multipart/filename_with_single_quote +0 -7
  126. data/test/multipart/filename_with_unescaped_percentages +0 -6
  127. data/test/multipart/filename_with_unescaped_percentages2 +0 -6
  128. data/test/multipart/filename_with_unescaped_percentages3 +0 -6
  129. data/test/multipart/filename_with_unescaped_quotes +0 -6
  130. data/test/multipart/ie +0 -6
  131. data/test/multipart/invalid_character +0 -6
  132. data/test/multipart/mixed_files +0 -21
  133. data/test/multipart/nested +0 -10
  134. data/test/multipart/none +0 -9
  135. data/test/multipart/quoted +0 -15
  136. data/test/multipart/rack-logo.png +0 -0
  137. data/test/multipart/semicolon +0 -6
  138. data/test/multipart/text +0 -15
  139. data/test/multipart/three_files_three_fields +0 -31
  140. data/test/multipart/unity3d_wwwform +0 -11
  141. data/test/multipart/webkit +0 -32
  142. data/test/rackup/config.ru +0 -31
  143. data/test/registering_handler/rack/handler/registering_myself.rb +0 -8
  144. data/test/spec_auth_basic.rb +0 -89
  145. data/test/spec_auth_digest.rb +0 -260
  146. data/test/spec_body_proxy.rb +0 -85
  147. data/test/spec_builder.rb +0 -233
  148. data/test/spec_cascade.rb +0 -63
  149. data/test/spec_cgi.rb +0 -84
  150. data/test/spec_chunked.rb +0 -103
  151. data/test/spec_common_logger.rb +0 -107
  152. data/test/spec_conditional_get.rb +0 -103
  153. data/test/spec_config.rb +0 -23
  154. data/test/spec_content_length.rb +0 -86
  155. data/test/spec_content_type.rb +0 -46
  156. data/test/spec_deflater.rb +0 -375
  157. data/test/spec_directory.rb +0 -148
  158. data/test/spec_etag.rb +0 -108
  159. data/test/spec_events.rb +0 -133
  160. data/test/spec_fastcgi.rb +0 -85
  161. data/test/spec_file.rb +0 -264
  162. data/test/spec_handler.rb +0 -57
  163. data/test/spec_head.rb +0 -46
  164. data/test/spec_lint.rb +0 -520
  165. data/test/spec_lobster.rb +0 -59
  166. data/test/spec_lock.rb +0 -204
  167. data/test/spec_logger.rb +0 -24
  168. data/test/spec_media_type.rb +0 -42
  169. data/test/spec_method_override.rb +0 -110
  170. data/test/spec_mime.rb +0 -51
  171. data/test/spec_mock.rb +0 -359
  172. data/test/spec_multipart.rb +0 -721
  173. data/test/spec_null_logger.rb +0 -21
  174. data/test/spec_recursive.rb +0 -75
  175. data/test/spec_request.rb +0 -1423
  176. data/test/spec_response.rb +0 -528
  177. data/test/spec_rewindable_input.rb +0 -128
  178. data/test/spec_runtime.rb +0 -50
  179. data/test/spec_sendfile.rb +0 -125
  180. data/test/spec_server.rb +0 -193
  181. data/test/spec_session_abstract_id.rb +0 -31
  182. data/test/spec_session_abstract_session_hash.rb +0 -45
  183. data/test/spec_session_cookie.rb +0 -442
  184. data/test/spec_session_memcache.rb +0 -357
  185. data/test/spec_session_persisted_secure_secure_session_hash.rb +0 -73
  186. data/test/spec_session_pool.rb +0 -247
  187. data/test/spec_show_exceptions.rb +0 -93
  188. data/test/spec_show_status.rb +0 -104
  189. data/test/spec_static.rb +0 -184
  190. data/test/spec_tempfile_reaper.rb +0 -64
  191. data/test/spec_thin.rb +0 -96
  192. data/test/spec_urlmap.rb +0 -237
  193. data/test/spec_utils.rb +0 -742
  194. data/test/spec_version.rb +0 -11
  195. data/test/spec_webrick.rb +0 -206
  196. data/test/static/another/index.html +0 -1
  197. data/test/static/foo.html +0 -1
  198. data/test/static/index.html +0 -1
  199. data/test/testrequest.rb +0 -78
  200. data/test/unregistered_handler/rack/handler/unregistered.rb +0 -7
  201. data/test/unregistered_handler/rack/handler/unregistered_long_one.rb +0 -7
@@ -1,148 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'rack/directory'
3
- require 'rack/lint'
4
- require 'rack/mock'
5
- require 'tempfile'
6
- require 'fileutils'
7
-
8
- describe Rack::Directory do
9
- DOCROOT = File.expand_path(File.dirname(__FILE__)) unless defined? DOCROOT
10
- FILE_CATCH = proc{|env| [200, {'Content-Type'=>'text/plain', "Content-Length" => "7"}, ['passed!']] }
11
-
12
- attr_reader :app
13
-
14
- def setup
15
- @app = Rack::Lint.new(Rack::Directory.new(DOCROOT, FILE_CATCH))
16
- end
17
-
18
- it 'serves directories with + in the name' do
19
- Dir.mktmpdir do |dir|
20
- plus_dir = "foo+bar"
21
- full_dir = File.join(dir, plus_dir)
22
- FileUtils.mkdir full_dir
23
- FileUtils.touch File.join(full_dir, "omg.txt")
24
- app = Rack::Directory.new(dir, FILE_CATCH)
25
- env = Rack::MockRequest.env_for("/#{plus_dir}/")
26
- status,_,body = app.call env
27
-
28
- assert_equal 200, status
29
-
30
- str = ''
31
- body.each { |x| str << x }
32
- assert_match "foo+bar", str
33
- end
34
- end
35
-
36
- it "serve directory indices" do
37
- res = Rack::MockRequest.new(Rack::Lint.new(app)).
38
- get("/cgi/")
39
-
40
- res.must_be :ok?
41
- assert_match(res, /<html><head>/)
42
- end
43
-
44
- it "pass to app if file found" do
45
- res = Rack::MockRequest.new(Rack::Lint.new(app)).
46
- get("/cgi/test")
47
-
48
- res.must_be :ok?
49
- assert_match(res, /passed!/)
50
- end
51
-
52
- it "serve uri with URL encoded filenames" do
53
- res = Rack::MockRequest.new(Rack::Lint.new(app)).
54
- get("/%63%67%69/") # "/cgi/test"
55
-
56
- res.must_be :ok?
57
- assert_match(res, /<html><head>/)
58
-
59
- res = Rack::MockRequest.new(Rack::Lint.new(app)).
60
- get("/cgi/%74%65%73%74") # "/cgi/test"
61
-
62
- res.must_be :ok?
63
- assert_match(res, /passed!/)
64
- end
65
-
66
- it "serve uri with URL encoded null byte (%00) in filenames" do
67
- res = Rack::MockRequest.new(Rack::Lint.new(app))
68
- .get("/cgi/test%00")
69
-
70
- res.must_be :bad_request?
71
- end
72
-
73
- it "not allow directory traversal" do
74
- res = Rack::MockRequest.new(Rack::Lint.new(app)).
75
- get("/cgi/../test")
76
-
77
- res.must_be :forbidden?
78
-
79
- res = Rack::MockRequest.new(Rack::Lint.new(app)).
80
- get("/cgi/%2E%2E/test")
81
-
82
- res.must_be :forbidden?
83
- end
84
-
85
- it "404 if it can't find the file" do
86
- res = Rack::MockRequest.new(Rack::Lint.new(app)).
87
- get("/cgi/blubb")
88
-
89
- res.must_be :not_found?
90
- end
91
-
92
- it "uri escape path parts" do # #265, properly escape file names
93
- mr = Rack::MockRequest.new(Rack::Lint.new(app))
94
-
95
- res = mr.get("/cgi/test%2bdirectory")
96
-
97
- res.must_be :ok?
98
- res.body.must_match(%r[/cgi/test\+directory/test\+file])
99
-
100
- res = mr.get("/cgi/test%2bdirectory/test%2bfile")
101
- res.must_be :ok?
102
- end
103
-
104
- it "correctly escape script name with spaces" do
105
- Dir.mktmpdir do |dir|
106
- space_dir = "foo bar"
107
- full_dir = File.join(dir, space_dir)
108
- FileUtils.mkdir full_dir
109
- FileUtils.touch File.join(full_dir, "omg omg.txt")
110
- app = Rack::Directory.new(dir, FILE_CATCH)
111
- env = Rack::MockRequest.env_for(Rack::Utils.escape_path("/#{space_dir}/"))
112
- status,_,body = app.call env
113
-
114
- assert_equal 200, status
115
-
116
- str = ''
117
- body.each { |x| str << x }
118
- assert_match "/foo%20bar/omg%20omg.txt", str
119
- end
120
- end
121
-
122
- it "correctly escape script name" do
123
- _app = app
124
- app2 = Rack::Builder.new do
125
- map '/script-path' do
126
- run _app
127
- end
128
- end
129
-
130
- mr = Rack::MockRequest.new(Rack::Lint.new(app2))
131
-
132
- res = mr.get("/script-path/cgi/test%2bdirectory")
133
-
134
- res.must_be :ok?
135
- res.body.must_match(%r[/script-path/cgi/test\+directory/test\+file])
136
-
137
- res = mr.get("/script-path/cgi/test+directory/test+file")
138
- res.must_be :ok?
139
- end
140
-
141
- it "return error when file not found for head request" do
142
- res = Rack::MockRequest.new(Rack::Lint.new(app)).
143
- head("/cgi/missing")
144
-
145
- res.must_be :not_found?
146
- res.body.must_be :empty?
147
- end
148
- end
data/test/spec_etag.rb DELETED
@@ -1,108 +0,0 @@
1
- require 'minitest/autorun'
2
- require 'rack/etag'
3
- require 'rack/lint'
4
- require 'rack/mock'
5
- require 'time'
6
-
7
- describe Rack::ETag do
8
- def etag(app, *args)
9
- Rack::Lint.new Rack::ETag.new(app, *args)
10
- end
11
-
12
- def request
13
- Rack::MockRequest.env_for
14
- end
15
-
16
- def sendfile_body
17
- res = ['Hello World']
18
- def res.to_path ; "/tmp/hello.txt" ; end
19
- res
20
- end
21
-
22
- it "set ETag if none is set if status is 200" do
23
- app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
24
- response = etag(app).call(request)
25
- response[1]['ETag'].must_equal "W/\"dffd6021bb2bd5b0af676290809ec3a5\""
26
- end
27
-
28
- it "set ETag if none is set if status is 201" do
29
- app = lambda { |env| [201, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
30
- response = etag(app).call(request)
31
- response[1]['ETag'].must_equal "W/\"dffd6021bb2bd5b0af676290809ec3a5\""
32
- end
33
-
34
- it "set Cache-Control to 'max-age=0, private, must-revalidate' (default) if none is set" do
35
- app = lambda { |env| [201, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
36
- response = etag(app).call(request)
37
- response[1]['Cache-Control'].must_equal 'max-age=0, private, must-revalidate'
38
- end
39
-
40
- it "set Cache-Control to chosen one if none is set" do
41
- app = lambda { |env| [201, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
42
- response = etag(app, nil, 'public').call(request)
43
- response[1]['Cache-Control'].must_equal 'public'
44
- end
45
-
46
- it "set a given Cache-Control even if digest could not be calculated" do
47
- app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, []] }
48
- response = etag(app, 'no-cache').call(request)
49
- response[1]['Cache-Control'].must_equal 'no-cache'
50
- end
51
-
52
- it "not set Cache-Control if it is already set" do
53
- app = lambda { |env| [201, {'Content-Type' => 'text/plain', 'Cache-Control' => 'public'}, ["Hello, World!"]] }
54
- response = etag(app).call(request)
55
- response[1]['Cache-Control'].must_equal 'public'
56
- end
57
-
58
- it "not set Cache-Control if directive isn't present" do
59
- app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
60
- response = etag(app, nil, nil).call(request)
61
- response[1]['Cache-Control'].must_be_nil
62
- end
63
-
64
- it "not change ETag if it is already set" do
65
- app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'ETag' => '"abc"'}, ["Hello, World!"]] }
66
- response = etag(app).call(request)
67
- response[1]['ETag'].must_equal "\"abc\""
68
- end
69
-
70
- it "not set ETag if body is empty" do
71
- app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Last-Modified' => Time.now.httpdate}, []] }
72
- response = etag(app).call(request)
73
- response[1]['ETag'].must_be_nil
74
- end
75
-
76
- it "not set ETag if Last-Modified is set" do
77
- app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Last-Modified' => Time.now.httpdate}, ["Hello, World!"]] }
78
- response = etag(app).call(request)
79
- response[1]['ETag'].must_be_nil
80
- end
81
-
82
- it "not set ETag if a sendfile_body is given" do
83
- app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, sendfile_body] }
84
- response = etag(app).call(request)
85
- response[1]['ETag'].must_be_nil
86
- end
87
-
88
- it "not set ETag if a status is not 200 or 201" do
89
- app = lambda { |env| [401, {'Content-Type' => 'text/plain'}, ['Access denied.']] }
90
- response = etag(app).call(request)
91
- response[1]['ETag'].must_be_nil
92
- end
93
-
94
- it "not set ETag if no-cache is given" do
95
- app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Cache-Control' => 'no-cache, must-revalidate'}, ['Hello, World!']] }
96
- response = etag(app).call(request)
97
- response[1]['ETag'].must_be_nil
98
- end
99
-
100
- it "close the original body" do
101
- body = StringIO.new
102
- app = lambda { |env| [200, {}, body] }
103
- response = etag(app).call(request)
104
- body.wont_be :closed?
105
- response[2].close
106
- body.must_be :closed?
107
- end
108
- end
data/test/spec_events.rb DELETED
@@ -1,133 +0,0 @@
1
- require 'helper'
2
- require 'rack/events'
3
-
4
- module Rack
5
- class TestEvents < Rack::TestCase
6
- class EventMiddleware
7
- attr_reader :events
8
-
9
- def initialize events
10
- @events = events
11
- end
12
-
13
- def on_start req, res
14
- events << [self, __method__]
15
- end
16
-
17
- def on_commit req, res
18
- events << [self, __method__]
19
- end
20
-
21
- def on_send req, res
22
- events << [self, __method__]
23
- end
24
-
25
- def on_finish req, res
26
- events << [self, __method__]
27
- end
28
-
29
- def on_error req, res, e
30
- events << [self, __method__]
31
- end
32
- end
33
-
34
- def test_events_fire
35
- events = []
36
- ret = [200, {}, []]
37
- app = lambda { |env| events << [app, :call]; ret }
38
- se = EventMiddleware.new events
39
- e = Events.new app, [se]
40
- triple = e.call({})
41
- response_body = []
42
- triple[2].each { |x| response_body << x }
43
- triple[2].close
44
- triple[2] = response_body
45
- assert_equal ret, triple
46
- assert_equal [[se, :on_start],
47
- [app, :call],
48
- [se, :on_commit],
49
- [se, :on_send],
50
- [se, :on_finish],
51
- ], events
52
- end
53
-
54
- def test_send_and_finish_are_not_run_until_body_is_sent
55
- events = []
56
- ret = [200, {}, []]
57
- app = lambda { |env| events << [app, :call]; ret }
58
- se = EventMiddleware.new events
59
- e = Events.new app, [se]
60
- triple = e.call({})
61
- assert_equal [[se, :on_start],
62
- [app, :call],
63
- [se, :on_commit],
64
- ], events
65
- end
66
-
67
- def test_send_is_called_on_each
68
- events = []
69
- ret = [200, {}, []]
70
- app = lambda { |env| events << [app, :call]; ret }
71
- se = EventMiddleware.new events
72
- e = Events.new app, [se]
73
- triple = e.call({})
74
- triple[2].each { |x| }
75
- assert_equal [[se, :on_start],
76
- [app, :call],
77
- [se, :on_commit],
78
- [se, :on_send],
79
- ], events
80
- end
81
-
82
- def test_finish_is_called_on_close
83
- events = []
84
- ret = [200, {}, []]
85
- app = lambda { |env| events << [app, :call]; ret }
86
- se = EventMiddleware.new events
87
- e = Events.new app, [se]
88
- triple = e.call({})
89
- triple[2].each { |x| }
90
- triple[2].close
91
- assert_equal [[se, :on_start],
92
- [app, :call],
93
- [se, :on_commit],
94
- [se, :on_send],
95
- [se, :on_finish],
96
- ], events
97
- end
98
-
99
- def test_finish_is_called_in_reverse_order
100
- events = []
101
- ret = [200, {}, []]
102
- app = lambda { |env| events << [app, :call]; ret }
103
- se1 = EventMiddleware.new events
104
- se2 = EventMiddleware.new events
105
- se3 = EventMiddleware.new events
106
-
107
- e = Events.new app, [se1, se2, se3]
108
- triple = e.call({})
109
- triple[2].each { |x| }
110
- triple[2].close
111
-
112
- groups = events.group_by { |x| x.last }
113
- assert_equal groups[:on_start].map(&:first), groups[:on_finish].map(&:first).reverse
114
- assert_equal groups[:on_commit].map(&:first), groups[:on_finish].map(&:first)
115
- assert_equal groups[:on_send].map(&:first), groups[:on_finish].map(&:first)
116
- end
117
-
118
- def test_finish_is_called_if_there_is_an_exception
119
- events = []
120
- ret = [200, {}, []]
121
- app = lambda { |env| raise }
122
- se = EventMiddleware.new events
123
- e = Events.new app, [se]
124
- assert_raises(RuntimeError) do
125
- e.call({})
126
- end
127
- assert_equal [[se, :on_start],
128
- [se, :on_error],
129
- [se, :on_finish],
130
- ], events
131
- end
132
- end
133
- end
data/test/spec_fastcgi.rb DELETED
@@ -1,85 +0,0 @@
1
- require 'helper'
2
-
3
- if defined? LIGHTTPD_PID
4
-
5
- require File.expand_path('../testrequest', __FILE__)
6
- require 'rack/handler/fastcgi'
7
-
8
- describe Rack::Handler::FastCGI do
9
- include TestRequest::Helpers
10
-
11
- before do
12
- @host = '127.0.0.1'
13
- @port = 9203
14
- end
15
-
16
- it "respond" do
17
- sleep 1
18
- GET("/test")
19
- response.wont_be :nil?
20
- end
21
-
22
- it "respond via rackup server" do
23
- GET("/sample_rackup.ru")
24
- status.must_equal 200
25
- end
26
-
27
- it "be a lighttpd" do
28
- GET("/test.fcgi")
29
- status.must_equal 200
30
- response["SERVER_SOFTWARE"].must_match(/lighttpd/)
31
- response["HTTP_VERSION"].must_equal "HTTP/1.1"
32
- response["SERVER_PROTOCOL"].must_equal "HTTP/1.1"
33
- response["SERVER_PORT"].must_equal @port.to_s
34
- response["SERVER_NAME"].must_equal @host
35
- end
36
-
37
- it "have rack headers" do
38
- GET("/test.fcgi")
39
- response["rack.version"].must_equal [1,3]
40
- assert_equal false, response["rack.multithread"]
41
- assert_equal true, response["rack.multiprocess"]
42
- assert_equal false, response["rack.run_once"]
43
- end
44
-
45
- it "have CGI headers on GET" do
46
- GET("/test.fcgi")
47
- response["REQUEST_METHOD"].must_equal "GET"
48
- response["SCRIPT_NAME"].must_equal "/test.fcgi"
49
- response["REQUEST_PATH"].must_equal "/"
50
- response["PATH_INFO"].must_equal ""
51
- response["QUERY_STRING"].must_equal ""
52
- response["test.postdata"].must_equal ""
53
-
54
- GET("/test.fcgi/foo?quux=1")
55
- response["REQUEST_METHOD"].must_equal "GET"
56
- response["SCRIPT_NAME"].must_equal "/test.fcgi"
57
- response["REQUEST_PATH"].must_equal "/"
58
- response["PATH_INFO"].must_equal "/foo"
59
- response["QUERY_STRING"].must_equal "quux=1"
60
- end
61
-
62
- it "have CGI headers on POST" do
63
- POST("/test.fcgi", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
64
- status.must_equal 200
65
- response["REQUEST_METHOD"].must_equal "POST"
66
- response["SCRIPT_NAME"].must_equal "/test.fcgi"
67
- response["REQUEST_PATH"].must_equal "/"
68
- response["QUERY_STRING"].must_equal ""
69
- response["HTTP_X_TEST_HEADER"].must_equal "42"
70
- response["test.postdata"].must_equal "rack-form-data=23"
71
- end
72
-
73
- it "support HTTP auth" do
74
- GET("/test.fcgi", {:user => "ruth", :passwd => "secret"})
75
- response["HTTP_AUTHORIZATION"].must_equal "Basic cnV0aDpzZWNyZXQ="
76
- end
77
-
78
- it "set status" do
79
- GET("/test.fcgi?secret")
80
- status.must_equal 403
81
- response["rack.url_scheme"].must_equal "http"
82
- end
83
- end
84
-
85
- end # if defined? LIGHTTPD_PID