rack-rewrite 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +4 -0
- data/README.rdoc +44 -24
- data/VERSION +1 -1
- data/lib/rack/rewrite/rule.rb +5 -4
- data/test/rule_test.rb +18 -2
- metadata +10 -10
data/History.rdoc
CHANGED
data/README.rdoc
CHANGED
@@ -6,7 +6,6 @@ can get away with rack-rewrite instead of writing Apache mod_rewrite rules.
|
|
6
6
|
== References
|
7
7
|
|
8
8
|
* Source[http://github.com/jtrupiano/rack-rewrite]
|
9
|
-
* Documentation[http://johntrupiano.rubyforge.org/rack-rewrite]
|
10
9
|
* {Rack::Rewrite for Site Maintenance and Downtime}[http://blog.smartlogicsolutions.com/2009/11/16/rack-rewrite-for-site-maintenance-and-downtime/]
|
11
10
|
* {Rack::Rewrite + Google Analytics Makes Site Transitions Seamless}[http://blog.smartlogicsolutions.com/2009/11/24/rack-rewrite-google-analytics-makes-site-transitions-seamless/]
|
12
11
|
|
@@ -14,7 +13,7 @@ can get away with rack-rewrite instead of writing Apache mod_rewrite rules.
|
|
14
13
|
|
15
14
|
=== Sample rackup file
|
16
15
|
|
17
|
-
gem 'rack-rewrite', '~> 1.
|
16
|
+
gem 'rack-rewrite', '~> 1.2.0'
|
18
17
|
require 'rack/rewrite'
|
19
18
|
use Rack::Rewrite do
|
20
19
|
rewrite '/wiki/John_Trupiano', '/john'
|
@@ -24,7 +23,7 @@ can get away with rack-rewrite instead of writing Apache mod_rewrite rules.
|
|
24
23
|
end
|
25
24
|
|
26
25
|
=== Sample usage in a rails app
|
27
|
-
config.gem 'rack-rewrite', '~> 1.
|
26
|
+
config.gem 'rack-rewrite', '~> 1.2.0'
|
28
27
|
require 'rack/rewrite'
|
29
28
|
config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do
|
30
29
|
rewrite '/wiki/John_Trupiano', '/john'
|
@@ -156,20 +155,12 @@ to be rendered instead of passing the application call up the rack stack.
|
|
156
155
|
File.exists?('public/blog_offline.htm')
|
157
156
|
}
|
158
157
|
|
159
|
-
==
|
160
|
-
|
161
|
-
=== Keeping your querystring
|
162
|
-
|
163
|
-
When rewriting a URL, you may want to keep your querystring in tact (for
|
164
|
-
example if you're tracking traffic sources). You will need to include a
|
165
|
-
capture group and substitution pattern in your rewrite rule to achieve this.
|
158
|
+
== Options Parameter
|
166
159
|
|
167
|
-
|
168
|
-
|
169
|
-
This rule will store the querystring in a capture group (via '(?.*)' ) and
|
170
|
-
will substitute the querystring back into the rewritten URL (via $1).
|
160
|
+
Each rewrite rule takes an optional options parameter. The following options
|
161
|
+
are supported.
|
171
162
|
|
172
|
-
===
|
163
|
+
=== :host
|
173
164
|
|
174
165
|
Using the :host option you can match requests to a specific hostname.
|
175
166
|
|
@@ -177,10 +168,17 @@ Using the :host option you can match requests to a specific hostname.
|
|
177
168
|
|
178
169
|
This rule will only match when the hostname is "facerecognizer.com"
|
179
170
|
|
180
|
-
===
|
171
|
+
=== :headers
|
172
|
+
|
173
|
+
Using the :headers option you can set custom response headers e.g. for HTTP
|
174
|
+
caching instructions.
|
181
175
|
|
182
|
-
|
183
|
-
|
176
|
+
r301 "/features", "/facial_features", :headers => {'Cache-Control' => 'no-cache'}
|
177
|
+
|
178
|
+
=== :method
|
179
|
+
|
180
|
+
Using the :method option you can restrict the matching of a rule by the HTTP
|
181
|
+
method of a given request.
|
184
182
|
|
185
183
|
# redirect GET's one way
|
186
184
|
r301 "/players", "/current_players", :method => :get
|
@@ -188,18 +186,40 @@ of a given request. rack-rewrite exposes the :method option for this purpose.
|
|
188
186
|
# and redirect POST's another way
|
189
187
|
r302 "/players", "/no_longer_available.html?message=No&longer&supported", :method => :post
|
190
188
|
|
191
|
-
===
|
189
|
+
=== :if
|
192
190
|
|
193
|
-
|
194
|
-
true or false indicating whether the
|
195
|
-
following example demonstrates how the presence of a
|
196
|
-
on the filesystem can be utilized to take your site(s) offline.
|
191
|
+
Using the :if option you can define arbitrary rule guards. Guards are any
|
192
|
+
object responding to #call that return true or false indicating whether the
|
193
|
+
rule matches. The following example demonstrates how the presence of a
|
194
|
+
maintenance page on the filesystem can be utilized to take your site(s) offline.
|
197
195
|
|
198
196
|
maintenance_file = File.join(RAILS_ROOT, 'public', 'system', 'maintenance.html')
|
199
197
|
x_send_file /.*/, maintenance_file, :if => Proc.new { |rack_env|
|
200
198
|
File.exists?(maintenance_file)
|
201
199
|
}
|
202
200
|
|
201
|
+
=== :not
|
202
|
+
|
203
|
+
Using the :not option you can negatively match against the path. This can
|
204
|
+
be useful when writing a regular expression match is difficult.
|
205
|
+
|
206
|
+
rewrite %r{^\/features}, '/facial_features', :not => '/features'
|
207
|
+
|
208
|
+
This will not match the relative URL /features but would match /features.xml.
|
209
|
+
|
210
|
+
== Tips
|
211
|
+
|
212
|
+
=== Keeping your querystring
|
213
|
+
|
214
|
+
When rewriting a URL, you may want to keep your querystring in tact (for
|
215
|
+
example if you're tracking traffic sources). You will need to include a
|
216
|
+
capture group and substitution pattern in your rewrite rule to achieve this.
|
217
|
+
|
218
|
+
rewrite %r{/wiki/John_Trupiano(\?.*)?}, '/john$1'
|
219
|
+
|
220
|
+
This rule will store the querystring in a capture group (via '(?.*)' ) and
|
221
|
+
will substitute the querystring back into the rewritten URL (via $1).
|
222
|
+
|
203
223
|
=== Arbitrary Rewriting
|
204
224
|
|
205
225
|
All rules support passing a Proc as the second argument allowing you to
|
@@ -212,4 +232,4 @@ received between 12AM and 8AM to an unavailable page.
|
|
212
232
|
|
213
233
|
== Copyright
|
214
234
|
|
215
|
-
Copyright (c) 2009-
|
235
|
+
Copyright (c) 2009-2011 John Trupiano. See LICENSE for details.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/lib/rack/rewrite/rule.rb
CHANGED
@@ -81,11 +81,12 @@ module Rack
|
|
81
81
|
# (b) alter env as necessary and return true
|
82
82
|
def apply!(env) #:nodoc:
|
83
83
|
interpreted_to = self.interpret_to(env)
|
84
|
+
additional_headers = @options[:headers] || {}
|
84
85
|
case self.rule_type
|
85
86
|
when :r301
|
86
|
-
[301, {'Location' => interpreted_to, 'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))}, [redirect_message(interpreted_to)]]
|
87
|
+
[301, {'Location' => interpreted_to, 'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))}.merge!(additional_headers), [redirect_message(interpreted_to)]]
|
87
88
|
when :r302
|
88
|
-
[302, {'Location' => interpreted_to, 'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))}, [redirect_message(interpreted_to)]]
|
89
|
+
[302, {'Location' => interpreted_to, 'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))}.merge!(additional_headers), [redirect_message(interpreted_to)]]
|
89
90
|
when :rewrite
|
90
91
|
# return [200, {}, {:content => env.inspect}]
|
91
92
|
env['REQUEST_URI'] = interpreted_to
|
@@ -101,13 +102,13 @@ module Rack
|
|
101
102
|
[200, {
|
102
103
|
'Content-Length' => ::File.size(interpreted_to).to_s,
|
103
104
|
'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))
|
104
|
-
}, [::File.read(interpreted_to)]]
|
105
|
+
}.merge!(additional_headers), [::File.read(interpreted_to)]]
|
105
106
|
when :x_send_file
|
106
107
|
[200, {
|
107
108
|
'X-Sendfile' => interpreted_to,
|
108
109
|
'Content-Length' => ::File.size(interpreted_to).to_s,
|
109
110
|
'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))
|
110
|
-
}, []]
|
111
|
+
}.merge!(additional_headers), []]
|
111
112
|
else
|
112
113
|
raise Exception.new("Unsupported rule: #{self.rule_type}")
|
113
114
|
end
|
data/test/rule_test.rb
CHANGED
@@ -86,10 +86,18 @@ class RuleTest < Test::Unit::TestCase
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
+
should 'set additional headers for a 301 and 302 request' do
|
90
|
+
[:r301, :r302].each do |rule_type|
|
91
|
+
rule = Rack::Rewrite::Rule.new(rule_type, %r{/abc}, '/def.css', {:headers => {'Cache-Control' => 'no-cache'}})
|
92
|
+
env = {'PATH_INFO' => '/abc'}
|
93
|
+
assert_equal 'no-cache', rule.apply!(env)[1]['Cache-Control']
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
89
97
|
context 'Given an :x_send_file rule that matches' do
|
90
98
|
setup do
|
91
99
|
@file = File.join(TEST_ROOT, 'geminstaller.yml')
|
92
|
-
@rule = Rack::Rewrite::Rule.new(:x_send_file, /.*/, @file)
|
100
|
+
@rule = Rack::Rewrite::Rule.new(:x_send_file, /.*/, @file, :headers => {'Cache-Control' => 'no-cache'})
|
93
101
|
env = {'PATH_INFO' => '/abc'}
|
94
102
|
@response = @rule.apply!(env)
|
95
103
|
end
|
@@ -110,6 +118,10 @@ class RuleTest < Test::Unit::TestCase
|
|
110
118
|
assert_equal File.size(@file).to_s, @response[1]['Content-Length']
|
111
119
|
end
|
112
120
|
|
121
|
+
should 'return additional headers' do
|
122
|
+
assert_equal 'no-cache', @response[1]['Cache-Control']
|
123
|
+
end
|
124
|
+
|
113
125
|
should 'return empty content' do
|
114
126
|
assert_equal [], @response[2]
|
115
127
|
end
|
@@ -118,7 +130,7 @@ class RuleTest < Test::Unit::TestCase
|
|
118
130
|
context 'Given a :send_file rule that matches' do
|
119
131
|
setup do
|
120
132
|
@file = File.join(TEST_ROOT, 'geminstaller.yml')
|
121
|
-
@rule = Rack::Rewrite::Rule.new(:send_file, /.*/, @file)
|
133
|
+
@rule = Rack::Rewrite::Rule.new(:send_file, /.*/, @file, :headers => {'Cache-Control' => 'no-cache'})
|
122
134
|
env = {'PATH_INFO' => '/abc'}
|
123
135
|
@response = @rule.apply!(env)
|
124
136
|
end
|
@@ -139,6 +151,10 @@ class RuleTest < Test::Unit::TestCase
|
|
139
151
|
assert_equal File.size(@file).to_s, @response[1]['Content-Length']
|
140
152
|
end
|
141
153
|
|
154
|
+
should 'return additional headers' do
|
155
|
+
assert_equal 'no-cache', @response[1]['Cache-Control']
|
156
|
+
end
|
157
|
+
|
142
158
|
should 'return the contents of geminstaller.yml in an array for Ruby 1.9.2 compatibility' do
|
143
159
|
assert_equal [File.read(@file)], @response[2]
|
144
160
|
end
|
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.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-09-20 00:00:00.000000000 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
17
|
-
requirement: &
|
17
|
+
requirement: &2156177220 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 1.0.10
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2156177220
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: shoulda
|
28
|
-
requirement: &
|
28
|
+
requirement: &2156176760 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 2.10.2
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2156176760
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: mocha
|
39
|
-
requirement: &
|
39
|
+
requirement: &2156200620 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 0.9.7
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2156200620
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rack
|
50
|
-
requirement: &
|
50
|
+
requirement: &2156200240 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,7 +55,7 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *2156200240
|
59
59
|
description: A rack middleware for enforcing rewrite rules. In many cases you can
|
60
60
|
get away with rack-rewrite instead of writing Apache mod_rewrite rules.
|
61
61
|
email: jtrupiano@gmail.com
|