rack-rewrite 1.3.2 → 1.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/rack/rewrite/rule.rb +36 -32
- data/rack-rewrite.gemspec +0 -1
- data/test/rule_test.rb +28 -3
- metadata +2 -3
- data/Gemfile.lock +0 -23
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.3
|
data/lib/rack/rewrite/rule.rb
CHANGED
@@ -11,18 +11,18 @@ module Rack
|
|
11
11
|
protected
|
12
12
|
# We're explicitly defining private functions for our DSL rather than
|
13
13
|
# using method_missing
|
14
|
-
|
14
|
+
|
15
15
|
# Creates a rewrite rule that will simply rewrite the REQUEST_URI,
|
16
|
-
# PATH_INFO, and QUERY_STRING headers of the Rack environment. The
|
16
|
+
# PATH_INFO, and QUERY_STRING headers of the Rack environment. The
|
17
17
|
# user's browser will continue to show the initially requested URL.
|
18
|
-
#
|
18
|
+
#
|
19
19
|
# rewrite '/wiki/John_Trupiano', '/john'
|
20
20
|
# rewrite %r{/wiki/(\w+)_\w+}, '/$1'
|
21
21
|
# rewrite %r{(.*)}, '/maintenance.html', :if => lambda { File.exists?('maintenance.html') }
|
22
22
|
def rewrite(*args)
|
23
23
|
add_rule :rewrite, *args
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
# Creates a redirect rule that will send a 301 when matching.
|
27
27
|
#
|
28
28
|
# r301 '/wiki/John_Trupiano', '/john'
|
@@ -32,10 +32,10 @@ module Rack
|
|
32
32
|
def r301(*args)
|
33
33
|
add_rule :r301, *args
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
alias :moved_permanently :r301
|
37
37
|
alias :p :r301
|
38
|
-
|
38
|
+
|
39
39
|
# Creates a redirect rule that will send a 302 when matching.
|
40
40
|
#
|
41
41
|
# r302 '/wiki/John_Trupiano', '/john'
|
@@ -45,9 +45,9 @@ module Rack
|
|
45
45
|
def r302(*args)
|
46
46
|
add_rule :r302, *args
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
alias :found :r302
|
50
|
-
|
50
|
+
|
51
51
|
# Creates a redirect rule that will send a 303 when matching.
|
52
52
|
#
|
53
53
|
# r303 '/wiki/John_Trupiano', '/john'
|
@@ -57,9 +57,9 @@ module Rack
|
|
57
57
|
def r303(*args)
|
58
58
|
add_rule :r303, *args
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
alias :see_other :r303
|
62
|
-
|
62
|
+
|
63
63
|
# Creates a redirect rule that will send a 307 when matching.
|
64
64
|
#
|
65
65
|
# r307 '/wiki/John_Trupiano', '/john'
|
@@ -69,32 +69,32 @@ module Rack
|
|
69
69
|
def r307(*args)
|
70
70
|
add_rule :r307, *args
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
alias :temporary_redirect :r307
|
74
74
|
alias :t :r307
|
75
|
-
|
75
|
+
|
76
76
|
# Creates a rule that will render a file if matched.
|
77
77
|
#
|
78
|
-
# send_file /*/, 'public/system/maintenance.html',
|
78
|
+
# send_file /*/, 'public/system/maintenance.html',
|
79
79
|
# :if => Proc.new { File.exists?('public/system/maintenance.html') }
|
80
80
|
def send_file(*args)
|
81
81
|
add_rule :send_file, *args
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
# Creates a rule that will render a file using x-send-file
|
85
85
|
# if matched.
|
86
86
|
#
|
87
|
-
# x_send_file /*/, 'public/system/maintenance.html',
|
87
|
+
# x_send_file /*/, 'public/system/maintenance.html',
|
88
88
|
# :if => Proc.new { File.exists?('public/system/maintenance.html') }
|
89
89
|
def x_send_file(*args)
|
90
90
|
add_rule :x_send_file, *args
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
private
|
94
94
|
def add_rule(method, from, to, options = {}) #:nodoc:
|
95
95
|
@rules << Rule.new(method.to_sym, from, to, options)
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
end
|
99
99
|
|
100
100
|
# TODO: Break rules into subclasses
|
@@ -107,7 +107,7 @@ module Rack
|
|
107
107
|
def matches?(rack_env) #:nodoc:
|
108
108
|
return false if options[:if].respond_to?(:call) && !options[:if].call(rack_env)
|
109
109
|
path = build_path_from_env(rack_env)
|
110
|
-
|
110
|
+
|
111
111
|
self.match_options?(rack_env) && string_matches?(path, self.from)
|
112
112
|
end
|
113
113
|
|
@@ -123,6 +123,7 @@ module Rack
|
|
123
123
|
additional_headers = @options[:headers] || {}
|
124
124
|
end
|
125
125
|
end
|
126
|
+
status = @options[:status] || 200
|
126
127
|
case self.rule_type
|
127
128
|
when :r301
|
128
129
|
[301, {'Location' => interpreted_to, 'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))}.merge!(additional_headers), [redirect_message(interpreted_to)]]
|
@@ -144,12 +145,12 @@ module Rack
|
|
144
145
|
end
|
145
146
|
true
|
146
147
|
when :send_file
|
147
|
-
[
|
148
|
+
[status, {
|
148
149
|
'Content-Length' => ::File.size(interpreted_to).to_s,
|
149
150
|
'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))
|
150
151
|
}.merge!(additional_headers), [::File.read(interpreted_to)]]
|
151
152
|
when :x_send_file
|
152
|
-
[
|
153
|
+
[status, {
|
153
154
|
'X-Sendfile' => interpreted_to,
|
154
155
|
'Content-Length' => ::File.size(interpreted_to).to_s,
|
155
156
|
'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))
|
@@ -158,7 +159,7 @@ module Rack
|
|
158
159
|
raise Exception.new("Unsupported rule: #{self.rule_type}")
|
159
160
|
end
|
160
161
|
end
|
161
|
-
|
162
|
+
|
162
163
|
protected
|
163
164
|
def interpret_to(env) #:nodoc:
|
164
165
|
path = build_path_from_env(env)
|
@@ -166,32 +167,33 @@ module Rack
|
|
166
167
|
return computed_to(path) if compute_to?(path)
|
167
168
|
self.to
|
168
169
|
end
|
169
|
-
|
170
|
+
|
170
171
|
def is_a_regexp?(obj)
|
171
172
|
obj.is_a?(Regexp) || (Object.const_defined?(:Oniguruma) && obj.is_a?(Oniguruma::ORegexp))
|
172
173
|
end
|
173
|
-
|
174
|
+
|
174
175
|
def match_options?(env, path = build_path_from_env(env))
|
175
176
|
matches = []
|
176
177
|
request = Rack::Request.new(env)
|
177
178
|
|
178
179
|
# negative matches
|
179
180
|
matches << !string_matches?(path, options[:not]) if options[:not]
|
180
|
-
|
181
|
+
|
181
182
|
# possitive matches
|
182
183
|
matches << string_matches?(env['REQUEST_METHOD'], options[:method]) if options[:method]
|
183
184
|
matches << string_matches?(request.host, options[:host]) if options[:host]
|
184
|
-
|
185
|
+
matches << string_matches?(request.scheme, options[:scheme]) if options[:scheme]
|
186
|
+
|
185
187
|
matches.all?
|
186
188
|
end
|
187
|
-
|
189
|
+
|
188
190
|
private
|
189
191
|
def normalize_options(arg)
|
190
192
|
options = arg.respond_to?(:call) ? {:if => arg} : arg
|
191
193
|
options.symbolize_keys! if options.respond_to? :symbolize_keys!
|
192
194
|
options.freeze
|
193
195
|
end
|
194
|
-
|
196
|
+
|
195
197
|
def interpret_to_proc(path, env)
|
196
198
|
return self.to.call(match(path), env) if self.from.is_a?(Regexp)
|
197
199
|
self.to.call(self.from, env)
|
@@ -201,15 +203,17 @@ module Rack
|
|
201
203
|
self.is_a_regexp?(from) && match(path)
|
202
204
|
end
|
203
205
|
|
204
|
-
def match(path)
|
206
|
+
def match(path)
|
205
207
|
self.from.match(path)
|
206
208
|
end
|
207
|
-
|
209
|
+
|
208
210
|
def string_matches?(string, matcher)
|
209
211
|
if self.is_a_regexp?(matcher)
|
210
212
|
string =~ matcher
|
211
213
|
elsif matcher.is_a?(String)
|
212
214
|
string == matcher
|
215
|
+
elsif matcher.is_a?(Symbol)
|
216
|
+
string.downcase == matcher.to_s.downcase
|
213
217
|
else
|
214
218
|
false
|
215
219
|
end
|
@@ -224,14 +228,14 @@ module Rack
|
|
224
228
|
end
|
225
229
|
return computed_to
|
226
230
|
end
|
227
|
-
|
231
|
+
|
228
232
|
# Construct the URL (without domain) from PATH_INFO and QUERY_STRING
|
229
233
|
def build_path_from_env(env)
|
230
|
-
path = env['PATH_INFO']
|
234
|
+
path = env['PATH_INFO'] || ''
|
231
235
|
path += "?#{env['QUERY_STRING']}" unless env['QUERY_STRING'].nil? || env['QUERY_STRING'].empty?
|
232
236
|
path
|
233
237
|
end
|
234
|
-
|
238
|
+
|
235
239
|
def redirect_message(location)
|
236
240
|
%Q(Redirecting to <a href="#{location}">#{location}</a>)
|
237
241
|
end
|
data/rack-rewrite.gemspec
CHANGED
data/test/rule_test.rb
CHANGED
@@ -185,6 +185,16 @@ class RuleTest < Test::Unit::TestCase
|
|
185
185
|
assert_equal [File.read(@file)], @response[2]
|
186
186
|
end
|
187
187
|
end
|
188
|
+
|
189
|
+
should 'return proper status for send_file or x_send_file if specified' do
|
190
|
+
[:send_file, :x_send_file].each do |rule_type|
|
191
|
+
file = File.join(TEST_ROOT, 'geminstaller.yml')
|
192
|
+
rule = Rack::Rewrite::Rule.new(rule_type, /.*/, file, :status => 503)
|
193
|
+
env = {'PATH_INFO' => '/abc'}
|
194
|
+
assert_equal 503, rule.apply!(env)[0]
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
188
198
|
end
|
189
199
|
|
190
200
|
context 'Rule#matches' do
|
@@ -254,9 +264,17 @@ class RuleTest < Test::Unit::TestCase
|
|
254
264
|
end
|
255
265
|
end
|
256
266
|
|
257
|
-
|
258
|
-
|
259
|
-
|
267
|
+
context 'Given a rule with the ^ operator' do
|
268
|
+
setup do
|
269
|
+
@rule = Rack::Rewrite::Rule.new(:rewrite, %r{^/jason}, '/steve')
|
270
|
+
end
|
271
|
+
should 'match with the ^ operator if match is at the beginning of the path' do
|
272
|
+
assert @rule.matches?(rack_env_for('/jason'))
|
273
|
+
end
|
274
|
+
|
275
|
+
should 'not match with the ^ operator when match is deeply nested' do
|
276
|
+
assert !@rule.matches?(rack_env_for('/foo/bar/jason'))
|
277
|
+
end
|
260
278
|
end
|
261
279
|
|
262
280
|
context 'Given any rule with a "from" regular expression of /features(.*)' do
|
@@ -397,6 +415,13 @@ class RuleTest < Test::Unit::TestCase
|
|
397
415
|
end
|
398
416
|
end
|
399
417
|
|
418
|
+
context 'Mongel 1.2.0.pre2 edge case: root url with a query string' do
|
419
|
+
should 'handle a nil PATH_INFO variable without errors' do
|
420
|
+
rule = Rack::Rewrite::Rule.new(:r301, '/a', '/')
|
421
|
+
assert_equal '?exists', rule.send(:build_path_from_env, {'QUERY_STRING' => 'exists'})
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
400
425
|
def rack_env_for(url, options = {})
|
401
426
|
components = url.split('?')
|
402
427
|
{'PATH_INFO' => components[0], 'QUERY_STRING' => components[1] || ''}.merge(options)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-rewrite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2013-01-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -91,7 +91,6 @@ files:
|
|
91
91
|
- Rakefile
|
92
92
|
- VERSION
|
93
93
|
- Gemfile
|
94
|
-
- Gemfile.lock
|
95
94
|
- lib/rack-rewrite.rb
|
96
95
|
- lib/rack/rewrite.rb
|
97
96
|
- lib/rack/rewrite/rule.rb
|
data/Gemfile.lock
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
rack-rewrite (1.3.1)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: http://rubygems.org/
|
8
|
-
specs:
|
9
|
-
mocha (0.9.12)
|
10
|
-
rack (1.4.1)
|
11
|
-
rake (10.0.2)
|
12
|
-
shoulda (2.10.3)
|
13
|
-
|
14
|
-
PLATFORMS
|
15
|
-
ruby
|
16
|
-
|
17
|
-
DEPENDENCIES
|
18
|
-
bundler
|
19
|
-
mocha (~> 0.9.7)
|
20
|
-
rack
|
21
|
-
rack-rewrite!
|
22
|
-
rake
|
23
|
-
shoulda (~> 2.10.2)
|