geo_redirect 0.7 → 0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f21f596f04cc22f8af21cd140c5e618c226a0f4
4
- data.tar.gz: 210880d4a407c0e7263c282d5c421a1a3661affb
3
+ metadata.gz: c58651ddf87594864c338eb864bf6261f3a95944
4
+ data.tar.gz: 87925e657c42ebb2fbff6b99d29cde408d70005e
5
5
  SHA512:
6
- metadata.gz: aaacd15e27321f27961ff90d82a6b9f7d637774d4f427aa67efe95b46a681c70ef28ae0ff06109d963e84b5335df9f551b4d89cd54954efb02bd006999d73b60
7
- data.tar.gz: bb5742370da7819f41579dcec891d52890dc9bbe0e7fdac7ab85c8e26d4153a9a76fa59258067a502c5f8357b72c509d9aa84da6298e3e656fbbd35eff13ec8d
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
- @request = Rack::Request.new(env)
23
+ request = Rack::Request.new(env)
24
+ url = URI.parse(request.url)
24
25
 
25
- if skip_redirect?
26
- remember_host(request_host) if @options[:remember_when_skipping]
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 = @request.session['geo_redirect']
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 = @request.session['geo_redirect']
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(request_url.query).key? 'redirect'
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?(request_url) ||
65
- path_not_whitelisted?(request_url) ||
66
- path_blacklisted?(request_url) ||
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
- !@include_paths.any? { |exclude| url.path == exclude }
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(@request)
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(request_url.host, true)
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
- @request.session['geo_redirect.country'] = country
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(@request.env)
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(@request.env)
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
- @request.session['geo_redirect'] = host
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
- @request.env['HTTP_X_FORWARDED_FOR'] || @request.env['REMOTE_ADDR']
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 request_url
192
- @request_url ||= URI.parse(@request.url)
194
+ def request_host(url)
195
+ host_by_hostname(url.host)
193
196
  end
194
197
 
195
- def request_host
196
- host_by_hostname(request_url.host)
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 = request_url.clone
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
- (@request.host =~ hostname_ends_with).nil?
229
+ (request.host =~ hostname_ends_with).nil?
231
230
  end
232
231
  end
233
232
  end
@@ -1,3 +1,3 @@
1
1
  module GeoRedirect
2
- VERSION = '0.7'.freeze
2
+ VERSION = '0.8'.freeze
3
3
  end
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.7'
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: 2016-03-02 00:00:00.000000000 Z
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.4.8
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: