rack_redirect 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/Gemfile +3 -0
- data/README.md +89 -0
- data/Rakefile +2 -0
- data/bin/setup +8 -0
- data/lib/rack/redirect.rb +58 -0
- data/lib/rack/redirect/version.rb +5 -0
- data/rack-redirect.gemspec +25 -0
- metadata +94 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a08ee00bb4eeb0b9263087dc3937a44dc634cf67
|
4
|
+
data.tar.gz: 4dd0f63bb894f92e324be6169464dc348fa7fb2f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 30e3f4ab86da97baaa0f1a301f4c49c0fda1525c30a451ea17b092db869b066bda58bc885822a55227e586a9a285eaa4f9c7642ecfdc4a40597a012755e0b297
|
7
|
+
data.tar.gz: 0d4e6a189bc43d13c635b896a44365a47b56ce1ef98ceab29ceed558f780bf95eb1cc3273024a77e40cf6f88f0103423070bfdba84dbd2724cafa5f9d320a05e
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# Rack::Redirect
|
2
|
+
|
3
|
+
Rack::Redirect, generic Rack redirect middleware.
|
4
|
+
|
5
|
+
By default to redirect requests based on path, but can be easily extended to match hostname, user-agent, or whatever might be available in the request.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'rack-redirect'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
### Rackup
|
22
|
+
|
23
|
+
Add to `config.ru`:
|
24
|
+
|
25
|
+
```rb
|
26
|
+
require 'rack/redirect'
|
27
|
+
use Rack::Redirect, {
|
28
|
+
'/some/path' => '/new/path',
|
29
|
+
%r{^/profiles}' => '/users'
|
30
|
+
}
|
31
|
+
|
32
|
+
use Rack::Redirect, {
|
33
|
+
'/home' => '/'
|
34
|
+
}, 301
|
35
|
+
```
|
36
|
+
|
37
|
+
### Rails
|
38
|
+
|
39
|
+
Add to `config/application.rb` (or any of the environment files):
|
40
|
+
|
41
|
+
```rb
|
42
|
+
config.middleware.insert_before 0, Rack::Redirect, {
|
43
|
+
'/some/path' => '/new/path',
|
44
|
+
%r{^/profiles}' => '/users'
|
45
|
+
}
|
46
|
+
|
47
|
+
config.middleware.insert_before 0, Rack::Redirect, {
|
48
|
+
'/home' => '/'
|
49
|
+
}, 301
|
50
|
+
|
51
|
+
```
|
52
|
+
|
53
|
+
## Extending
|
54
|
+
|
55
|
+
To extend the functionality for e.g. user-agent detection, it's as simple as:
|
56
|
+
|
57
|
+
```rb
|
58
|
+
class UserAgentRedirect < Rack::Redirect
|
59
|
+
def request_matches?(request, pattern)
|
60
|
+
request.user_agent =~ pattern
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
use UserAgentRedirect, {
|
65
|
+
/iP(hone|od)/ => '/mobile'
|
66
|
+
}
|
67
|
+
```
|
68
|
+
|
69
|
+
The pattern can actually be anything, so if you wan't use more variables in a single check, that's also possible:
|
70
|
+
|
71
|
+
```rb
|
72
|
+
class UserAgentAndPathRedirect < Rack::Redirect
|
73
|
+
def request_matches?(request, pattern)
|
74
|
+
request.user_agent =~ pattern[0] && request.path == pattern[1]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
use UserAgentAndPathRedirect, {
|
79
|
+
[/iP(hone|od)/, '/mobile'] => '/iphone'
|
80
|
+
}
|
81
|
+
```
|
82
|
+
|
83
|
+
## Development
|
84
|
+
|
85
|
+
After checking out the repo, run `bin/setup` to install dependencies.
|
86
|
+
|
87
|
+
## Contributing
|
88
|
+
|
89
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/koenpunt/rack-redirect.
|
data/Rakefile
ADDED
data/bin/setup
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require "rack"
|
2
|
+
require "rack/redirect/version"
|
3
|
+
|
4
|
+
module Rack
|
5
|
+
class Redirect
|
6
|
+
|
7
|
+
def initialize(app, pairs, status = 302)
|
8
|
+
@app = app
|
9
|
+
@pairs = pairs
|
10
|
+
@status = status
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
request = Rack::Request.new(env)
|
15
|
+
@pairs.each do |pattern, target|
|
16
|
+
next unless request_matches?(request, pattern)
|
17
|
+
uri = URI.parse(target)
|
18
|
+
target_params = parse_query(uri.query)
|
19
|
+
request_params = parse_query(request.query_string)
|
20
|
+
query = build_query(merge_params(request_params, target_params))
|
21
|
+
uri.query = query if query.present?
|
22
|
+
return [status, { 'Location' => uri.to_s }, ['']]
|
23
|
+
end
|
24
|
+
@app.call(env)
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def status
|
30
|
+
@status
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_query(query)
|
34
|
+
Rack::Utils.parse_nested_query(query)
|
35
|
+
end
|
36
|
+
|
37
|
+
def build_query(params)
|
38
|
+
Rack::Utils.build_nested_query(params)
|
39
|
+
end
|
40
|
+
|
41
|
+
def merge_params(request_params, target_params)
|
42
|
+
target_params.merge(request_params)
|
43
|
+
end
|
44
|
+
|
45
|
+
def request_matches?(request, pattern)
|
46
|
+
if pattern.is_a?(Regexp)
|
47
|
+
request.path =~ pattern
|
48
|
+
elsif pattern.is_a?(String)
|
49
|
+
request.path == pattern
|
50
|
+
elsif pattern.is_a?(Symbol)
|
51
|
+
request.path == pattern.to_s.downcase
|
52
|
+
else
|
53
|
+
false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rack/redirect/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "rack_redirect"
|
8
|
+
spec.version = Rack::Redirect::VERSION
|
9
|
+
spec.authors = ["Koen Punt"]
|
10
|
+
spec.email = ["koen@koenpunt.nl"]
|
11
|
+
|
12
|
+
spec.summary = %q{Generic Rack redirect middleware.}
|
13
|
+
spec.description = %q{Rack middleware to redirect requests based on path, but can be easily extended to match hostname, user-agent, or whatever might be available in the request.}
|
14
|
+
spec.homepage = "https://github.com/koenpunt/rack-redirect"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.bindir = "bin"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
|
24
|
+
spec.add_runtime_dependency "rack", "~> 1.4"
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rack_redirect
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Koen Punt
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rack
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.4'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.4'
|
55
|
+
description: Rack middleware to redirect requests based on path, but can be easily
|
56
|
+
extended to match hostname, user-agent, or whatever might be available in the request.
|
57
|
+
email:
|
58
|
+
- koen@koenpunt.nl
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- ".gitignore"
|
64
|
+
- Gemfile
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- bin/setup
|
68
|
+
- lib/rack/redirect.rb
|
69
|
+
- lib/rack/redirect/version.rb
|
70
|
+
- rack-redirect.gemspec
|
71
|
+
homepage: https://github.com/koenpunt/rack-redirect
|
72
|
+
licenses: []
|
73
|
+
metadata: {}
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
requirements: []
|
89
|
+
rubyforge_project:
|
90
|
+
rubygems_version: 2.4.5
|
91
|
+
signing_key:
|
92
|
+
specification_version: 4
|
93
|
+
summary: Generic Rack redirect middleware.
|
94
|
+
test_files: []
|