geo_redirect 0.5.1 → 0.6
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 +18 -12
- data/lib/geo_redirect/middleware.rb +17 -12
- data/lib/geo_redirect/version.rb +1 -1
- data/spec/lib/geo_redirect/middleware_spec.rb +79 -29
- metadata +25 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb2df8b52f6869e6ed852973fa5774550c54f76c
|
4
|
+
data.tar.gz: b7e9c851cc2a67003efec2d8705eafc227176633
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a654e3b640ef5c8eae208f5908e4c638816f933f42c31137b1c0c4c4a0108100282b72506d16c5f413354898c2323520cf2e5d2f54d25c8347b6bd540045e9b
|
7
|
+
data.tar.gz: 4ded31b14b6aa4c474a26f632af865bc7ec61ee75030aad98b6c0b39ef89d6321e8718e962bbdf61b88d2abaa9ec07c3b3a51c0a027c582608ab9c98301e4972
|
data/README.md
CHANGED
@@ -90,21 +90,27 @@ and unzip it into `db/` in your project, **or** you could use the following
|
|
90
90
|
It'd be a good idea to use this task on your (Capistrano or whatever) deployment
|
91
91
|
scripts.
|
92
92
|
|
93
|
-
###
|
93
|
+
### Scoping redirects for certain URLs
|
94
94
|
|
95
|
-
|
96
|
-
|
97
|
-
|
95
|
+
By default, GeoRedirect runs on *all* incoming requests and redirects
|
96
|
+
accordingly.
|
97
|
+
|
98
|
+
You may want GeoRedirect to either ignore some URLs (a blacklist), or only run
|
99
|
+
the redirection logic over a certain list of URLs (a whitelist). This can be
|
100
|
+
done through the `:exclude` and `:include` options.
|
101
|
+
|
102
|
+
Rails.application.middleware.use GeoRedirect::Middleware, include: '/'
|
103
|
+
|
104
|
+
will only redirect incoming requests to 'example.org/', and ignore any other
|
105
|
+
paths.
|
98
106
|
|
99
107
|
Rails.application.middleware.use GeoRedirect::Middleware, exclude: '/excluded_path'
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
will match `www.myapp.com/exclude` but not `www.myapp.com/other/path/exclude`
|
108
|
+
|
109
|
+
will ignore requests to 'example.org/excluded_path' but redirect all other
|
110
|
+
incoming requests.
|
111
|
+
|
112
|
+
The value for both options can be either a single path string or an array of
|
113
|
+
paths. All should include the leading slash.
|
108
114
|
|
109
115
|
### Custom paths
|
110
116
|
|
@@ -6,16 +6,14 @@ module GeoRedirect
|
|
6
6
|
attr_accessor :db, :config
|
7
7
|
|
8
8
|
def initialize(app, options = {})
|
9
|
-
# Some defaults
|
10
|
-
options[:db] ||= DEFAULT_DB_PATH
|
11
|
-
options[:config] ||= DEFAULT_CONFIG_PATH
|
12
|
-
|
13
9
|
@app = app
|
14
10
|
|
15
|
-
@logger
|
16
|
-
@db
|
17
|
-
@config
|
18
|
-
|
11
|
+
@logger = init_logger(options[:logfile])
|
12
|
+
@db = init_db(options[:db] || DEFAULT_DB_PATH)
|
13
|
+
@config = init_config(options[:config] || DEFAULT_CONFIG_PATH)
|
14
|
+
|
15
|
+
@include_paths = Array(options[:include])
|
16
|
+
@exclude_paths = Array(options[:exclude])
|
19
17
|
|
20
18
|
log 'Initialized middleware'
|
21
19
|
end
|
@@ -63,15 +61,22 @@ module GeoRedirect
|
|
63
61
|
|
64
62
|
def skip_redirect?
|
65
63
|
url = URI.parse(@request.url)
|
66
|
-
query_includes_skip_geo?(url) ||
|
64
|
+
query_includes_skip_geo?(url) ||
|
65
|
+
path_not_whitelisted?(url) ||
|
66
|
+
path_blacklisted?(url)
|
67
67
|
end
|
68
68
|
|
69
69
|
def query_includes_skip_geo?(url)
|
70
70
|
Rack::Utils.parse_query(url.query).key? 'skip_geo'
|
71
71
|
end
|
72
72
|
|
73
|
-
def
|
74
|
-
@
|
73
|
+
def path_not_whitelisted?(url)
|
74
|
+
@include_paths.length > 0 &&
|
75
|
+
!@include_paths.any? { |exclude| url.path == exclude }
|
76
|
+
end
|
77
|
+
|
78
|
+
def path_blacklisted?(url)
|
79
|
+
@exclude_paths.any? { |exclude| url.path == exclude }
|
75
80
|
end
|
76
81
|
|
77
82
|
def handle_force
|
@@ -144,7 +149,7 @@ module GeoRedirect
|
|
144
149
|
end
|
145
150
|
|
146
151
|
def init_logger(path)
|
147
|
-
Logger.new(path)
|
152
|
+
Logger.new(path) if path
|
148
153
|
rescue Errno::EINVAL, Errno::EACCES
|
149
154
|
nil
|
150
155
|
end
|
data/lib/geo_redirect/version.rb
CHANGED
@@ -50,7 +50,7 @@ describe GeoRedirect::Middleware do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
describe '#log' do
|
53
|
-
|
53
|
+
context 'with valid logfile path' do
|
54
54
|
before { mock_app }
|
55
55
|
|
56
56
|
it 'initiates a log file' do
|
@@ -68,6 +68,11 @@ describe GeoRedirect::Middleware do
|
|
68
68
|
mock_app logfile: '/no_such_file'
|
69
69
|
expect(@app.instance_variable_get(:"@logger")).to be_nil
|
70
70
|
end
|
71
|
+
|
72
|
+
it 'ignores empty logfile option' do
|
73
|
+
mock_app logfile: nil
|
74
|
+
expect(@app.instance_variable_get(:"@logger")).to be_nil
|
75
|
+
end
|
71
76
|
end
|
72
77
|
|
73
78
|
describe '#host_by_country' do
|
@@ -157,22 +162,22 @@ describe GeoRedirect::Middleware do
|
|
157
162
|
end
|
158
163
|
end
|
159
164
|
|
160
|
-
|
161
|
-
|
165
|
+
context 'without session memory' do
|
166
|
+
context 'for a foreign source' do
|
162
167
|
let(:country_code) { 'US' }
|
163
168
|
it { is_expected.to redirect_to :us }
|
164
169
|
it { is_expected.to remember :us }
|
165
170
|
it { is_expected.to remember_country 'US' }
|
166
171
|
end
|
167
172
|
|
168
|
-
|
173
|
+
context 'for a local source' do
|
169
174
|
let(:country_code) { 'IL' }
|
170
175
|
it { is_expected.to not_redirect }
|
171
176
|
it { is_expected.to remember :il }
|
172
177
|
it { is_expected.to remember_country 'IL' }
|
173
178
|
end
|
174
179
|
|
175
|
-
|
180
|
+
context 'for an unknown source' do
|
176
181
|
let(:country_code) { 'SOMEWHERE OVER THE RAINBOW' }
|
177
182
|
it { is_expected.to redirect_to :default }
|
178
183
|
it { is_expected.to remember :default }
|
@@ -180,7 +185,7 @@ describe GeoRedirect::Middleware do
|
|
180
185
|
end
|
181
186
|
end
|
182
187
|
|
183
|
-
|
188
|
+
context 'with valid session memory' do
|
184
189
|
let(:request_session) { :default }
|
185
190
|
let(:country_code) { 'US' }
|
186
191
|
it { is_expected.to redirect_to :default }
|
@@ -188,7 +193,7 @@ describe GeoRedirect::Middleware do
|
|
188
193
|
it { is_expected.to remember_country 'US' }
|
189
194
|
end
|
190
195
|
|
191
|
-
|
196
|
+
context 'with invalid session memory' do
|
192
197
|
let(:request_session) { 'foo' }
|
193
198
|
let(:country_code) { 'US' }
|
194
199
|
|
@@ -201,7 +206,7 @@ describe GeoRedirect::Middleware do
|
|
201
206
|
it { is_expected.to remember_country 'US' }
|
202
207
|
end
|
203
208
|
|
204
|
-
|
209
|
+
context 'with forced redirect flag' do
|
205
210
|
let(:country_code) { 'US' }
|
206
211
|
let(:request_args) { { redirect: 1 } }
|
207
212
|
|
@@ -214,7 +219,7 @@ describe GeoRedirect::Middleware do
|
|
214
219
|
it { is_expected.to remember_country nil }
|
215
220
|
end
|
216
221
|
|
217
|
-
|
222
|
+
context 'with skip flag' do
|
218
223
|
let(:country_code) { 'US' }
|
219
224
|
let(:request_args) { { skip_geo: true } }
|
220
225
|
it { is_expected.to not_redirect }
|
@@ -222,45 +227,90 @@ describe GeoRedirect::Middleware do
|
|
222
227
|
it { is_expected.to remember_country nil }
|
223
228
|
end
|
224
229
|
|
225
|
-
|
230
|
+
context 'with no recognizable IP' do
|
226
231
|
let(:country_code) { nil }
|
227
232
|
it { is_expected.to not_redirect }
|
228
233
|
it { is_expected.to remember nil }
|
229
234
|
it { is_expected.to remember_country nil }
|
230
235
|
end
|
231
236
|
|
232
|
-
describe '
|
233
|
-
let(:
|
234
|
-
|
235
|
-
context 'when the request URL matches one of the excluded paths' do
|
236
|
-
let(:country_code) { 'US' }
|
237
|
-
let(:request_path) { '/exclude_me?query_param=value' }
|
237
|
+
describe 'include/exclude logic' do
|
238
|
+
let(:country_code) { 'US' }
|
238
239
|
|
240
|
+
shared_examples :skips_redirect do
|
239
241
|
it { is_expected.to not_redirect }
|
240
242
|
it { is_expected.to remember nil }
|
241
243
|
it { is_expected.to remember_country nil }
|
242
244
|
end
|
243
245
|
|
244
|
-
|
245
|
-
let(:country_code) { 'US' }
|
246
|
-
let(:request_path) { '/dont_exclude_me?query_param=value' }
|
247
|
-
|
246
|
+
shared_examples :does_not_skip_redirect do
|
248
247
|
it { is_expected.to redirect_to :us }
|
249
248
|
it { is_expected.to remember :us }
|
250
249
|
it { is_expected.to remember_country 'US' }
|
251
250
|
end
|
252
|
-
end
|
253
251
|
|
254
|
-
|
255
|
-
|
252
|
+
context 'with an include option' do
|
253
|
+
let(:app_options) { { include: include_value } }
|
256
254
|
|
257
|
-
|
258
|
-
|
259
|
-
let(:request_path) { '/exclude_me?query_param=value' }
|
255
|
+
context 'when include is an array of paths' do
|
256
|
+
let(:include_value) { %w(/include_me /include_me/too) }
|
260
257
|
|
261
|
-
|
262
|
-
|
263
|
-
|
258
|
+
context 'when request URL matches one of the included paths' do
|
259
|
+
let(:request_path) { '/include_me?query_param=value' }
|
260
|
+
it_behaves_like :does_not_skip_redirect
|
261
|
+
end
|
262
|
+
|
263
|
+
context 'when request URL does not match any of the included paths' do
|
264
|
+
let(:request_path) { '/dont_include_me?query_param=value' }
|
265
|
+
it_behaves_like :skips_redirect
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
context 'when include is a single path' do
|
270
|
+
let(:include_value) { '/include_me' }
|
271
|
+
|
272
|
+
context 'when request URL matches one of the included paths' do
|
273
|
+
let(:request_path) { '/include_me?query_param=value' }
|
274
|
+
it_behaves_like :does_not_skip_redirect
|
275
|
+
end
|
276
|
+
|
277
|
+
context 'when request URL does not match any of the included paths' do
|
278
|
+
let(:request_path) { '/dont_include_me?query_param=value' }
|
279
|
+
it_behaves_like :skips_redirect
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
context 'with an exclude option' do
|
285
|
+
let(:app_options) { { exclude: exclude_value } }
|
286
|
+
|
287
|
+
context 'when exclude is an array of paths' do
|
288
|
+
let(:exclude_value) { %w(/exclude_me /exclude_me/too) }
|
289
|
+
|
290
|
+
context 'when request URL matches one of the excluded paths' do
|
291
|
+
let(:request_path) { '/exclude_me?query_param=value' }
|
292
|
+
it_behaves_like :skips_redirect
|
293
|
+
end
|
294
|
+
|
295
|
+
context 'when request URL does not match any of the excluded paths' do
|
296
|
+
let(:request_path) { '/dont_exclude_me?query_param=value' }
|
297
|
+
it_behaves_like :does_not_skip_redirect
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
context 'when exclude is a single path' do
|
302
|
+
let(:exclude_value) { '/exclude_me' }
|
303
|
+
|
304
|
+
context 'when request URL matches the excluded path' do
|
305
|
+
let(:request_path) { '/exclude_me?query_param=value' }
|
306
|
+
it_behaves_like :skips_redirect
|
307
|
+
end
|
308
|
+
|
309
|
+
context 'when request URL does not match any of the excluded paths' do
|
310
|
+
let(:request_path) { '/dont_exclude_me?query_param=value' }
|
311
|
+
it_behaves_like :does_not_skip_redirect
|
312
|
+
end
|
313
|
+
end
|
264
314
|
end
|
265
315
|
end
|
266
316
|
end
|
metadata
CHANGED
@@ -1,125 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geo_redirect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.6'
|
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: 2016-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: geoip
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 3.1.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 3.1.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rack
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 1.6.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 1.6.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rack-test
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: 0.6.3
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.6.3
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: simplecov
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: 0.9.1
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ~>
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 0.9.1
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rubocop
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ~>
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: 0.33.0
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 0.33.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rubocop-rspec
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: 1.3.0
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ~>
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 1.3.0
|
125
125
|
description: Geo-location based redirector
|
@@ -129,10 +129,10 @@ executables: []
|
|
129
129
|
extensions: []
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
|
-
-
|
133
|
-
-
|
134
|
-
-
|
135
|
-
-
|
132
|
+
- .gitignore
|
133
|
+
- .rspec
|
134
|
+
- .rubocop.yml
|
135
|
+
- .travis.yml
|
136
136
|
- Gemfile
|
137
137
|
- LICENSE.txt
|
138
138
|
- README.md
|
@@ -160,17 +160,17 @@ require_paths:
|
|
160
160
|
- lib
|
161
161
|
required_ruby_version: !ruby/object:Gem::Requirement
|
162
162
|
requirements:
|
163
|
-
- -
|
163
|
+
- - '>='
|
164
164
|
- !ruby/object:Gem::Version
|
165
165
|
version: '0'
|
166
166
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
167
|
requirements:
|
168
|
-
- -
|
168
|
+
- - '>='
|
169
169
|
- !ruby/object:Gem::Version
|
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:
|