rack-rewrite 1.1.0 → 1.2.0
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/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
|