rack 1.0.1 → 2.2.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +829 -0
- data/CONTRIBUTING.md +136 -0
- data/{COPYING → MIT-LICENSE} +4 -2
- data/README.rdoc +355 -0
- data/Rakefile +64 -98
- data/SPEC.rdoc +292 -0
- data/bin/rackup +3 -174
- data/contrib/rack.png +0 -0
- data/contrib/rack.svg +150 -0
- data/contrib/rack_logo.svg +164 -111
- data/contrib/rdoc.css +412 -0
- data/example/lobster.ru +2 -0
- data/example/protectedlobster.rb +4 -2
- data/example/protectedlobster.ru +3 -1
- data/lib/rack/auth/abstract/handler.rb +7 -5
- data/lib/rack/auth/abstract/request.rb +12 -2
- data/lib/rack/auth/basic.rb +6 -4
- data/lib/rack/auth/digest/md5.rb +20 -13
- data/lib/rack/auth/digest/nonce.rb +6 -4
- data/lib/rack/auth/digest/params.rb +11 -12
- data/lib/rack/auth/digest/request.rb +15 -12
- data/lib/rack/body_proxy.rb +45 -0
- data/lib/rack/builder.rb +213 -19
- data/lib/rack/cascade.rb +50 -18
- data/lib/rack/chunked.rb +95 -27
- data/lib/rack/common_logger.rb +84 -0
- data/lib/rack/conditional_get.rb +83 -0
- data/lib/rack/config.rb +22 -0
- data/lib/rack/content_length.rb +19 -10
- data/lib/rack/content_type.rb +12 -5
- data/lib/rack/core_ext/regexp.rb +14 -0
- data/lib/rack/deflater.rb +90 -42
- data/lib/rack/directory.rb +118 -72
- data/lib/rack/etag.rb +77 -0
- data/lib/rack/events.rb +153 -0
- data/lib/rack/file.rb +4 -85
- data/lib/rack/files.rb +218 -0
- data/lib/rack/handler/cgi.rb +22 -24
- data/lib/rack/handler/fastcgi.rb +34 -24
- data/lib/rack/handler/lsws.rb +16 -15
- data/lib/rack/handler/scgi.rb +38 -29
- data/lib/rack/handler/thin.rb +23 -7
- data/lib/rack/handler/webrick.rb +95 -37
- data/lib/rack/handler.rb +49 -14
- data/lib/rack/head.rb +19 -13
- data/lib/rack/lint.rb +466 -217
- data/lib/rack/lobster.rb +19 -14
- data/lib/rack/lock.rb +24 -8
- data/lib/rack/logger.rb +20 -0
- data/lib/rack/media_type.rb +53 -0
- data/lib/rack/method_override.rb +52 -0
- data/lib/rack/mime.rb +652 -171
- data/lib/rack/mock.rb +203 -64
- data/lib/rack/multipart/generator.rb +97 -0
- data/lib/rack/multipart/parser.rb +440 -0
- data/lib/rack/multipart/uploaded_file.rb +41 -0
- data/lib/rack/multipart.rb +64 -0
- data/lib/rack/null_logger.rb +39 -0
- data/lib/rack/query_parser.rb +266 -0
- data/lib/rack/recursive.rb +18 -11
- data/lib/rack/reloader.rb +13 -5
- data/lib/rack/request.rb +607 -191
- data/lib/rack/response.rb +245 -110
- data/lib/rack/rewindable_input.rb +15 -21
- data/lib/rack/runtime.rb +34 -0
- data/lib/rack/sendfile.rb +192 -0
- data/lib/rack/server.rb +466 -0
- data/lib/rack/session/abstract/id.rb +449 -68
- data/lib/rack/session/cookie.rb +159 -47
- data/lib/rack/session/memcache.rb +4 -103
- data/lib/rack/session/pool.rb +39 -49
- data/lib/rack/show_exceptions.rb +390 -0
- data/lib/rack/{showstatus.rb → show_status.rb} +21 -14
- data/lib/rack/static.rb +164 -14
- data/lib/rack/tempfile_reaper.rb +22 -0
- data/lib/rack/urlmap.rb +60 -18
- data/lib/rack/utils.rb +508 -277
- data/lib/rack/version.rb +29 -0
- data/lib/rack.rb +85 -34
- data/rack.gemspec +43 -51
- metadata +119 -207
- data/KNOWN-ISSUES +0 -18
- data/RDOX +0 -428
- data/README +0 -364
- data/SPEC +0 -164
- data/lib/rack/adapter/camping.rb +0 -22
- data/lib/rack/auth/openid.rb +0 -480
- data/lib/rack/commonlogger.rb +0 -61
- data/lib/rack/conditionalget.rb +0 -47
- data/lib/rack/handler/evented_mongrel.rb +0 -8
- data/lib/rack/handler/mongrel.rb +0 -87
- data/lib/rack/handler/swiftiplied_mongrel.rb +0 -8
- data/lib/rack/methodoverride.rb +0 -27
- data/lib/rack/showexceptions.rb +0 -349
- data/test/cgi/lighttpd.conf +0 -20
- data/test/cgi/test +0 -9
- data/test/cgi/test.fcgi +0 -8
- data/test/cgi/test.ru +0 -7
- data/test/multipart/binary +0 -0
- data/test/multipart/empty +0 -10
- data/test/multipart/ie +0 -6
- data/test/multipart/nested +0 -10
- data/test/multipart/none +0 -9
- data/test/multipart/semicolon +0 -6
- data/test/multipart/text +0 -10
- data/test/spec_rack_auth_basic.rb +0 -73
- data/test/spec_rack_auth_digest.rb +0 -226
- data/test/spec_rack_auth_openid.rb +0 -84
- data/test/spec_rack_builder.rb +0 -84
- data/test/spec_rack_camping.rb +0 -51
- data/test/spec_rack_cascade.rb +0 -50
- data/test/spec_rack_cgi.rb +0 -89
- data/test/spec_rack_chunked.rb +0 -62
- data/test/spec_rack_commonlogger.rb +0 -32
- data/test/spec_rack_conditionalget.rb +0 -41
- data/test/spec_rack_content_length.rb +0 -43
- data/test/spec_rack_content_type.rb +0 -30
- data/test/spec_rack_deflater.rb +0 -127
- data/test/spec_rack_directory.rb +0 -61
- data/test/spec_rack_fastcgi.rb +0 -89
- data/test/spec_rack_file.rb +0 -75
- data/test/spec_rack_handler.rb +0 -43
- data/test/spec_rack_head.rb +0 -30
- data/test/spec_rack_lint.rb +0 -521
- data/test/spec_rack_lobster.rb +0 -45
- data/test/spec_rack_lock.rb +0 -38
- data/test/spec_rack_methodoverride.rb +0 -60
- data/test/spec_rack_mock.rb +0 -157
- data/test/spec_rack_mongrel.rb +0 -189
- data/test/spec_rack_recursive.rb +0 -77
- data/test/spec_rack_request.rb +0 -504
- data/test/spec_rack_response.rb +0 -218
- data/test/spec_rack_rewindable_input.rb +0 -118
- data/test/spec_rack_session_cookie.rb +0 -82
- data/test/spec_rack_session_memcache.rb +0 -240
- data/test/spec_rack_session_pool.rb +0 -172
- data/test/spec_rack_showexceptions.rb +0 -21
- data/test/spec_rack_showstatus.rb +0 -72
- data/test/spec_rack_static.rb +0 -37
- data/test/spec_rack_thin.rb +0 -91
- data/test/spec_rack_urlmap.rb +0 -185
- data/test/spec_rack_utils.rb +0 -387
- data/test/spec_rack_webrick.rb +0 -130
- data/test/testrequest.rb +0 -57
- data/test/unregistered_handler/rack/handler/unregistered.rb +0 -7
- data/test/unregistered_handler/rack/handler/unregistered_long_one.rb +0 -7
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
require 'test/spec'
|
|
2
|
-
|
|
3
|
-
require 'rack/auth/digest/md5'
|
|
4
|
-
require 'rack/mock'
|
|
5
|
-
|
|
6
|
-
context 'Rack::Auth::Digest::MD5' do
|
|
7
|
-
|
|
8
|
-
def realm
|
|
9
|
-
'WallysWorld'
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def unprotected_app
|
|
13
|
-
lambda do |env|
|
|
14
|
-
[ 200, {'Content-Type' => 'text/plain'}, ["Hi #{env['REMOTE_USER']}"] ]
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def protected_app
|
|
19
|
-
app = Rack::Auth::Digest::MD5.new(unprotected_app) do |username|
|
|
20
|
-
{ 'Alice' => 'correct-password' }[username]
|
|
21
|
-
end
|
|
22
|
-
app.realm = realm
|
|
23
|
-
app.opaque = 'this-should-be-secret'
|
|
24
|
-
app
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def protected_app_with_hashed_passwords
|
|
28
|
-
app = Rack::Auth::Digest::MD5.new(unprotected_app) do |username|
|
|
29
|
-
username == 'Alice' ? Digest::MD5.hexdigest("Alice:#{realm}:correct-password") : nil
|
|
30
|
-
end
|
|
31
|
-
app.realm = realm
|
|
32
|
-
app.opaque = 'this-should-be-secret'
|
|
33
|
-
app.passwords_hashed = true
|
|
34
|
-
app
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def partially_protected_app
|
|
38
|
-
Rack::URLMap.new({
|
|
39
|
-
'/' => unprotected_app,
|
|
40
|
-
'/protected' => protected_app
|
|
41
|
-
})
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def protected_app_with_method_override
|
|
45
|
-
Rack::MethodOverride.new(protected_app)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
setup do
|
|
49
|
-
@request = Rack::MockRequest.new(protected_app)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def request(method, path, headers = {}, &block)
|
|
53
|
-
response = @request.request(method, path, headers)
|
|
54
|
-
block.call(response) if block
|
|
55
|
-
return response
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
class MockDigestRequest
|
|
59
|
-
def initialize(params)
|
|
60
|
-
@params = params
|
|
61
|
-
end
|
|
62
|
-
def method_missing(sym)
|
|
63
|
-
if @params.has_key? k = sym.to_s
|
|
64
|
-
return @params[k]
|
|
65
|
-
end
|
|
66
|
-
super
|
|
67
|
-
end
|
|
68
|
-
def method
|
|
69
|
-
@params['method']
|
|
70
|
-
end
|
|
71
|
-
def response(password)
|
|
72
|
-
Rack::Auth::Digest::MD5.new(nil).send :digest, self, password
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def request_with_digest_auth(method, path, username, password, options = {}, &block)
|
|
77
|
-
request_options = {}
|
|
78
|
-
request_options[:input] = options.delete(:input) if options.include? :input
|
|
79
|
-
|
|
80
|
-
response = request(method, path, request_options)
|
|
81
|
-
|
|
82
|
-
return response unless response.status == 401
|
|
83
|
-
|
|
84
|
-
if wait = options.delete(:wait)
|
|
85
|
-
sleep wait
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
challenge = response['WWW-Authenticate'].split(' ', 2).last
|
|
89
|
-
|
|
90
|
-
params = Rack::Auth::Digest::Params.parse(challenge)
|
|
91
|
-
|
|
92
|
-
params['username'] = username
|
|
93
|
-
params['nc'] = '00000001'
|
|
94
|
-
params['cnonce'] = 'nonsensenonce'
|
|
95
|
-
params['uri'] = path
|
|
96
|
-
|
|
97
|
-
params['method'] = method
|
|
98
|
-
|
|
99
|
-
params.update options
|
|
100
|
-
|
|
101
|
-
params['response'] = MockDigestRequest.new(params).response(password)
|
|
102
|
-
|
|
103
|
-
request(method, path, request_options.merge('HTTP_AUTHORIZATION' => "Digest #{params}"), &block)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def assert_digest_auth_challenge(response)
|
|
107
|
-
response.should.be.a.client_error
|
|
108
|
-
response.status.should.equal 401
|
|
109
|
-
response.should.include 'WWW-Authenticate'
|
|
110
|
-
response.headers['WWW-Authenticate'].should =~ /^Digest /
|
|
111
|
-
response.body.should.be.empty
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def assert_bad_request(response)
|
|
115
|
-
response.should.be.a.client_error
|
|
116
|
-
response.status.should.equal 400
|
|
117
|
-
response.should.not.include 'WWW-Authenticate'
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
specify 'should challenge when no credentials are specified' do
|
|
121
|
-
request 'GET', '/' do |response|
|
|
122
|
-
assert_digest_auth_challenge response
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
specify 'should return application output if correct credentials given' do
|
|
127
|
-
request_with_digest_auth 'GET', '/', 'Alice', 'correct-password' do |response|
|
|
128
|
-
response.status.should.equal 200
|
|
129
|
-
response.body.to_s.should.equal 'Hi Alice'
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
specify 'should return application output if correct credentials given (hashed passwords)' do
|
|
134
|
-
@request = Rack::MockRequest.new(protected_app_with_hashed_passwords)
|
|
135
|
-
|
|
136
|
-
request_with_digest_auth 'GET', '/', 'Alice', 'correct-password' do |response|
|
|
137
|
-
response.status.should.equal 200
|
|
138
|
-
response.body.to_s.should.equal 'Hi Alice'
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
specify 'should rechallenge if incorrect username given' do
|
|
143
|
-
request_with_digest_auth 'GET', '/', 'Bob', 'correct-password' do |response|
|
|
144
|
-
assert_digest_auth_challenge response
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
specify 'should rechallenge if incorrect password given' do
|
|
149
|
-
request_with_digest_auth 'GET', '/', 'Alice', 'wrong-password' do |response|
|
|
150
|
-
assert_digest_auth_challenge response
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
specify 'should rechallenge with stale parameter if nonce is stale' do
|
|
155
|
-
begin
|
|
156
|
-
Rack::Auth::Digest::Nonce.time_limit = 1
|
|
157
|
-
|
|
158
|
-
request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', :wait => 2 do |response|
|
|
159
|
-
assert_digest_auth_challenge response
|
|
160
|
-
response.headers['WWW-Authenticate'].should =~ /\bstale=true\b/
|
|
161
|
-
end
|
|
162
|
-
ensure
|
|
163
|
-
Rack::Auth::Digest::Nonce.time_limit = nil
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
specify 'should return 400 Bad Request if incorrect qop given' do
|
|
168
|
-
request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', 'qop' => 'auth-int' do |response|
|
|
169
|
-
assert_bad_request response
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
specify 'should return 400 Bad Request if incorrect uri given' do
|
|
174
|
-
request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', 'uri' => '/foo' do |response|
|
|
175
|
-
assert_bad_request response
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
specify 'should return 400 Bad Request if different auth scheme used' do
|
|
180
|
-
request 'GET', '/', 'HTTP_AUTHORIZATION' => 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==' do |response|
|
|
181
|
-
assert_bad_request response
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
specify 'should not require credentials for unprotected path' do
|
|
186
|
-
@request = Rack::MockRequest.new(partially_protected_app)
|
|
187
|
-
request 'GET', '/' do |response|
|
|
188
|
-
response.should.be.ok
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
specify 'should challenge when no credentials are specified for protected path' do
|
|
193
|
-
@request = Rack::MockRequest.new(partially_protected_app)
|
|
194
|
-
request 'GET', '/protected' do |response|
|
|
195
|
-
assert_digest_auth_challenge response
|
|
196
|
-
end
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
specify 'should return application output if correct credentials given for protected path' do
|
|
200
|
-
@request = Rack::MockRequest.new(partially_protected_app)
|
|
201
|
-
request_with_digest_auth 'GET', '/protected', 'Alice', 'correct-password' do |response|
|
|
202
|
-
response.status.should.equal 200
|
|
203
|
-
response.body.to_s.should.equal 'Hi Alice'
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
specify 'should return application output if correct credentials given for POST' do
|
|
208
|
-
request_with_digest_auth 'POST', '/', 'Alice', 'correct-password' do |response|
|
|
209
|
-
response.status.should.equal 200
|
|
210
|
-
response.body.to_s.should.equal 'Hi Alice'
|
|
211
|
-
end
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
specify 'should return application output if correct credentials given for PUT (using method override of POST)' do
|
|
215
|
-
@request = Rack::MockRequest.new(protected_app_with_method_override)
|
|
216
|
-
request_with_digest_auth 'POST', '/', 'Alice', 'correct-password', :input => "_method=put" do |response|
|
|
217
|
-
response.status.should.equal 200
|
|
218
|
-
response.body.to_s.should.equal 'Hi Alice'
|
|
219
|
-
end
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
specify 'realm as optional constructor arg' do
|
|
223
|
-
app = Rack::Auth::Digest::MD5.new(unprotected_app, realm) { true }
|
|
224
|
-
assert_equal realm, app.realm
|
|
225
|
-
end
|
|
226
|
-
end
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
require 'test/spec'
|
|
2
|
-
|
|
3
|
-
begin
|
|
4
|
-
# requires the ruby-openid gem
|
|
5
|
-
require 'rack/auth/openid'
|
|
6
|
-
|
|
7
|
-
context "Rack::Auth::OpenID" do
|
|
8
|
-
OID = Rack::Auth::OpenID
|
|
9
|
-
host = 'host'
|
|
10
|
-
subd = 'sub.host'
|
|
11
|
-
wild = '*.host'
|
|
12
|
-
path = 'path'
|
|
13
|
-
long = 'path/long'
|
|
14
|
-
scheme = 'http://'
|
|
15
|
-
realm = scheme+host+'/'+path
|
|
16
|
-
|
|
17
|
-
specify 'realm uri should be valid' do
|
|
18
|
-
lambda{OID.new('/'+path)}.should.raise ArgumentError
|
|
19
|
-
lambda{OID.new('/'+long)}.should.raise ArgumentError
|
|
20
|
-
lambda{OID.new(scheme+host)}.should.not.raise
|
|
21
|
-
lambda{OID.new(scheme+host+'/')}.should.not.raise
|
|
22
|
-
lambda{OID.new(scheme+host+'/'+path)}.should.not.raise
|
|
23
|
-
lambda{OID.new(scheme+subd)}.should.not.raise
|
|
24
|
-
lambda{OID.new(scheme+subd+'/')}.should.not.raise
|
|
25
|
-
lambda{OID.new(scheme+subd+'/'+path)}.should.not.raise
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
specify 'should be able to check if a uri is within the realm' do
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
specify 'return_to should be valid' do
|
|
32
|
-
uri = '/'+path
|
|
33
|
-
lambda{OID.new(realm, :return_to=>uri)}.should.raise ArgumentError
|
|
34
|
-
uri = '/'+long
|
|
35
|
-
lambda{OID.new(realm, :return_to=>uri)}.should.raise ArgumentError
|
|
36
|
-
uri = scheme+host
|
|
37
|
-
lambda{OID.new(realm, :return_to=>uri)}.should.raise ArgumentError
|
|
38
|
-
uri = scheme+host+'/'+path
|
|
39
|
-
lambda{OID.new(realm, :return_to=>uri)}.should.not.raise
|
|
40
|
-
uri = scheme+subd+'/'+path
|
|
41
|
-
lambda{OID.new(realm, :return_to=>uri)}.should.raise ArgumentError
|
|
42
|
-
uri = scheme+host+'/'+long
|
|
43
|
-
lambda{OID.new(realm, :return_to=>uri)}.should.not.raise
|
|
44
|
-
uri = scheme+subd+'/'+long
|
|
45
|
-
lambda{OID.new(realm, :return_to=>uri)}.should.raise ArgumentError
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
specify 'extensions should have required constants defined' do
|
|
49
|
-
badext = Rack::Auth::OpenID::BadExtension
|
|
50
|
-
ext = Object.new
|
|
51
|
-
lambda{OID.new(realm).add_extension(ext)}.should.raise(badext)
|
|
52
|
-
ext = Module.new
|
|
53
|
-
lambda{OID.new(realm).add_extension(ext)}.should.raise(badext)
|
|
54
|
-
ext::Request = nil
|
|
55
|
-
lambda{OID.new(realm).add_extension(ext)}.should.raise(badext)
|
|
56
|
-
ext::Response = nil
|
|
57
|
-
lambda{OID.new(realm).add_extension(ext)}.should.raise(badext)
|
|
58
|
-
ext::NS_URI = nil
|
|
59
|
-
lambda{OID.new(realm).add_extension(ext)}.should.raise(badext)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
specify 'extensions should have Request and Response defined and inherit from OpenID::Extension' do
|
|
63
|
-
$-w, w = nil, $-w # yuck
|
|
64
|
-
badext = Rack::Auth::OpenID::BadExtension
|
|
65
|
-
ext = Module.new
|
|
66
|
-
ext::Request = nil
|
|
67
|
-
ext::Response = nil
|
|
68
|
-
ext::NS_URI = nil
|
|
69
|
-
lambda{OID.new(realm).add_extension(ext)}.should.raise(badext)
|
|
70
|
-
ext::Request = Class.new()
|
|
71
|
-
lambda{OID.new(realm).add_extension(ext)}.should.raise(badext)
|
|
72
|
-
ext::Response = Class.new()
|
|
73
|
-
lambda{OID.new(realm).add_extension(ext)}.should.raise(badext)
|
|
74
|
-
ext::Request = Class.new(::OpenID::Extension)
|
|
75
|
-
lambda{OID.new(realm).add_extension(ext)}.should.raise(badext)
|
|
76
|
-
ext::Response = Class.new(::OpenID::Extension)
|
|
77
|
-
lambda{OID.new(realm).add_extension(ext)}.should.raise(badext)
|
|
78
|
-
$-w = w
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
rescue LoadError
|
|
83
|
-
$stderr.puts "Skipping Rack::Auth::OpenID tests (ruby-openid 2 is required). `gem install ruby-openid` and try again."
|
|
84
|
-
end
|
data/test/spec_rack_builder.rb
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
require 'test/spec'
|
|
2
|
-
|
|
3
|
-
require 'rack/builder'
|
|
4
|
-
require 'rack/mock'
|
|
5
|
-
require 'rack/showexceptions'
|
|
6
|
-
require 'rack/auth/basic'
|
|
7
|
-
|
|
8
|
-
context "Rack::Builder" do
|
|
9
|
-
specify "chains apps by default" do
|
|
10
|
-
app = Rack::Builder.new do
|
|
11
|
-
use Rack::ShowExceptions
|
|
12
|
-
run lambda { |env| raise "bzzzt" }
|
|
13
|
-
end.to_app
|
|
14
|
-
|
|
15
|
-
Rack::MockRequest.new(app).get("/").should.be.server_error
|
|
16
|
-
Rack::MockRequest.new(app).get("/").should.be.server_error
|
|
17
|
-
Rack::MockRequest.new(app).get("/").should.be.server_error
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
specify "has implicit #to_app" do
|
|
21
|
-
app = Rack::Builder.new do
|
|
22
|
-
use Rack::ShowExceptions
|
|
23
|
-
run lambda { |env| raise "bzzzt" }
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
Rack::MockRequest.new(app).get("/").should.be.server_error
|
|
27
|
-
Rack::MockRequest.new(app).get("/").should.be.server_error
|
|
28
|
-
Rack::MockRequest.new(app).get("/").should.be.server_error
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
specify "supports blocks on use" do
|
|
32
|
-
app = Rack::Builder.new do
|
|
33
|
-
use Rack::ShowExceptions
|
|
34
|
-
use Rack::Auth::Basic do |username, password|
|
|
35
|
-
'secret' == password
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
run lambda { |env| [200, {}, ['Hi Boss']] }
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
response = Rack::MockRequest.new(app).get("/")
|
|
42
|
-
response.should.be.client_error
|
|
43
|
-
response.status.should.equal 401
|
|
44
|
-
|
|
45
|
-
# with auth...
|
|
46
|
-
response = Rack::MockRequest.new(app).get("/",
|
|
47
|
-
'HTTP_AUTHORIZATION' => 'Basic ' + ["joe:secret"].pack("m*"))
|
|
48
|
-
response.status.should.equal 200
|
|
49
|
-
response.body.to_s.should.equal 'Hi Boss'
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
specify "has explicit #to_app" do
|
|
53
|
-
app = Rack::Builder.app do
|
|
54
|
-
use Rack::ShowExceptions
|
|
55
|
-
run lambda { |env| raise "bzzzt" }
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
Rack::MockRequest.new(app).get("/").should.be.server_error
|
|
59
|
-
Rack::MockRequest.new(app).get("/").should.be.server_error
|
|
60
|
-
Rack::MockRequest.new(app).get("/").should.be.server_error
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
specify "apps are initialized once" do
|
|
64
|
-
app = Rack::Builder.new do
|
|
65
|
-
class AppClass
|
|
66
|
-
def initialize
|
|
67
|
-
@called = 0
|
|
68
|
-
end
|
|
69
|
-
def call(env)
|
|
70
|
-
raise "bzzzt" if @called > 0
|
|
71
|
-
@called += 1
|
|
72
|
-
[200, {'Content-Type' => 'text/plain'}, ['OK']]
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
use Rack::ShowExceptions
|
|
77
|
-
run AppClass.new
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
Rack::MockRequest.new(app).get("/").status.should.equal 200
|
|
81
|
-
Rack::MockRequest.new(app).get("/").should.be.server_error
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
end
|
data/test/spec_rack_camping.rb
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
require 'test/spec'
|
|
2
|
-
require 'stringio'
|
|
3
|
-
require 'uri'
|
|
4
|
-
|
|
5
|
-
begin
|
|
6
|
-
require 'rack/mock'
|
|
7
|
-
|
|
8
|
-
$-w, w = nil, $-w # yuck
|
|
9
|
-
require 'camping'
|
|
10
|
-
require 'rack/adapter/camping'
|
|
11
|
-
|
|
12
|
-
Camping.goes :CampApp
|
|
13
|
-
module CampApp
|
|
14
|
-
module Controllers
|
|
15
|
-
class HW < R('/')
|
|
16
|
-
def get
|
|
17
|
-
@headers["X-Served-By"] = URI("http://rack.rubyforge.org")
|
|
18
|
-
"Camping works!"
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def post
|
|
22
|
-
"Data: #{input.foo}"
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
$-w = w
|
|
28
|
-
|
|
29
|
-
context "Rack::Adapter::Camping" do
|
|
30
|
-
specify "works with GET" do
|
|
31
|
-
res = Rack::MockRequest.new(Rack::Adapter::Camping.new(CampApp)).
|
|
32
|
-
get("/")
|
|
33
|
-
|
|
34
|
-
res.should.be.ok
|
|
35
|
-
res["Content-Type"].should.equal "text/html"
|
|
36
|
-
res["X-Served-By"].should.equal "http://rack.rubyforge.org"
|
|
37
|
-
|
|
38
|
-
res.body.should.equal "Camping works!"
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
specify "works with POST" do
|
|
42
|
-
res = Rack::MockRequest.new(Rack::Adapter::Camping.new(CampApp)).
|
|
43
|
-
post("/", :input => "foo=bar")
|
|
44
|
-
|
|
45
|
-
res.should.be.ok
|
|
46
|
-
res.body.should.equal "Data: bar"
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
rescue LoadError
|
|
50
|
-
$stderr.puts "Skipping Rack::Adapter::Camping tests (Camping is required). `gem install camping` and try again."
|
|
51
|
-
end
|
data/test/spec_rack_cascade.rb
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
require 'test/spec'
|
|
2
|
-
|
|
3
|
-
require 'rack/cascade'
|
|
4
|
-
require 'rack/mock'
|
|
5
|
-
|
|
6
|
-
require 'rack/urlmap'
|
|
7
|
-
require 'rack/file'
|
|
8
|
-
|
|
9
|
-
context "Rack::Cascade" do
|
|
10
|
-
docroot = File.expand_path(File.dirname(__FILE__))
|
|
11
|
-
app1 = Rack::File.new(docroot)
|
|
12
|
-
|
|
13
|
-
app2 = Rack::URLMap.new("/crash" => lambda { |env| raise "boom" })
|
|
14
|
-
|
|
15
|
-
app3 = Rack::URLMap.new("/foo" => lambda { |env|
|
|
16
|
-
[200, { "Content-Type" => "text/plain"}, [""]]})
|
|
17
|
-
|
|
18
|
-
specify "should dispatch onward on 404 by default" do
|
|
19
|
-
cascade = Rack::Cascade.new([app1, app2, app3])
|
|
20
|
-
Rack::MockRequest.new(cascade).get("/cgi/test").should.be.ok
|
|
21
|
-
Rack::MockRequest.new(cascade).get("/foo").should.be.ok
|
|
22
|
-
Rack::MockRequest.new(cascade).get("/toobad").should.be.not_found
|
|
23
|
-
Rack::MockRequest.new(cascade).get("/cgi/../bla").should.be.forbidden
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
specify "should dispatch onward on whatever is passed" do
|
|
27
|
-
cascade = Rack::Cascade.new([app1, app2, app3], [404, 403])
|
|
28
|
-
Rack::MockRequest.new(cascade).get("/cgi/../bla").should.be.not_found
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
specify "should fail if empty" do
|
|
32
|
-
lambda { Rack::MockRequest.new(Rack::Cascade.new([])).get("/") }.
|
|
33
|
-
should.raise(ArgumentError)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
specify "should append new app" do
|
|
37
|
-
cascade = Rack::Cascade.new([], [404, 403])
|
|
38
|
-
lambda { Rack::MockRequest.new(cascade).get('/cgi/test') }.
|
|
39
|
-
should.raise(ArgumentError)
|
|
40
|
-
cascade << app2
|
|
41
|
-
Rack::MockRequest.new(cascade).get('/cgi/test').should.be.not_found
|
|
42
|
-
Rack::MockRequest.new(cascade).get('/cgi/../bla').should.be.not_found
|
|
43
|
-
cascade << app1
|
|
44
|
-
Rack::MockRequest.new(cascade).get('/cgi/test').should.be.ok
|
|
45
|
-
Rack::MockRequest.new(cascade).get('/cgi/../bla').should.be.forbidden
|
|
46
|
-
Rack::MockRequest.new(cascade).get('/foo').should.be.not_found
|
|
47
|
-
cascade << app3
|
|
48
|
-
Rack::MockRequest.new(cascade).get('/foo').should.be.ok
|
|
49
|
-
end
|
|
50
|
-
end
|
data/test/spec_rack_cgi.rb
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
require 'test/spec'
|
|
2
|
-
require 'testrequest'
|
|
3
|
-
|
|
4
|
-
context "Rack::Handler::CGI" do
|
|
5
|
-
include TestRequest::Helpers
|
|
6
|
-
|
|
7
|
-
setup do
|
|
8
|
-
@host = '0.0.0.0'
|
|
9
|
-
@port = 9203
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
# Keep this first.
|
|
13
|
-
specify "startup" do
|
|
14
|
-
$pid = fork {
|
|
15
|
-
Dir.chdir(File.join(File.dirname(__FILE__), "..", "test", "cgi"))
|
|
16
|
-
exec "lighttpd -D -f lighttpd.conf"
|
|
17
|
-
}
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
specify "should respond" do
|
|
21
|
-
sleep 1
|
|
22
|
-
lambda {
|
|
23
|
-
GET("/test")
|
|
24
|
-
}.should.not.raise
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
specify "should be a lighttpd" do
|
|
28
|
-
GET("/test")
|
|
29
|
-
status.should.be 200
|
|
30
|
-
response["SERVER_SOFTWARE"].should =~ /lighttpd/
|
|
31
|
-
response["HTTP_VERSION"].should.equal "HTTP/1.1"
|
|
32
|
-
response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
|
|
33
|
-
response["SERVER_PORT"].should.equal @port.to_s
|
|
34
|
-
response["SERVER_NAME"].should =~ @host
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
specify "should have rack headers" do
|
|
38
|
-
GET("/test")
|
|
39
|
-
response["rack.version"].should.equal [1,0]
|
|
40
|
-
response["rack.multithread"].should.be false
|
|
41
|
-
response["rack.multiprocess"].should.be true
|
|
42
|
-
response["rack.run_once"].should.be true
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
specify "should have CGI headers on GET" do
|
|
46
|
-
GET("/test")
|
|
47
|
-
response["REQUEST_METHOD"].should.equal "GET"
|
|
48
|
-
response["SCRIPT_NAME"].should.equal "/test"
|
|
49
|
-
response["REQUEST_PATH"].should.equal "/"
|
|
50
|
-
response["PATH_INFO"].should.be.nil
|
|
51
|
-
response["QUERY_STRING"].should.equal ""
|
|
52
|
-
response["test.postdata"].should.equal ""
|
|
53
|
-
|
|
54
|
-
GET("/test/foo?quux=1")
|
|
55
|
-
response["REQUEST_METHOD"].should.equal "GET"
|
|
56
|
-
response["SCRIPT_NAME"].should.equal "/test"
|
|
57
|
-
response["REQUEST_PATH"].should.equal "/"
|
|
58
|
-
response["PATH_INFO"].should.equal "/foo"
|
|
59
|
-
response["QUERY_STRING"].should.equal "quux=1"
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
specify "should have CGI headers on POST" do
|
|
63
|
-
POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
|
|
64
|
-
status.should.equal 200
|
|
65
|
-
response["REQUEST_METHOD"].should.equal "POST"
|
|
66
|
-
response["SCRIPT_NAME"].should.equal "/test"
|
|
67
|
-
response["REQUEST_PATH"].should.equal "/"
|
|
68
|
-
response["QUERY_STRING"].should.equal ""
|
|
69
|
-
response["HTTP_X_TEST_HEADER"].should.equal "42"
|
|
70
|
-
response["test.postdata"].should.equal "rack-form-data=23"
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
specify "should support HTTP auth" do
|
|
74
|
-
GET("/test", {:user => "ruth", :passwd => "secret"})
|
|
75
|
-
response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
specify "should set status" do
|
|
79
|
-
GET("/test?secret")
|
|
80
|
-
status.should.equal 403
|
|
81
|
-
response["rack.url_scheme"].should.equal "http"
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# Keep this last.
|
|
85
|
-
specify "shutdown" do
|
|
86
|
-
Process.kill 15, $pid
|
|
87
|
-
Process.wait($pid).should.equal $pid
|
|
88
|
-
end
|
|
89
|
-
end
|
data/test/spec_rack_chunked.rb
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
require 'rack/mock'
|
|
2
|
-
require 'rack/chunked'
|
|
3
|
-
require 'rack/utils'
|
|
4
|
-
|
|
5
|
-
context "Rack::Chunked" do
|
|
6
|
-
|
|
7
|
-
before do
|
|
8
|
-
@env = Rack::MockRequest.
|
|
9
|
-
env_for('/', 'HTTP_VERSION' => '1.1', 'REQUEST_METHOD' => 'GET')
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
specify 'chunks responses with no Content-Length' do
|
|
13
|
-
app = lambda { |env| [200, {}, ['Hello', ' ', 'World!']] }
|
|
14
|
-
response = Rack::MockResponse.new(*Rack::Chunked.new(app).call(@env))
|
|
15
|
-
response.headers.should.not.include 'Content-Length'
|
|
16
|
-
response.headers['Transfer-Encoding'].should.equal 'chunked'
|
|
17
|
-
response.body.should.equal "5\r\nHello\r\n1\r\n \r\n6\r\nWorld!\r\n0\r\n\r\n"
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
specify 'chunks empty bodies properly' do
|
|
21
|
-
app = lambda { |env| [200, {}, []] }
|
|
22
|
-
response = Rack::MockResponse.new(*Rack::Chunked.new(app).call(@env))
|
|
23
|
-
response.headers.should.not.include 'Content-Length'
|
|
24
|
-
response.headers['Transfer-Encoding'].should.equal 'chunked'
|
|
25
|
-
response.body.should.equal "0\r\n\r\n"
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
specify 'does not modify response when Content-Length header present' do
|
|
29
|
-
app = lambda { |env| [200, {'Content-Length'=>'12'}, ['Hello', ' ', 'World!']] }
|
|
30
|
-
status, headers, body = Rack::Chunked.new(app).call(@env)
|
|
31
|
-
status.should.equal 200
|
|
32
|
-
headers.should.not.include 'Transfer-Encoding'
|
|
33
|
-
headers.should.include 'Content-Length'
|
|
34
|
-
body.join.should.equal 'Hello World!'
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
specify 'does not modify response when client is HTTP/1.0' do
|
|
38
|
-
app = lambda { |env| [200, {}, ['Hello', ' ', 'World!']] }
|
|
39
|
-
@env['HTTP_VERSION'] = 'HTTP/1.0'
|
|
40
|
-
status, headers, body = Rack::Chunked.new(app).call(@env)
|
|
41
|
-
status.should.equal 200
|
|
42
|
-
headers.should.not.include 'Transfer-Encoding'
|
|
43
|
-
body.join.should.equal 'Hello World!'
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
specify 'does not modify response when Transfer-Encoding header already present' do
|
|
47
|
-
app = lambda { |env| [200, {'Transfer-Encoding' => 'identity'}, ['Hello', ' ', 'World!']] }
|
|
48
|
-
status, headers, body = Rack::Chunked.new(app).call(@env)
|
|
49
|
-
status.should.equal 200
|
|
50
|
-
headers['Transfer-Encoding'].should.equal 'identity'
|
|
51
|
-
body.join.should.equal 'Hello World!'
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
[100, 204, 304].each do |status_code|
|
|
55
|
-
specify "does not modify response when status code is #{status_code}" do
|
|
56
|
-
app = lambda { |env| [status_code, {}, []] }
|
|
57
|
-
status, headers, body = Rack::Chunked.new(app).call(@env)
|
|
58
|
-
status.should.equal status_code
|
|
59
|
-
headers.should.not.include 'Transfer-Encoding'
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
require 'test/spec'
|
|
2
|
-
require 'stringio'
|
|
3
|
-
|
|
4
|
-
require 'rack/commonlogger'
|
|
5
|
-
require 'rack/lobster'
|
|
6
|
-
require 'rack/mock'
|
|
7
|
-
|
|
8
|
-
context "Rack::CommonLogger" do
|
|
9
|
-
app = lambda { |env|
|
|
10
|
-
[200,
|
|
11
|
-
{"Content-Type" => "text/html"},
|
|
12
|
-
["foo"]]}
|
|
13
|
-
|
|
14
|
-
specify "should log to rack.errors by default" do
|
|
15
|
-
log = StringIO.new
|
|
16
|
-
res = Rack::MockRequest.new(Rack::CommonLogger.new(app)).get("/")
|
|
17
|
-
|
|
18
|
-
res.errors.should.not.be.empty
|
|
19
|
-
res.errors.should =~ /GET /
|
|
20
|
-
res.errors.should =~ / 200 / # status
|
|
21
|
-
res.errors.should =~ / 3 / # length
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
specify "should log to anything with <<" do
|
|
25
|
-
log = ""
|
|
26
|
-
res = Rack::MockRequest.new(Rack::CommonLogger.new(app, log)).get("/")
|
|
27
|
-
|
|
28
|
-
log.should =~ /GET /
|
|
29
|
-
log.should =~ / 200 / # status
|
|
30
|
-
log.should =~ / 3 / # length
|
|
31
|
-
end
|
|
32
|
-
end
|