rack-rewrite 1.3.2 → 1.3.3
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.
- 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)
|