geo_redirect 0.7 → 0.8
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 +4 -4
- data/README.md +1 -1
- data/lib/geo_redirect/middleware.rb +55 -56
- data/lib/geo_redirect/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c58651ddf87594864c338eb864bf6261f3a95944
|
4
|
+
data.tar.gz: 87925e657c42ebb2fbff6b99d29cde408d70005e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ee15d48c416bf22068a325c8e1c6d90d1f490f92673df68a2b5670de1edfdad7ff969f786e48c5d01807491a368c35eebb400d65ec0a57c8d223b0c8142d998
|
7
|
+
data.tar.gz: 7a2496a101a4c58700d89dac7542e29eb0d1baaa32cb2a9fd96bc194ab4635be13f1f8b822fbec77f8d66b0077121b49f364f688a83e418d57d90e5d8f829bb3
|
data/README.md
CHANGED
@@ -20,7 +20,7 @@ URL, and by that forcing the server to host from the current domain (and saving
|
|
20
20
|
that domain to the user's session variable).
|
21
21
|
|
22
22
|
To skip geo-redirection completely, pass a `?skip_geo=true` argument (this would
|
23
|
-
avoid saving any session value and/or HTTP redirects.
|
23
|
+
avoid saving any session value and/or HTTP redirects).
|
24
24
|
|
25
25
|
## Installation
|
26
26
|
|
@@ -20,51 +20,54 @@ module GeoRedirect
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def call(env)
|
23
|
-
|
23
|
+
request = Rack::Request.new(env)
|
24
|
+
url = URI.parse(request.url)
|
24
25
|
|
25
|
-
if skip_redirect?
|
26
|
-
|
26
|
+
if skip_redirect?(request, url)
|
27
|
+
if @options[:remember_when_skipping]
|
28
|
+
remember_host(request, request_host(url))
|
29
|
+
end
|
27
30
|
@app.call(env)
|
28
31
|
|
29
|
-
elsif force_redirect?
|
30
|
-
handle_force
|
32
|
+
elsif force_redirect?(url)
|
33
|
+
handle_force(request, url)
|
31
34
|
|
32
|
-
elsif session_exists?
|
33
|
-
handle_session
|
35
|
+
elsif session_exists?(request)
|
36
|
+
handle_session(request)
|
34
37
|
|
35
38
|
else
|
36
|
-
handle_geoip
|
39
|
+
handle_geoip(request)
|
37
40
|
end
|
38
41
|
end
|
39
42
|
|
40
|
-
def session_exists?
|
41
|
-
host =
|
43
|
+
def session_exists?(request)
|
44
|
+
host = request.session['geo_redirect']
|
42
45
|
host = host.to_sym if host && host.respond_to?(:to_sym)
|
43
46
|
if host && @config[host].nil? # Invalid var, remove it
|
44
47
|
log 'Invalid session var, forgetting'
|
45
|
-
forget_host(host)
|
48
|
+
forget_host(request, host)
|
46
49
|
host = nil
|
47
50
|
end
|
48
51
|
|
49
52
|
!host.nil?
|
50
53
|
end
|
51
54
|
|
52
|
-
def handle_session
|
53
|
-
host =
|
55
|
+
def handle_session(request)
|
56
|
+
host = request.session['geo_redirect']
|
54
57
|
host = host.is_a?(Symbol) ? host : host.to_sym if host
|
55
58
|
log "Handling session var: #{host}"
|
56
|
-
redirect_request(host)
|
59
|
+
redirect_request(request, host)
|
57
60
|
end
|
58
61
|
|
59
|
-
def force_redirect?
|
60
|
-
Rack::Utils.parse_query(
|
62
|
+
def force_redirect?(url)
|
63
|
+
Rack::Utils.parse_query(url.query).key? 'redirect'
|
61
64
|
end
|
62
65
|
|
63
|
-
def skip_redirect?
|
64
|
-
query_includes_skip_geo?(
|
65
|
-
path_not_whitelisted?(
|
66
|
-
path_blacklisted?(
|
67
|
-
skipped_by_block?
|
66
|
+
def skip_redirect?(request, url)
|
67
|
+
query_includes_skip_geo?(url) ||
|
68
|
+
path_not_whitelisted?(url) ||
|
69
|
+
path_blacklisted?(url) ||
|
70
|
+
skipped_by_block?(request)
|
68
71
|
end
|
69
72
|
|
70
73
|
def query_includes_skip_geo?(url)
|
@@ -73,51 +76,51 @@ module GeoRedirect
|
|
73
76
|
|
74
77
|
def path_not_whitelisted?(url)
|
75
78
|
!@include_paths.empty? &&
|
76
|
-
|
79
|
+
@include_paths.none? { |include| url.path == include }
|
77
80
|
end
|
78
81
|
|
79
82
|
def path_blacklisted?(url)
|
80
83
|
@exclude_paths.any? { |exclude| url.path == exclude }
|
81
84
|
end
|
82
85
|
|
83
|
-
def skipped_by_block?
|
84
|
-
@options[:skip_if] && @options[:skip_if].call(
|
86
|
+
def skipped_by_block?(request)
|
87
|
+
@options[:skip_if] && @options[:skip_if].call(request)
|
85
88
|
end
|
86
89
|
|
87
|
-
def handle_force
|
90
|
+
def handle_force(request, url)
|
88
91
|
log 'Handling force flag'
|
89
|
-
remember_host(request_host)
|
90
|
-
redirect_request(
|
92
|
+
remember_host(request, request_host(url))
|
93
|
+
redirect_request(request, url.host, true)
|
91
94
|
end
|
92
95
|
|
93
|
-
def handle_geoip
|
94
|
-
country = country_from_request rescue nil
|
95
|
-
|
96
|
-
log "GeoIP match: country code #{country}"
|
96
|
+
def handle_geoip(request)
|
97
|
+
country = country_from_request(request) rescue nil
|
98
|
+
request.session['geo_redirect.country'] = country
|
99
|
+
log "GeoIP match: country code #{country.inspect}"
|
97
100
|
|
98
101
|
if country.nil?
|
99
|
-
@app.call(
|
102
|
+
@app.call(request.env)
|
100
103
|
else
|
101
104
|
host = host_by_country(country) # desired host
|
102
105
|
log "GeoIP host match: #{host}"
|
103
|
-
remember_host(host)
|
106
|
+
remember_host(request, host)
|
104
107
|
|
105
|
-
redirect_request(host)
|
108
|
+
redirect_request(request, host)
|
106
109
|
end
|
107
110
|
end
|
108
111
|
|
109
|
-
def redirect_request(host = nil, same_host = false)
|
112
|
+
def redirect_request(request, host = nil, same_host = false)
|
110
113
|
hostname = hostname_by_host(host)
|
111
114
|
|
112
|
-
if should_redirect?(hostname, same_host)
|
113
|
-
url = redirect_url(hostname)
|
115
|
+
if should_redirect?(request, hostname, same_host)
|
116
|
+
url = redirect_url(request, hostname)
|
114
117
|
|
115
118
|
log "Redirecting to #{url}"
|
116
119
|
[301,
|
117
120
|
{ 'Location' => url.to_s, 'Content-Type' => 'text/plain' },
|
118
121
|
['Moved Permanently\n']]
|
119
122
|
else
|
120
|
-
@app.call(
|
123
|
+
@app.call(request.env)
|
121
124
|
end
|
122
125
|
end
|
123
126
|
|
@@ -135,14 +138,14 @@ module GeoRedirect
|
|
135
138
|
host.is_a?(Symbol) ? @config[host][:host] : host
|
136
139
|
end
|
137
140
|
|
138
|
-
def remember_host(host)
|
141
|
+
def remember_host(request, host)
|
139
142
|
log "Remembering: #{host}"
|
140
|
-
|
143
|
+
request.session['geo_redirect'] = host
|
141
144
|
end
|
142
145
|
|
143
|
-
def forget_host(host)
|
146
|
+
def forget_host(request, host)
|
144
147
|
log "Forgetting: #{host}"
|
145
|
-
remember_host(nil)
|
148
|
+
remember_host(request, nil)
|
146
149
|
end
|
147
150
|
|
148
151
|
protected
|
@@ -181,23 +184,19 @@ module GeoRedirect
|
|
181
184
|
log(message, :error)
|
182
185
|
end
|
183
186
|
|
184
|
-
def request_ip
|
187
|
+
def request_ip(request)
|
185
188
|
ip_address =
|
186
|
-
|
189
|
+
request.env['HTTP_X_FORWARDED_FOR'] || request.env['REMOTE_ADDR']
|
187
190
|
# take only the first given ip
|
188
191
|
ip_address.split(',').first.strip
|
189
192
|
end
|
190
193
|
|
191
|
-
def
|
192
|
-
|
194
|
+
def request_host(url)
|
195
|
+
host_by_hostname(url.host)
|
193
196
|
end
|
194
197
|
|
195
|
-
def
|
196
|
-
|
197
|
-
end
|
198
|
-
|
199
|
-
def country_from_request
|
200
|
-
ip = request_ip
|
198
|
+
def country_from_request(request)
|
199
|
+
ip = request_ip(request)
|
201
200
|
log "Handling GeoIP lookup: IP #{ip}"
|
202
201
|
|
203
202
|
country = @db.country(ip)
|
@@ -206,8 +205,8 @@ module GeoRedirect
|
|
206
205
|
country[:country_code2] unless code.nil? || code.zero?
|
207
206
|
end
|
208
207
|
|
209
|
-
def redirect_url(hostname)
|
210
|
-
url =
|
208
|
+
def redirect_url(request, hostname)
|
209
|
+
url = URI.parse(request.url)
|
211
210
|
url.port = nil
|
212
211
|
url.host = hostname if hostname
|
213
212
|
|
@@ -223,11 +222,11 @@ module GeoRedirect
|
|
223
222
|
url
|
224
223
|
end
|
225
224
|
|
226
|
-
def should_redirect?(hostname, same_host)
|
225
|
+
def should_redirect?(request, hostname, same_host)
|
227
226
|
return true if hostname.nil? || same_host
|
228
227
|
|
229
228
|
hostname_ends_with = %r{#{hostname.tr('.', '\.')}$}
|
230
|
-
(
|
229
|
+
(request.host =~ hostname_ends_with).nil?
|
231
230
|
end
|
232
231
|
end
|
233
232
|
end
|
data/lib/geo_redirect/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geo_redirect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.8'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sagie Maoz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -170,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
170
170
|
version: '0'
|
171
171
|
requirements: []
|
172
172
|
rubyforge_project:
|
173
|
-
rubygems_version: 2.
|
173
|
+
rubygems_version: 2.5.1
|
174
174
|
signing_key:
|
175
175
|
specification_version: 4
|
176
176
|
summary: Rack middleware to redirect clients to hostnames based on geo-location
|
@@ -183,4 +183,3 @@ test_files:
|
|
183
183
|
- spec/spec_helper.rb
|
184
184
|
- spec/support/geo_redirect.rb
|
185
185
|
- spec/support/rake.rb
|
186
|
-
has_rdoc:
|