rack-rewrite 1.2.1 → 1.3.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.
@@ -1,20 +1,20 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rack-rewrite (1.2.1)
4
+ rack-rewrite (1.3.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
8
8
  specs:
9
9
  mocha (0.9.12)
10
- rack (1.2.1)
10
+ rack (1.4.1)
11
11
  shoulda (2.10.3)
12
12
 
13
13
  PLATFORMS
14
14
  ruby
15
15
 
16
16
  DEPENDENCIES
17
- bundler (~> 1.0.10)
17
+ bundler
18
18
  mocha (~> 0.9.7)
19
19
  rack
20
20
  rack-rewrite!
@@ -16,21 +16,53 @@ can get away with rack-rewrite instead of writing Apache mod_rewrite rules.
16
16
  gem 'rack-rewrite', '~> 1.2.1'
17
17
  require 'rack/rewrite'
18
18
  use Rack::Rewrite do
19
- rewrite '/wiki/John_Trupiano', '/john'
20
- r301 '/wiki/Yair_Flicker', '/yair'
21
- r302 '/wiki/Greg_Jastrab', '/greg'
22
- r301 %r{/wiki/(\w+)_\w+}, '/$1'
19
+ rewrite '/wiki/John_Trupiano', '/john'
20
+ r301 '/wiki/Yair_Flicker', '/yair'
21
+ r302 '/wiki/Greg_Jastrab', '/greg'
22
+ r301 %r{/wiki/(\w+)_\w+}, '/$1'
23
23
  end
24
24
 
25
25
  === Sample usage in a rails app
26
26
 
27
27
  config.middleware.insert_before(Rack::Lock, Rack::Rewrite) do
28
- rewrite '/wiki/John_Trupiano', '/john'
29
- r301 '/wiki/Yair_Flicker', '/yair'
30
- r302 '/wiki/Greg_Jastrab', '/greg'
31
- r301 %r{/wiki/(\w+)_\w+}, '/$1'
28
+ rewrite '/wiki/John_Trupiano', '/john'
29
+ r301 '/wiki/Yair_Flicker', '/yair'
30
+ r302 '/wiki/Greg_Jastrab', '/greg'
31
+ r301 %r{/wiki/(\w+)_\w+}, '/$1'
32
32
  end
33
33
 
34
+ == Redirection codes
35
+
36
+ All +redirect+ status codes from the HTTP spec[http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html] are supported:
37
+
38
+ * 301 moved permanently
39
+ * 302 found
40
+ * 303 see other
41
+ * 307 temporary redirect
42
+
43
+ These translate to the following methods inside the Rack::Rewrite block:
44
+
45
+ r301 '/wiki/John_Trupiano', '/john'
46
+ moved_permanently '/wiki/John_Trupiano', '/john'
47
+ p '/wiki/John_Trupiano', '/john' # shortcut alias
48
+
49
+ r302 '/wiki/John_Trupiano', '/john'
50
+ found '/wiki/John_Trupiano', '/john'
51
+
52
+ r303 '/wiki/John_Trupiano', '/john'
53
+ see_other '/wiki/John_Trupiano', '/john'
54
+
55
+ r307 '/wiki/John_Trupiano', '/john'
56
+ temporary_redirect '/wiki/John_Trupiano', '/john'
57
+ t '/wiki/John_Trupiano', '/john' # shortcut alias
58
+
59
+ The 303 and 307 codes were added to the HTTP spec to make unambiguously clear
60
+ what clients should do with the request method. 303 means that the new request
61
+ should always be made via GET. 307 means that the new request should use the
62
+ same method as the original request. Status code 302 was left as it is, since
63
+ it was already in use by the time these issues came to light. In practice it
64
+ behaves the same as 303.
65
+
34
66
  == Use Cases
35
67
 
36
68
  === Rebuild of existing site in a new technology
@@ -128,11 +160,11 @@ and rewrite them as the first name only. This is an actual catch-all rule we
128
160
  applied when we rebuilt our website in September 2009
129
161
  ( http://www.smartlogicsolutions.com ).
130
162
 
131
- === :r301, :302
163
+ === :r301, :r302, :r303, :r307
132
164
 
133
165
  Calls to #r301 and #r302 have the same signature as #rewrite. The difference,
134
166
  however, is that these actually short-circuit the rack stack and send back
135
- 301's and 302's, respectively. See these examples:
167
+ their respective status codes. See these examples:
136
168
 
137
169
  r301 '/wiki/John_Trupiano', '/john' # [1]
138
170
  r301 '/wiki/(.*)', 'http://www.google.com/?q=$1' # [2]
data/Rakefile CHANGED
@@ -1,7 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
-
4
3
  require 'rake/testtask'
4
+ require 'rdoc/task'
5
+
5
6
  Rake::TestTask.new(:test) do |test|
6
7
  test.libs << 'lib' << 'test' << '.'
7
8
  test.pattern = 'test/**/*_test.rb'
@@ -23,7 +24,6 @@ end
23
24
 
24
25
  task :default => :test
25
26
 
26
- require 'rake/rdoctask'
27
27
  Rake::RDocTask.new do |rdoc|
28
28
  if File.exist?('VERSION')
29
29
  version = File.read('VERSION')
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.1
1
+ 1.3.0
@@ -27,18 +27,52 @@ module Rack
27
27
  #
28
28
  # r301 '/wiki/John_Trupiano', '/john'
29
29
  # r301 '/contact-us.php', '/contact-us'
30
+ #
31
+ # You can use +moved_permanently+ or just +p+ instead of +r301+.
30
32
  def r301(*args)
31
33
  add_rule :r301, *args
32
34
  end
33
35
 
36
+ alias :moved_permanently :r301
37
+ alias :p :r301
38
+
34
39
  # Creates a redirect rule that will send a 302 when matching.
35
40
  #
36
41
  # r302 '/wiki/John_Trupiano', '/john'
37
42
  # r302 '/wiki/(.*)', 'http://www.google.com/?q=$1'
43
+ #
44
+ # You can use +found+ instead of +r302+.
38
45
  def r302(*args)
39
46
  add_rule :r302, *args
40
47
  end
41
48
 
49
+ alias :found :r302
50
+
51
+ # Creates a redirect rule that will send a 303 when matching.
52
+ #
53
+ # r303 '/wiki/John_Trupiano', '/john'
54
+ # r303 '/wiki/(.*)', 'http://www.google.com/?q=$1'
55
+ #
56
+ # You can use +see_other+ instead of +r303+.
57
+ def r303(*args)
58
+ add_rule :r303, *args
59
+ end
60
+
61
+ alias :see_other :r303
62
+
63
+ # Creates a redirect rule that will send a 307 when matching.
64
+ #
65
+ # r307 '/wiki/John_Trupiano', '/john'
66
+ # r307 '/wiki/(.*)', 'http://www.google.com/?q=$1'
67
+ #
68
+ # You can use +temporary_redirect+ or +t+ instead of +r307+.
69
+ def r307(*args)
70
+ add_rule :r307, *args
71
+ end
72
+
73
+ alias :temporary_redirect :r307
74
+ alias :t :r307
75
+
42
76
  # Creates a rule that will render a file if matched.
43
77
  #
44
78
  # send_file /*/, 'public/system/maintenance.html',
@@ -87,6 +121,10 @@ module Rack
87
121
  [301, {'Location' => interpreted_to, 'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))}.merge!(additional_headers), [redirect_message(interpreted_to)]]
88
122
  when :r302
89
123
  [302, {'Location' => interpreted_to, 'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))}.merge!(additional_headers), [redirect_message(interpreted_to)]]
124
+ when :r303
125
+ [303, {'Location' => interpreted_to, 'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))}.merge!(additional_headers), [redirect_message(interpreted_to)]]
126
+ when :r307
127
+ [307, {'Location' => interpreted_to, 'Content-Type' => Rack::Mime.mime_type(::File.extname(interpreted_to))}.merge!(additional_headers), [redirect_message(interpreted_to)]]
90
128
  when :rewrite
91
129
  # return [200, {}, {:content => env.inspect}]
92
130
  env['REQUEST_URI'] = interpreted_to
@@ -3,10 +3,10 @@ Gem::Specification.new do |s|
3
3
  s.version = File.read('VERSION')
4
4
 
5
5
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
- s.authors = ["John Trupiano"]
6
+ s.authors = ["Travis Jeffery", "John Trupiano"]
7
7
  s.date = Date.today.to_s
8
8
  s.description = %q{A rack middleware for enforcing rewrite rules. In many cases you can get away with rack-rewrite instead of writing Apache mod_rewrite rules.}
9
- s.email = %q{jtrupiano@gmail.com}
9
+ s.email = %q{travisjeffery@gmail.com}
10
10
  s.extra_rdoc_files = [
11
11
  "LICENSE",
12
12
  "History.rdoc",
@@ -43,9 +43,8 @@ Gem::Specification.new do |s|
43
43
  "test/rule_test.rb",
44
44
  "test/test_helper.rb"
45
45
  ]
46
- #s.add_dependency 'rack'
47
46
 
48
- s.add_development_dependency 'bundler', '~> 1.0.10'
47
+ s.add_development_dependency 'bundler'
49
48
  s.add_development_dependency 'shoulda', '~> 2.10.2'
50
49
  s.add_development_dependency 'mocha', '~> 0.9.7'
51
50
  s.add_development_dependency 'rack'
@@ -56,24 +56,28 @@ class RackRewriteTest < Test::Unit::TestCase
56
56
  should_not_halt
57
57
  end
58
58
 
59
- context 'when a 301 rule matches' do
60
- setup {
61
- @rack = Rack::Rewrite.new(@app) do
62
- r301 '/wiki/Yair_Flicker', '/yair'
63
- end
64
- }
65
- should_halt
66
- should_location_redirect_to('/yair', 301)
59
+ [301, 302, 303, 307].each do |status|
60
+ context "when a #{status} rule matches" do
61
+ setup {
62
+ @rack = Rack::Rewrite.new(@app) do
63
+ send("r#{status}", '/wiki/Yair_Flicker', '/yair')
64
+ end
65
+ }
66
+ should_halt
67
+ should_location_redirect_to('/yair', status)
68
+ end
67
69
  end
68
70
 
69
- context 'when a 302 rule matches' do
70
- setup {
71
- @rack = Rack::Rewrite.new(@app) do
72
- r302 '/wiki/Yair_Flicker', '/yair'
73
- end
74
- }
75
- should_halt
76
- should_location_redirect_to('/yair', 302)
71
+ [[:p, 301], [:moved_permanently, 301], [:found, 302], [:see_other, 303], [:t, 307], [:temporary_redirect, 307]].each do |rule|
72
+ context "when a #{rule.first} rule matches" do
73
+ setup {
74
+ @rack = Rack::Rewrite.new(@app) do
75
+ send(rule.first, '/wiki/Yair_Flicker', '/yair')
76
+ end
77
+ }
78
+ should_halt
79
+ should_location_redirect_to('/yair', rule.last)
80
+ end
77
81
  end
78
82
 
79
83
  context 'when a rewrite rule matches' do
@@ -34,16 +34,20 @@ class RuleTest < Test::Unit::TestCase
34
34
  end
35
35
 
36
36
  context '#Rule#apply' do
37
- should 'set Location header to result of #interpret_to for a 301' do
38
- rule = Rack::Rewrite::Rule.new(:r301, %r{/abc}, '/def')
39
- env = {'PATH_INFO' => '/abc'}
40
- assert_equal rule.send(:interpret_to, '/abc'), rule.apply!(env)[1]['Location']
37
+ supported_status_codes.each do |rule_type|
38
+ should "set Location header to result of #interpret_to for a #{rule_type}" do
39
+ rule = Rack::Rewrite::Rule.new(rule_type, %r{/abc}, '/def')
40
+ env = {'PATH_INFO' => '/abc'}
41
+ assert_equal rule.send(:interpret_to, '/abc'), rule.apply!(env)[1]['Location']
42
+ end
41
43
  end
42
44
 
43
- should 'include a link to the result of #interpret_to for a 301' do
44
- rule = Rack::Rewrite::Rule.new(:r301, %r{/abc}, '/def')
45
- env = {'PATH_INFO' => '/abc'}
46
- assert_match /\/def/, rule.apply!(env)[2][0]
45
+ supported_status_codes.each do |rule_type|
46
+ should "include a link to the result of #interpret_to for a #{rule_type}" do
47
+ rule = Rack::Rewrite::Rule.new(rule_type, %r{/abc}, '/def')
48
+ env = {'PATH_INFO' => '/abc'}
49
+ assert_match /\/def/, rule.apply!(env)[2][0]
50
+ end
47
51
  end
48
52
 
49
53
  should 'keep the QUERY_STRING when a 301 rule matches a URL with a querystring' do
@@ -71,7 +75,7 @@ class RuleTest < Test::Unit::TestCase
71
75
  end
72
76
 
73
77
  should 'set Content-Type header to text/html for a 301 and 302 request for a .html page' do
74
- [:r301, :r302].each do |rule_type|
78
+ supported_status_codes.each do |rule_type|
75
79
  rule = Rack::Rewrite::Rule.new(rule_type, %r{/abc}, '/def.html')
76
80
  env = {'PATH_INFO' => '/abc'}
77
81
  assert_equal 'text/html', rule.apply!(env)[1]['Content-Type']
@@ -79,7 +83,7 @@ class RuleTest < Test::Unit::TestCase
79
83
  end
80
84
 
81
85
  should 'set Content-Type header to text/css for a 301 and 302 request for a .css page' do
82
- [:r301, :r302].each do |rule_type|
86
+ supported_status_codes.each do |rule_type|
83
87
  rule = Rack::Rewrite::Rule.new(rule_type, %r{/abc}, '/def.css')
84
88
  env = {'PATH_INFO' => '/abc'}
85
89
  assert_equal 'text/css', rule.apply!(env)[1]['Content-Type']
@@ -7,3 +7,7 @@ require 'test/unit'
7
7
 
8
8
  class Test::Unit::TestCase
9
9
  end
10
+
11
+ def supported_status_codes
12
+ [:r301, :r302, :r303, :r307]
13
+ end
metadata CHANGED
@@ -1,31 +1,36 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-rewrite
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
+ - Travis Jeffery
8
9
  - John Trupiano
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2011-09-20 00:00:00.000000000 -05:00
13
- default_executable:
13
+ date: 2012-10-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
17
- requirement: &2153125460 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
- - - ~>
20
+ - - ! '>='
21
21
  - !ruby/object:Gem::Version
22
- version: 1.0.10
22
+ version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2153125460
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
26
31
  - !ruby/object:Gem::Dependency
27
32
  name: shoulda
28
- requirement: &2153125000 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ~>
@@ -33,10 +38,15 @@ dependencies:
33
38
  version: 2.10.2
34
39
  type: :development
35
40
  prerelease: false
36
- version_requirements: *2153125000
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 2.10.2
37
47
  - !ruby/object:Gem::Dependency
38
48
  name: mocha
39
- requirement: &2153148840 !ruby/object:Gem::Requirement
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  none: false
41
51
  requirements:
42
52
  - - ~>
@@ -44,10 +54,15 @@ dependencies:
44
54
  version: 0.9.7
45
55
  type: :development
46
56
  prerelease: false
47
- version_requirements: *2153148840
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 0.9.7
48
63
  - !ruby/object:Gem::Dependency
49
64
  name: rack
50
- requirement: &2153148460 !ruby/object:Gem::Requirement
65
+ requirement: !ruby/object:Gem::Requirement
51
66
  none: false
52
67
  requirements:
53
68
  - - ! '>='
@@ -55,10 +70,15 @@ dependencies:
55
70
  version: '0'
56
71
  type: :development
57
72
  prerelease: false
58
- version_requirements: *2153148460
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
59
79
  description: A rack middleware for enforcing rewrite rules. In many cases you can
60
80
  get away with rack-rewrite instead of writing Apache mod_rewrite rules.
61
- email: jtrupiano@gmail.com
81
+ email: travisjeffery@gmail.com
62
82
  executables: []
63
83
  extensions: []
64
84
  extra_rdoc_files:
@@ -82,7 +102,6 @@ files:
82
102
  - test/rack-rewrite_test.rb
83
103
  - test/rule_test.rb
84
104
  - test/test_helper.rb
85
- has_rdoc: true
86
105
  homepage: http://github.com/jtrupiano/rack-rewrite
87
106
  licenses: []
88
107
  post_install_message:
@@ -104,13 +123,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
123
  version: '0'
105
124
  requirements: []
106
125
  rubyforge_project: johntrupiano
107
- rubygems_version: 1.6.2
126
+ rubygems_version: 1.8.23
108
127
  signing_key:
109
128
  specification_version: 3
110
129
  summary: A rack middleware for enforcing rewrite rules
111
130
  test_files:
112
131
  - test/rack-rewrite_test.rb
113
132
  - test/geminstaller.yml
114
- - test/rack-rewrite_test.rb
115
133
  - test/rule_test.rb
116
134
  - test/test_helper.rb